본문 바로가기
life.hack

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

by 조브 2020. 6. 4.

 

10000img.com 이미지 다운로더 는 맨 아래에 있습니다.

 

 


 

 

 

10000img.com

 

 

10000img.com이라는 사이트를 아시나요? 접속할 때마다 랜덤의 사진을 보여주는 사이트입니다만, '백문이 불여일건'이라고 한 번 접속해 보시죠. ( 때때로 계신 곳에 따라 적적하지 못한 사진들을 보여줄 수도 있으므로, 바로 끄실 준비를 하시고요. 후방주의 )

 

 

 

 

 

http://10000img.com/

 

10000IMG.COM - Random Pics

 

10000img.com

 

 

 

한 번 접속하면 계속해서 새로고침 버튼을 누르게 되는 마법 같은 사이트의 사진들을 다운받고 싶어 집니다. 그것도 자동으로.

 

 

 

 

C#을 이용하여 10000img.com사진을 자동으로 다운받는 웹크롤러를 만들어 봅니다. (프로그램만 필요하신 분은 맨 아래로 이동해 주세요)

 

 

 

 

우선 크롬 브라우저로 10000img.com에 접속합니다. Ctrl + Shift + I를 눌러 개발자 도구를 열어줍니다. ( 우측 상단 ... > 도구 더보기 > 개발자 도구 로도 접근 가능합니다.)

 

 

 

Elements 탭에서 이미지가 나오는 프레임의 주소  "http://10000img.com/ran.php"를 확인합니다. 

 

 

 

 

 

 

다음으로 NetWork 탭에서 실제 이미지 주소의 형식을 확인합니다. "http://10000img.com/rimg/aid01.jpg" 로 되어 있습니다.

 

 

 

 

 

 

 

 

 

비주얼 스튜디오를 열어, Windows Forms 앱(.Net Framework) 프로젝트를 생성합니다. 그런 다음 아래와 같이 디자이너를 이용해서 간단하게 디자인합니다.

 

 

 

 

 

주요 코드는 아래와 같습니다. (전체 코드 및 프로젝트 파일, 그리고 프로그램 실행파일 아래에 있습니다. 전체 코드나 실행파일이 필요하신 분은 건너뛰세요)

 


WebClient 인스턴스를 생성하고, url("http://10000img.com/ran.php")로 부터 String srt을 다운로드 받습니다.

WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
string str = webClient.DownloadString(url);  //url="http://10000img.com/ran.php"

 

 

비주얼 스튜디오에서 str값을 확인해 보면 (1. 디버깅 모드로 브레이크 포인트 설정, 2. str을 조사식 추가, 3. 텍스트 시각화 도우미로 보기 )

 

 

 

 

위와 같이 가지고 와야 할 주소가 보입니다. (위에서는 http://10000img.com/view/rimg3/xmi21.jpg 과 같은 이미지 주소) 

아까 크롬에서 본 실제 이미지 주소와 다르게 view라는 주소가 추가되어있습니다. 나중에 지워줍니다.

 

 

 

 

해당 주소를 문자열에서 가져오기 위해 정규표현식을 사용합니다. C#에서는 Regex를 사용하면 됩니다. 

(정규표현식은 프로그램마다 조금씩 다르지만, 알고 계시면 정말 편리합니다. 여기서 모두 설명드릴 수 없어서 한번 검색해 보시거나, 따로 포스트 하도록 하겠습니다.)

 

//예제
//<a href="http://10000img.com/view/rimg1/hif20.jpg" target="_blank"  >
var match = Regex.Match(str, "\"(http://10000.*/(.*))\" target");

string imageUrl = match.Groups[1].Value;   //http://10000img.com/view/rimg3/xmi21.jpg
string fileName = match.Groups[2].Value;   //xmi21.jpg

//주소에서 view를 삭제
imageUrl = imageUrl.Replace("/view", "");  //http://10000img.com/rimg3/xmi21.jpg

 

정규표현식의 조건식을 "\"(http://10000.*/(.*))\" target" 으로 했습니다. (더 클리어한 방법이 있겠지만, 패스합니다)

 

원하는 값 파싱을 위해 match group을 사용하였습니다. 위의 정규표현식의 조건식에서 괄호로 묶은 부분입니다. 전체 이미지 주소를 가져오기 위해 한 번, 이미지 파일명을 가져오기 위해 또 한번 그룹화하였습니다.

 

그리고 이미지 주소에서 view를 삭제해줍니다.

 

 

 

마지막으로 파일이 존재하는지 확인하고, 없으면 다운로드 받으면 끝입니다.

//파일이 존재하는 지 체크
FileInfo fileInfo = new FileInfo(fileName);
if(!fileInfo.Exists)
{
    //이미지 파일 다운로드
    webClient.DownloadFileAsync(new Uri(imageUrl), fileName);
}
                    

 

 

그 외에 GUI를 위한 코드와 연속해서 파일을 비동기로 다운받기 위한 코드가 포함되었습니다.

 


전체 소스코드

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _10000img
{
    public partial class Form1 : Form
    {
        const string url = "http://10000img.com/ran.php";
        private CancellationTokenSource cancellation;
        ulong cnt = 0;
        delegate void SetTextCallBack();

        public Form1()
        {
            InitializeComponent();
        }

        private async void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            btnStop.Enabled = true;

            cancellation = new CancellationTokenSource();

            await Task.Run(() =>
            {
                while (true)
                {
                    WebClient webClient = new WebClient();
                    webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                    string str = webClient.DownloadString(url);

                    //예제
                    //<a href="http://10000img.com/view/rimg1/hif20.jpg" target="_blank"  >
                    var match = Regex.Match(str, "\"(http://10000.*/(.*))\" target");

                    string imageUrl = match.Groups[1].Value;   //http://10000img.com/view/rimg1/hif20.jpg
                    string fileName = match.Groups[2].Value;   //hif20.jpg

                    //주소에서 view를 삭제
                    imageUrl = imageUrl.Replace("/view", "");  //http://10000img.com/rimg1/hif20.jpg

                    //파일이 존재하는 지 체크
                    FileInfo fileInfo = new FileInfo(fileName);
                    if(!fileInfo.Exists)
                    {
                        //이미지 파일 다운로드
                        webClient.DownloadFileAsync(new Uri(imageUrl), fileName);
                    }

                    //취소요청 시
                    if(cancellation.Token.IsCancellationRequested)
                    {
                        break;
                    }
                }

            });

        }

        private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            //this.Invoke(new SetTextCallBack(SetText), new object[] { cnt });
            //this.Invoke(new SetTextCallBack(SetText), new object[] { });
            cnt++;
            this.Invoke(new SetTextCallBack(SetText));

        }

        private void SetText()
        {
            lbCount.Text = cnt.ToString();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {

            btnStart.Enabled = true;
            btnStop.Enabled = false;

            cancellation.Cancel();

        }
    }
}

 

 

 

비주얼 스튜디오 프로젝트 파일(2019)

 

10000img.zip
0.07MB

 

한 번 실행해 보겠습니다. 이미지가 다운 받아지는게 보입니다.

 

 

 

 

 

 


 

 

실행 파일도 같이 첨부합니다. (.Net Framework 4.5 이상에서 동작합니다.  없으시면 우선 .Net Framework 먼저 설치해주세요. https://www.microsoft.com/ko-kr/download/details.aspx?id=30653 )

 

 

 

여기에서 다운로드 ↓

10000img.zip
0.01MB

 

 

댓글