using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Threading;
namespace Downloader
{
class Program
{
static void Main(string[] args)
{
string[] lines = File.ReadAllLines("E:/ backup/list.txt");
foreach (string entry in lines)
{
string savePath = $"E:/backup/{entry.Replace("/", "_")}/";
try
{
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
Console.WriteLine("[작업시작] 대상주소: {0}", entry);
for(int i = 0;i < 1000;i++)
//Parallel.For(0, 1001, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, (i) =>
{
try
{
string fullUrl = $"{entry}{i:0000}.txt";
string fileName = $"{i:0000}.txt";
using (WebClient wc = new WebClient())
{
wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36");
wc.DownloadFile(fullUrl, Path.Combine(savePath, fileName));
}
}
catch (Exception ex)
{
Console.WriteLine("[오류] {0}", ex.Message);
i--;
Thread.Sleep(3000);
}
}//);
}
catch (Exception ex)
{
Console.WriteLine("[오류] {0}", ex.Message);
}
}
Console.WriteLine("작업 완료");
}
}
}
c# 코드입니다
텍스트문서에
a.com/1/
a.com/2/
a.com/3/
b.com/1/
b.com/2/
b.com/3/
이렇게 있다면 a.com_1 폴더 생성후 하위에 0000.txt ~ 1000.txt 로 다운받습니다
Parallel 으로 멀티스레딩 동시에 10개 다운로드하구요, MaxDegreeOfParallelism 를 조절하시면 동시에 병렬작업하실 스레드 갯수를 지정하시면됩니다
하시려는 작업을 상세히 알려주시면 c# 으로 컴파일해서 만들어 드릴수도 있습니다~
한번 실행해보겠습니다 감사합니다
1. 병렬로 실행해보니까 공격으로 인식하고 차단해버리네요. 이건 차치하고..
2. 도중에 디스커넥션이 되었을때 프로그램이 꺼지는거.. 한 10초~20초있다 중단된 부분부터 재시작되면 좋겠는데..
이정도가 문제네요. 하려는 작업은 사실 텍스트가 아니라 .ts 스트리밍파일 조각을 긁어보는 건데, 마음처럼 쉽진않네요
주소는 형식은 https://주소/주소/0000.ts ~ https://주소/주소/1000.ts 까지입니다.
병렬부분은 제외하고서라도 중단되면 해당 부분 부터 시간을 준 후 다시시작. 이런거만 가능하고.. 컴파일이 되시는지요??
제 시스템에선 이상하게 컴파일이 안되네요 ..
10년이 넘었지만 코드 쓸줄은 몰라도 읽을줄은 알아서 큰 틀만 있어도 괜찮을 것 같습니다.
첨부파일에 비쥬얼스튜디오 솔루션파일 첨부했습니다. 빌드폴더보시면 컴파일된 exe파일도 포함되어잇을거구요
혹시몰라도 User-Agnet는 크롬과 같은것으로 지정해두었습니다
string[] lines = File.ReadAllLines("E:/ backup/list.txt");
foreach (string entry in lines)
{
string savePath = $"E:/backup/{entry.Replace("/", "_")}/";
이 부분 문제였네요.
각 줄을 entry로 받는과정에서, 주소가 entry로 받게되어있어 일부 문자가 폴더명으로 지정되지 못하는 것 같은데,
아예 첫번째 줄은 1번폴더.. 두번째 줄은 2폴더
이런식으로 폴더이름을 배열순서로 바꿀수 있을까요?
linenum++;
string savePath = $"E:/backup/{linenum}/";
추가해서 해결했습니다..
코드를 읽을 순 있겠는데 C#은 어깨넘어배운데다가.. 다시 수정하려니 문제가 생깁니다.
catch (Exception ex)
이 부분을 조금 수정했으면 좋겠는데. 기존 커넥션을 공격으로 간주할경우 슬리프를 유지후 재시도는 유지하면서.
0000.ts를 다운로드 시작해서,
0100.ts까지 정상적으로 다운로드 한 이후
0101.ts 파일이 없어서 404를 반환시
404에러 인식이후는 반복을 탈출해서 다음 줄
0000.ts 부터 다운로드 시작
이러는게 가능할지요? 일단 sleep은 잘 작동하는 듯 합니다..
해당 Http 프로토콜의 오류 Response가 404 (페이지없음)의 경우 해당 반복문을 Break;하게 처리해주면될듯합니다
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
HttpWebResponse response = ex.Response as HttpWebResponse;
if (response != null)
{
if ((int)response.StatusCode == 404) // Not Found
{
break;
}
}
}
}
exception부분에 i--를 뺀다음에 i++로 바꿔서 계속진행하게하고 로그를따로뽑아서 재시도하게끔짰네요.
(int)response.StatusCode 로 했더니 계속 에러가떠서..
새해 복 많이받으시고 다시한번 감사합니다. 작업 다 끝냈네요 ㅎㅎ