10000img.com 이미지 다운로더 는 맨 아래에 있습니다.
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)
한 번 실행해 보겠습니다. 이미지가 다운 받아지는게 보입니다.
실행 파일도 같이 첨부합니다. (.Net Framework 4.5 이상에서 동작합니다. 없으시면 우선 .Net Framework 먼저 설치해주세요. https://www.microsoft.com/ko-kr/download/details.aspx?id=30653 )
↓↓ 여기에서 다운로드 ↓↓
'life.hack' 카테고리의 다른 글
빨래집게 발석차 with 괴물 쓰레기통 (0) | 2020.06.10 |
---|---|
DC 모터 만들기 (0) | 2020.06.08 |
아두이노 금속 탐지기(Arduino Metal Detector) 만들기 (2) | 2020.06.03 |
오래된 보물 지도 만들기(종이 낡게 만들기) (0) | 2020.05.31 |
이케아(IKEA) PLATSA/플랏사 온라인 플래닝 사용법 (0) | 2020.05.30 |