티스토리 뷰

Language/Python

Python Multi Threading crawl

KyeongRok Kim 2020. 7. 14. 22:39

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로 넘겨줍니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함