Pythonマルチスレッドクロールバケットマップ絵文字
Python Multi Threaded Crawling Bucket Map Emoticon
以下のライブラリを合計インポートする必要があります
from bs4 import BeautifulSoup import requests import time import threading import queue
URLはhttps://www.doutula.com/photo/list/?page=1です。
まず、これはリクエストヘッダーです。
request.getを呼び出して、対応する、
「1.html」にソースコードを書く
url='https://www.doutula.com/photo/list/?page=1' headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'} resp=requests.get(url,headers=headers) with open('1.html','bw') as fp: fp.write(resp.content)
beautifulを使用してhtmlテキストを解析し、lxmlパーサーを設定します。
次は、マルチスレッドクロールグラフです。
Pythonのマルチスレッドは、CPUコンピューティングタイプではなく、IOビジータイプに使用されます。
Pythonのマルチスレッドはシングルコアマルチスレッドだからです。並行することはできず、並行するだけです。
Pythonに付属するキューは、アトミックでスレッドセーフです。しかし、それでも制御にロックを導入する必要があります。
プログラムの実行時間を計算するために、タイムライブラリが導入されました。
with open('1.html','r',encoding='utf-8') as fp: html=fp.read() text=BeautifulSoup(html,'lxml') div=text.select_one('div.page-content') imgs=div.find_all('img') i=0 start=time.time() #-------------------------------------------------------------------------- def go(): global Q,i while True: Lock.acquire() if(Q.empty()): Lock.release() break url=Q.get() Lock.release() resp = requests.get(url, headers=headers) Lock.acquire() with open('img/' + str(i) + '.jpg', 'bw') as fp: i += 1 Lock.release() fp.write(resp.content) Q=queue.Queue(90) i=0 for img in imgs: if (img.get('data-backup')): img_url = img['data-backup'] Q.put(img_url) Lock=threading.RLock() T=[] for cnt in range(5): t=threading.Thread(target=go) T.append(t) t.start() for t in T: t.join() end=time.time() print('Execution time:', end-start,'second')