Sh4n3e

[Python] 웹 크롤러(Web Crawler)를 제작해보자 본문

Programming/Python

[Python] 웹 크롤러(Web Crawler)를 제작해보자

sh4n3e 2018. 3. 13. 12:40

어떤 사이트의 공고(Announcement)를 주기적으로 확인해야하는 일이 생겼다.

하지만 매일 직접적으로 확인하는 것은 쉽지 않은 일이다.

그래서 나는 자동적으로 크롤링을 하는 웹 크롤러를 제작해보았다. (크롤러의 개념이 이렇게 쓰이는 것이 아니라면 알려주세요.)

크롤링한 정보는 주기적(매일 오후 1시)으로 Telegram을 통해 받아 볼 수 있도록 했다.


순서는 아래와 같았다.

1. Open AWS(Amazon Web Service) Free Tier Server (Ubuntu)

2. Create Telegram Bot and Telegram Channel

3. Build a Python Script

4. Add a Schedule at Crontab



AWS 프리티어 서버를 여는 것은 구글링을 하면 많은 정보를 찾아볼 수 있으므로, 나는 대략적으로 캡쳐하나만 첨부하는 것으로 끝내겠다.



텔레그램 봇은 @BotFather 봇을 통해 관리된다.


텔레그램 클라이언트에서 @BotFather 를 목록에 추가한다. @BotFather 를 검색하거나 웹 브라우저에서 https://telegram.me/botfather 주소로의 접속을 통해서도 @BotFather 를 추가할 수 있다.


START를 누른 후 @BotFather에게 /help 메시지를 보내면 사용가능한 명령어를 알려준다. 명령어에 대한 자세한 설명은 텔레그램 봇 API 문서에 있다. (https://core.telegram.org/bots/api)


/newbot을 통해 봇을 생성하는 과정을 거치고, Bot의 name과 Bot의 username을 설정한다. username의 경우 끝이 반드시 'bot'으로 끝나야한다.


이렇게 봇이 생성되면 우리는HTTP API token을 얻게 된다.

그리고 채널을 생성한다음에 봇을 관리자로 넣어주면, 채널로 봇이 크롤링 결과를 보내줄 수 있다.


다음은 파이썬 스크립트 구현이다. 구현 내용은 아래와 같다.


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
44
45
import urllib2
import ssl
import telepot
import time
 
def openUrl(url):
    # ssl
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    # Http Header
    headers = {'Content-Type''application/json',
            'User-Agent''Dalvik/2.1.0 (Linux; U; Andriod 5.0)',
            'Connection''Keep-Alive'}
    # Post Values
    values = None
    # Request
    request = urllib2.Request(url, None, headers)
    # Http Resopnse
    response = urllib2.urlopen(request, context=ctx)
    # Response Read
    res = response.read()
    sp = res.find('<td colspan=5 height="1"></td>')
    ep = res.find('<br> <br> <br> <br>')
    vacancy = res[sp + 48:ep - 20]
    message = ''
    while (1):
        #Text Parsing
        sp = vacancy.find('~~')
        ep = vacancy.find('~~')
        message = vacancy[sp:ep]
        return message
 
 
if __name__ == "__main__" :
        #telebot
        bot = telepot.Bot('4xxxxxxxx:Axxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxg')
        updates = bot.getUpdates()
        timeTemp = time.localtime(time.time()+32400)
        currentTime = time.strftime("%Y-%m-%d %I:%M", timeTemp)
        
        message = currentTime + '\n\n=========================\n\n' + '[Announcement1]\n' + 
                    openUrl(Sites_URL) + '\n\n=========================\n\n' + 
                    '[Announcement2]\n' + openUrl(Sites_URL)
        bot.sendMessage(chat_id='@channelID', text=message)
cs


코드의 윗부분에 

# ssl

ctx = ssl.create_default_context()

ctx.check_hostname = False

ctx.verify_mode = ssl.CERT_NONE


해당 부분은 https페이지를 읽어들일 수 있도록 하는 부분이다.


이렇게 제작한 파이썬 스크립트를 우리는 Crontab을 통해 내가 원하는 시간마다 작동시키도록 해야한다.

$ crontab -l 

이란 명령어를 작동시키면 현재 내 system에 등록된 Crontab list를 보여준다.


crontab은 분, 시, 일, 월, 요일(0~6, 일월화수목금토) 순으로 지정하여 사용한다.

내가 열어놓은 AWS서버는 오하이오 주의 Timezone을 갖고 있기 때문에 그 상황을 고려하여 4시 즉 한국시간으로 오후 1시에 수행되도록 스케줄을 넣어놨다.

뒤에 커맨드는 python2.7로 해당 python script를 동작하는 명령어를 넣어놓은 것이다.


crontab을 편집할 때엔

$ crontab -e 

명령어를 통해 편집할 수 있다.

Comments