异步多进程爬虫实现:
1 2 3 4 5 6 7 8 9 10 11 12 13
| from multiprocessing.dummy import Pool import requests
pool = Pool(3)
url_list = ['www.baidu.com','www.baidu.com','www.baidu.com']
def get_requests(url): return requests.get(url).text
request_text_list = pool.map(get_requests,url_list)
|
单线程多任务异步协程:
正常协程实现:
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 46
|
import asyncio import time
async func(url): print('start') time.sleep(3) print('stop') f = func(url) task = asynic.ensure_future(f) loop = asyncio.get_event_loop() loop.run_until+complete(task)
import asyncio
async func(url): print('start') await asyncio.sleep(3) print('stop') urls = [ 'www.baidu.com', 'www.baidu.com', 'www.baidu.com', 'www.baidu.com', 'www.baidu.com' ] tasks = [] for url in urls: f = func(url) task = asynic.ensure_future(f) tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until+complete(asyncio.wait(tasks))
|
在使用协程进行网页爬取的时候,是无法使用await挂起的,也就是说,requests并不支持挂起:
在这个时候,需要使用支持await的请求模块。
也就是aiohttp。
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
| import aiohttp import asyncio import time
async def func(url): async with aiohttp.ClientSession() as a: async with await a.get(url=url) as response: result = await response.text() print(result) return result urls = [ 'https://www.baidu.com', 'https://www.baidu.com', 'https://www.baidu.com' ] tasks = [] for url in urls: f = func(url) task = asyncio.ensure_future(f) tasks.append(task)
loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks))
|
在aiohttp中,和requests一样有get和post请求
这些请求的参数基本相同,
唯一不同的地方在于代理IP
在requests中,代理IP的类型是一个字典类型的数据,
但是在这里,代理IP的类型是一个字符串
同时参数名为proxy
在通常情况下,不要使用asyncio!!!
在通常情况下,不要使用asyncio!!!
在通常情况下,不要使用asyncio!!!
在没有足够充足的代理与完善的伪装的时候,一定不要使用asyncio!
协程的恐怖性能足以让任何网站的程序发现,即使没有发现,过于高频的访问也足以击溃网站了!