python爬虫,使用多协程以及队列爬取时光网电视剧top100python爬虫,使用多协程以及队列爬取时光网电视剧top100
时间: 2024-05-01 21:16:48 浏览: 149
以下是一个基于Python 3的多协程以及队列爬取时光网电视剧top100的示例代码:
```python
import requests
from bs4 import BeautifulSoup
import asyncio
import aiohttp
import time
from queue import Queue
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def parse(html):
soup = BeautifulSoup(html, 'html.parser')
for item in soup.select('div[class="mov_con"] ul li'):
rank = item.find('span', class_='top_num').text
name = item.find('span', class_='mov_title').text
score = item.find('span', class_='total_score').text
print(rank, name, score)
async def worker(session, queue):
while not queue.empty():
url = queue.get()
html = await fetch(session, url)
await parse(html)
async def main():
urls = [f'http://www.mtime.com/top/tv/top100/index-{i+1}.html' for i in range(10)]
queue = Queue()
for url in urls:
queue.put(url)
async with aiohttp.ClientSession() as session:
tasks = [asyncio.create_task(worker(session, queue)) for _ in range(10)]
await asyncio.gather(*tasks)
if __name__ == '__main__':
start_time = time.time()
asyncio.run(main())
end_time = time.time()
print(f'Time used: {end_time - start_time} seconds')
```
这段代码使用了Python的asyncio库和aiohttp库来实现多协程异步爬取网页,使用了Python的queue模块来实现任务队列。首先,我们定义了`fetch`函数来异步获取网页内容,其返回值为响应的文本内容。然后,我们定义了`parse`函数来解析网页内容,提取出电视剧的排名、名称和评分,并输出到控制台。接着,我们定义了`worker`函数来作为协程的工作函数,从任务队列中取出一个URL并异步地解析该URL对应的网页。最后,我们定义了`main`函数来创建任务队列,创建异步协程,以及启动异步任务。在`main`函数中,我们先创建了10个URL,然后将这些URL放入任务队列中。接着,我们使用`async with`语句创建一个异步会话,并使用`create_task`函数创建10个异步协程,每个协程都调用`worker`函数,从任务队列中取出一个URL,并异步地解析对应的网页。最后,我们使用`asyncio.gather`函数等待所有的异步协程执行完毕。在程序执行结束后,我们还输出了程序的执行时间。
需要注意的是,由于时光网在一定时间内会对IP进行限制,如果爬虫速度过快可能会被封禁IP,因此我们在程序中设置了一个1秒钟的延时,以避免被封禁。如果您需要更高的爬取速度,请自行调整代码。
阅读全文