Heim > Artikel > Backend-Entwicklung > So wenden Sie gleichzeitige Programmierung in Python-Crawlern an
Anwendung der gleichzeitigen Programmierung in Crawlern
Single-Threaded-Version
requests
, um JSON-Daten abzurufen und speichert das Bild lokal über die Funktion open
. """ example04.py - 单线程版本爬虫 """ import os import requests def download_picture(url): filename = url[url.rfind('/') + 1:] resp = requests.get(url) if resp.status_code == 200: with open(f'images/beauty/{filename}', 'wb') as file: file.write(resp.content) def main(): if not os.path.exists('images/beauty'): os.makedirs('images/beauty') for page in range(3): resp = requests.get(f'<https://image.so.com/zjl?ch=beauty&sn=>{page * 30}') if resp.status_code == 200: pic_dict_list = resp.json()['list'] for pic_dict in pic_dict_list: download_picture(pic_dict['qhimg_url']) if __name__ == '__main__': main()
Auf macOS- oder Linux-Systemen können wir den Befehl time
verwenden, um die Ausführungszeit des obigen Codes und die CPU-Auslastung zu verstehen, wie unten gezeigt. requests
库获取 JSON 数据,并通过open
函数将图片保存到本地。
""" example05.py - 多线程版本爬虫 """ import os from concurrent.futures import ThreadPoolExecutor import requests def download_picture(url): filename = url[url.rfind('/') + 1:] resp = requests.get(url) if resp.status_code == 200: with open(f'images/beauty/{filename}', 'wb') as file: file.write(resp.content) def main(): if not os.path.exists('images/beauty'): os.makedirs('images/beauty') with ThreadPoolExecutor(max_workers=16) as pool: for page in range(3): resp = requests.get(f'<https://image.so.com/zjl?ch=beauty&sn=>{page * 30}') if resp.status_code == 200: pic_dict_list = resp.json()['list'] for pic_dict in pic_dict_list: pool.submit(download_picture, pic_dict['qhimg_url']) if __name__ == '__main__': main()
在 macOS 或 Linux 系统上,我们可以使用time
命令来了解上面代码的执行时间以及 CPU 的利用率,如下所示。
time python3 example04.py
下面是单线程爬虫代码在我的电脑上执行的结果。
python3 example04.py 2.36s user 0.39s system 12% cpu 21.578 total
这里我们只需要关注代码的总耗时为21.578
秒,CPU 利用率为12%
。
我们使用之前讲到过的线程池技术,将上面的代码修改为多线程版本。
""" example06.py - 异步I/O版本爬虫 """ import asyncio import json import os import aiofile import aiohttp async def download_picture(session, url): filename = url[url.rfind('/') + 1:] async with session.get(url, ssl=False) as resp: if resp.status == 200: data = await resp.read() async with aiofile.async_open(f'images/beauty/{filename}', 'wb') as file: await file.write(data) async def main(): if not os.path.exists('images/beauty'): os.makedirs('images/beauty') async with aiohttp.ClientSession() as session: tasks = [] for page in range(3): resp = await session.get(f'<https://image.so.com/zjl?ch=beauty&sn=>{page * 30}') if resp.status == 200: pic_dict_list = (await resp.json())['list'] for pic_dict in pic_dict_list: tasks.append(asyncio.ensure_future(download_picture(session, pic_dict['qhimg_url']))) await asyncio.gather(*tasks) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
执行如下所示的命令。
time python3 example05.py
代码的执行结果如下所示:
python3 example05.py 2.65s user 0.40s system 95% cpu 3.193 total
我们使用aiohttp
将上面的代码修改为异步 I/O 的版本。为了以异步 I/O 的方式实现网络资源的获取和写文件操作,我们首先得安装三方库aiohttp
和aiofile
time python3 example04.pyDas Folgende ist das Ergebnis des auf meinem Computer ausgeführten Single-Threaded-Crawler-Codes.
python3 example04.py 2,36s Benutzer 0,39s System 12% CPU 21,578 insgesamt
Multithread-VersionWir verwenden die zuvor erwähnte Thread-Pool-Technologie, um den obigen Code in eine Multithread-Version zu ändern.Hier müssen wir nur darauf achten, dass die Gesamtzeit, die der Code benötigt,
21,578
Sekunden beträgt, und die Die CPU-Auslastung beträgt12 %
.
rrreeepip install aiohttp aiofile🎜🎜🎜Das Folgende ist die asynchrone E/A-Version des Crawler-Codes. 🎜rrreee🎜Führen Sie den unten gezeigten Befehl aus. 🎜🎜🎜time python3 example06.py🎜🎜🎜Das Ausführungsergebnis des Codes lautet wie folgt: 🎜🎜🎜python3 example06.py 0,92 s Benutzer 0,27 s System 290 % CPU 0,420 insgesamt🎜🎜🎜Im Vergleich zur Single-Threaded-Version von Das Crawler-Programm, mehr Die Ausführungszeit der Thread-Version und der asynchronen E/A-Version des Crawler-Programms wurde erheblich verbessert, und die asynchrone E/A-Version des Crawler-Programms schnitt am besten ab. 🎜Führen Sie den unten gezeigten Befehl aus. Zeit Python3 Beispiel05.py
Wir verwendenaiohttpÄndern Sie den obigen Code in die asynchrone E/A-Version. Um Netzwerkressourcenerfassung und Dateischreibvorgänge bei asynchroner E/A zu erreichen, müssen wir zunächst die Drittanbieterbibliothekenaiohttp
undaiofile
installieren.
Das obige ist der detaillierte Inhalt vonSo wenden Sie gleichzeitige Programmierung in Python-Crawlern an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!