본문 바로가기

Language/Python

Python Multi Threading crawl

728x90

python multi threading crawl

멀티스레딩은 아래와 같이 여러 페이지를 크롤 해야 하는 경우 http request의 response가 순차적으로 실행되야 한다면 1000개 page를 크롤 한다고 하면 시간이 오래 걸릴 수 있습니다. 그래서 병렬처리를 하는데 병렬처리를 할 때는 Thread를 씁니다.

 

import time
from threading import Thread
import requests

total_page = 1000
def run(idx, results):
    url = 'http://<hostname>/app/test/hpa'
    print(idx, url)
    res = requests.get(url)
    print(res, res.content)

results = [None] * total_page
for i in range(total_page):
    Thread(target=run, args=(i, results)).start()
    time.sleep(0.1)
time.sleep(30)

최소한 run함수 하나 loop하나는 구현 해야 합니다.

 

import time
from threading import Thread
from libs.jsonFileSaver import save as json_save
import requests

def parse(json1):
    data = json1['data']
    # data_id
    return data

def gogo(page_idx, results):
    url = 'https://data.mafra.go.kr/opendata/data/open/getDataListPage.do'
    data = requests.post(url, data={
        'cur_page':page_idx,
        'rows':10
    })
    res = parse(data.json())
    results[page_idx] = res
    print('thread {} finished'.format(page_idx))

total_pages = 106 + 1 # index는 0번부터 page는 1번부터

# global에 variable을 생성 해준다
threads = [None] * total_pages
results = [None] * total_pages

for i in range(1, total_pages):
    threads[i] = Thread(target=gogo, args=(i, results))
    threads[i].start()
    print('thread {} started'.format(i))

time.sleep(total_pages / 3)

cnt = 0
result_total = []
for result in results:
    cnt += 1
    print(cnt, end='')
    if result != None:
        print(len(result), result)
        result_total += result

print(cnt)
json_save(result_total, 'mafra_total_data.json')

위 코드는 전체 코드입니다. https://data.mafra.go.kr/opendata/data/open/getDataListPage.do 이 사이트에서 게시판의 페이지를 돌면서 제목 등을 수집하는 코드입니다.

Thread를 import해준다

from threading import Thread
threads = [None] * total_pages
results = [None] * total_pages

thread를 생성할 공간과 thread가 데이터를 저장할 공간을 n개 만들어줍니다.

threads[i] = Thread(target=gogo, args=(i, results))

thread에 gogo라는 함수를 전달하고 gogo함수에는 아래와 같이 parameter가 2개가 있습니다

def gogo(page_idx, results):
    url = 'https://data.mafra.go.kr/opendata/data/open/getDataListPage.do'
    data = requests.post(url, data={
        'cur_page':page_idx,
        'rows':10
    })

args에는 tuple로 넘겨줍니다.

728x90
블로그 주인장입니다. 원하시는 정보는 얻으셨나요? 이 포스트에서 추가로 필요한 정보가 있으시면 여기에 남겨주세요.