본문 바로가기
life.hack

C# 웹크롤러(Web Crawler) : 색칠놀이 도안

by 조브 2020. 6. 12.

 

실행파일은 맨 아래에 있습니다.



여느 보통의 아이들처럼 저희 딸도 색칠놀이를 좋아하는데, 때로는 책으로 사거나, 때로는 구글링 하여 프린트 해주곤 합니다.

따님이 이번에는 'EQ의 천재들'이라는 책에 나오는 무슨무슨 씨, 무슨무슨 양 하는 캐릭터 색칠이 하고 싶습니다.

이렇게 생긴 친구들입니다.



그래서 구글링 하여 아래 사이트를 찾았습니다.

 

http://www.coloring-book.info/coloring/

 

 

Coloring pages - Coloring Book

 

www.coloring-book.info

 

 

'EQ의 천재들'은 영어로 Mr. Men이라고 하는군요. 그 외에도 알라딘, 앵그리버드, 미녀와 야수, 어벤저스, 미키마우스, 레이디 버그, 포켓몬, 뽀로로, 랄프, 폴리, 소피아, 주토피아 등등 정말 많은 캐릭터들이 있습니다. 보물 창고 같습니다.


하지만 이 사이트 사진을 하나씩 받기는 쉬운데, 전체 다 다운로드하기는 어렵습니다. 크롬 브라우저의 Image downloader로도 썸네일 까지만 다운로드할 수 있습니다.

 

 

하나씩 받는 건 성에 안차고, 통째로 다 받고 싶습니다.


c# 웹 크롤러 2편으로 편하게 한 번에 다운로드하는 프로그램을 만들어 봅니다.





크롬의 개발도구로 해당 사이트 구조를 파악해 줍니다. 

 

크롬 개발자 도구를 사용하는 법은 아래 포스트를 참조해주세요.

 

https://dream-hacker.tistory.com/26

 

C# 웹크롤러(Web Crawler) 만들기 : 10000img.com 이미지 다운로더

10000img.com 이미지 다운로더 는 맨 아래에 있습니다. 10000img.com이라는 사이트를 아시나요? 접속할 때마다 랜덤의 사진을 보여주는 사이트입니다만, '백문이 불여일건'이라고 한 번 접속해 보시죠.

dream-hacker.tistory.com

 

 

찾아야 할 주소 형식이 3개입니다. 맨 처음 전체 캐릭터 이미지 선택 주소와 개별 캐릭터 하위 주소, 그리고 하위 주소의 하위 주소인 실제 다운로드할 이미지 주소로 구성되어 있습니다.

 



윈폼 프로젝트를 하나 만들고 디자이너로 아래와 같이 디자인합니다.

 

listBox는 전체 캐릭터 이름을 표시하고 , button은 다운로드 및 취소, 선택한 이미지를 보여주기 위해 pictureBox도 하나 넣어줍니다. 또 상태 표시를 위해 richTextBox 도 넣었습니다.







WebClient로 요청 시 System.Net.WebException:  '원격 서버에서 (403) 사용할 수 없음 오류를 반환했습니다.'라는에러를 띄웁니다. 어라? 하고 웹브라우저로 접속하니 잘 됩니다. 혹시나 해서 HttpWebRequest 클래스로 바꾸어도 안됩니다.

 

 

 

 

 

어찌 된 영문인지 이리저리 검색을 해보니 http header 문제인 것 같습니다. 아래와 같이 header에 user agent를 넣어줍니다. 

 

request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36";

 

 

이번에는 System.Net.WebException:  '자동 리디렉션을 너무 많이 시도했습니다.'라는 에러를 띄웁니다...

 

 

 



원인을 몰라 엄청 헤매다, 혹시 쿠키 문제가 아닌가 해서 아래와 같이 넣어줍니다. 잘 됩니다.

 

request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36";
request.CookieContainer = new CookieContainer();




다음은 하던 대로 정규표현식으로 필요한 부분만 가져옵니다. 

 

전체 캐릭터 주소 -> 캐릭터 하위 주소 -> 이미지 주소를 가져왔습니다. 

 

(지금 포스팅하면서 보니깐 바로 2 단계만에 가져올 수도 있네요... 다시 하기 귀찮아 그냥 합니다.)

 

주요 코드는 아래와 같습니다

foreach (string subfileUrl in subImageList)
{
    request = (HttpWebRequest)WebRequest.Create(subfileUrl);
    request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36";
    request.CookieContainer = new CookieContainer();

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            string html = reader.ReadToEnd();
            Regex regex = new Regex("<img src=\"(?<file>.*)\" alt.*class=\"print\">");
            MatchCollection matches = regex.Matches(html);
            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                {
                    if (match.Success)
                    {
                        subsubImageList.Add(match.Groups["file"].ToString());

                        DisplayResult(match.Groups["file"] + Environment.NewLine);
                    }

                    if (cancellation.Token.IsCancellationRequested)
                    {
                        break;
                    }
                }
            }
        }
    }

    if (cancellation.Token.IsCancellationRequested)
    {
        break;
    }
}


전체 코드는 아래 첨부한 프로젝트 파일을 봐주세요.

 

coloring-book.zip
0.09MB



음음 완성입니다. 

 

 

 

 

다 받는 데 꽤나 시간이 걸리네요. 

 


이번 주말엔 아이들과 재미있는 색칠 놀이를 해야겠습니다.

 

 



실행파일을 첨부합니다. 압축을 풀어서 사용하시면 됩니다.

 

coloring-book.exe.zip
0.01MB







 

댓글