×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,653,076명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형



본 크롤링 포스트는 Crocus 본인의 사이트를 이용하여 크롤링을 진행하였습니다.


포스팅을 위해 Chrome을 이용하고 있습니다.





크롤링을 이용하여 특정 홈페이지에서 얻어오고자 하는 간단한 방법을 소개하고자 한다.



이 내용을 토대로 다양한 방식의 크롤러를 제작하여 이용할 수 있을 것 같다.



이번 포스팅에서는 crocus 메인 화면에서 슬라이드로 돌아가는 5가지 이미지를 추출해보려 한다.



코드를 보고 바로 진행해보자.



우선 우리는 www.crocus.co.kr의 html을 파싱해오기위해 파이썬에서 다음과 같은 모듈을 이용한다.

(이때 HTML 파싱이라 함은 www.crocus.co.kr 에서 F12키를 누르면 나타나는 코드 전문이다.)


import requests


이 모듈은 우리가 원하는 사이트의 html 내용을 가져와 주는 역할을 한다.



만약 이 모듈이 설치가 되어 있지 않다면 cmd 창에서 다음과 같이 진행하자.


pip install requests



코드를 보자.


1. url은 크롤링 하고자 하는 사이트를 입력한다. 현재는 www.crocus.co.kr이다.


2. html에는 get_html(url)에 의해 www.crocus.co.kr의 html의 전문이 들어갈 것이다.(str형으로)


3. get_html은 다음과 같다.


url을 받아서 req.get을 하면 '내가 그 url의 html을 파싱하고 싶다' 라는 의미가 된다.


이때 if ret.status_code == 200의 의미는 'success'라는 의미가 된다.

(다양한 status_code가 있으니 구글링을 통해 확인해보자.)



만약 이때 get에서 headers를 보내지 않았다면 티스토리는 403 status_code를 보낼 것이다.


403의 의미는 '신원이 확인되지 않은 불특정한 곳에서 접근을 시도할 때 나타나는 Forbidden 현상'이다.


따라서 우리는 crocus.co.kr을 파싱하기위해 헤더를 추가해주어야 한다.


자신의 User-agent를 알고 싶다면 다음 링크를 통해 확인해보자.


http://ctarbucks.tistory.com/47




그렇게 성공을 한다면 html은 정상적으로 return이 될 것이다.



4. 이제 우리는 받아온 html을 이용하여 www.crocus.co.kr의 5가지 이미지를 찾아낼 것이다.




위의 사진을 보자.


www.crocus.co.kr에서 F12번을 누르면 다음과 같이 나타날 것이다.


우선 1번 버튼을 누르고 2번에 마우스를 올리면 3번으로 위치가 나타날 것이다.


우리는 이제 'Think Creatively'가 저 URL을 이용한다면 다운 받을 수 있다는 것을 알 수 있게 된다.


따라서 여러 방법이 있겠지만, 필자는 다운로드 받기위한 링크에 가장 접근하기 위해 위의 [ ] 부분인 주석을 html내에서 find하였다.



'처음부터 그냥 html.find를 이용하여 다운로드 링크를 찾으면 되는 것 아닌가요?'


물론 가능하지만, 우리는 정확히 5개의 이미지를 추출해야 하고, 


만약 저 이미지 말고도 티스토리 내부에서 제공하는 이미지 파일로 인해 http://tistory1.daumcdn.net~ 이라는 문구가 있다면 


다른 것들도 다운로드 될 수 있기에 최대한 크롤러가 정상작동 하기위해 html의 시작 위치를 근접시키는게 좋다고 판단했다.

(물론 코더 마음이다. 그리고 위의 말이 이해가 안된다면 천천히 읽어내려가며 확인해도 무방하다.)



5. 이제 우리는 html.find("Filckity HTML init")라는 문구를 통해 posStart를 찾아낼 것이고, while문을 이용하여


https://tistory1.daumcdn.net/tistory/ 라는 문구를 발견하지 않을 때 까지 계속해서 posStart, posEnd를 이용하여 다운로드 받을 것이다.


6. download_web_image 함수를 이용하여 해당 link의 파일을 다운 받고, 그 파일명은 crocus_, 추가 파일명은 cnt를 이용하여


각 파일을 crocus_1, crocus_2, ..., crocus_5로 나타낼 것이다.


실행 결과 아래처럼 5개의 파일이 정상 다운로드 됐음을 알 수 있다.






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import requests as req
import urllib.request as urllib2
 
def get_html(url):
    headers = {"User-agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"}
    
    html = ""
    ret = req.get(url, headers = headers)
    
    if ret.status_code == 200:
        html = ret.text
 
    return html
 
def download_web_image(url, name, cnt):
    save_name = name + str(cnt) + ".jpg"
    urllib2.urlretrieve(url, save_name)
 
url = "http://www.crocus.co.kr"

html = get_html(url);

cnt = 1
posStart = html.find("Flickity HTML init")
posEnd = 0
 
while True:
    posStart = html.find('http://tistory1.daumcdn.net/tistory/', posStart)
    if posStart == -1:
        break
 
    posEnd = html.find('.png', posStart)
    link = html[posStart:posEnd + 4]
 
    print(link)
    download_web_image(link, "crocus_", cnt)
    posStart = posStart + 1
    cnt += 1
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
 
 
Crocus








추가 내용 


1. python2에서는 크롤링을 어떻게 만들까


import urllib 

from HTMLParser import HTMLParser


두가지를 이용하여 만들 수 있다.(자세한 내용은 검색을 통해 알아보자.)



2. crontab 이용하기


필자는 포스팅을 위해 이 글을 썼고, 사실상 특정 홈페이지에 주기적으로 크롤링을 하여 .jpg 파일을 게시하려는 프로그램을 제작하였다.


이때 일반 호스팅 사이트는 리눅스 명령어인 crontab를 제공하지 않는다.


crontab는 주기적으로 어떤 파일을 실행시켜주는 것을 의미하는데, 이러한 것을 악용하는 사례가 많기에 호스팅 업체에서는 crontab 명령어를 잘 허가해주지 않는다.


이를 위해 우리는 주기적으로 실행하여 크롤링을 해야한다면 우회 방법을 이용해야 한다.


우선 온라인에서 cron을 해주는 사이트  https://cronless.com/ 를 이용한다.


이 사이트에서는 php 파일을 요구하게 된다.(python을 바로 실행 할 수 있는지는 확인해보지 않았다.)


우리는 그렇다면 php에서 파이썬을 어떻게 실행하는지 알아야 한다.



1
2
3
4
5
6
7
8
9
10
<?php 
 
$command = escapeshellcmd('python crocus.py');
$output = shell_exec($command);
echo $output;
 
?>
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus




필자의 호스팅 업체는 python2 까지만 지원하기에 위의 내용처럼 

$command = escapeshellcmd('python crocus.py'); 로 적용해야 한다.


만약 python3까지 적용이 된다면

$command = escapeshellcmd('python3 crocus.py');


다음과 같이 적으면 된다.


이제 온라인 cron에서 해당 php를 등록해주고, 자동으로 python 프로그램이 실행되도록 만들어주면 

crontab이 없어도 cron효과를 볼 수 있다.




반응형