python 异步队列爬取多个网站

在这里插入代码片@TOCpython 队列创建爬去多个网站数据# -- coding:utf-8 _-
“”"
@Author:xudehui
@File:reliangshuju.py
@Time:2020/11/14 18:30
@Motto:学习PYTHON进行中!
“”"
‘’’
https://food.hiyd.com/。这个网站可以查询食物的热量数据,还可以用来学习健身动作。

谷薯芋、杂豆、主食:
Request URL: https://food.hiyd.com/list-1-html
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
paramaters:{
page: 2

https://food.hiyd.com/list-2-html?page=2
}

‘’’

导入所需的库和模块:

from gevent import monkey
#让程序变成异步模式
monkey.patch_all()
import gevent,requests,bs4,openpyxl,time
from gevent.queue import Queue
from openpyxl import load_workbook,Workbook,worksheet

创建队列对象,并赋值给work

work = Queue()
url = ‘https://food.hiyd.com/list-{type}-html?page={page}’
for x in range(1,24):
for y in range(1,24):
url_real = url.format(type = x,page=y)
work.put_nowait(url_real)

url1 = ‘https://food.hiyd.com/list-132-html?page={page}’
for x in range(1,24):
url_real1 =url1.format(page = x)
work.put_nowait(url_real1)
print(work)

def crawler(job):# 定义crawler函数
headers = {‘user-agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36’}
# 添加请求头
while not job.empty():
# 当队列不是空的时候,就执行下面的程序
url = job.get_nowait()
# 用get_nowait()方法从队列里把刚刚放入的网址提取出来
res = requests.get(url, headers=headers)
# 用requests.get获取网页源代码
bs_res = bs4.BeautifulSoup(res.text, ‘html.parser’)
# 用BeautifulSoup解析网页源代码
category = bs_res.find(‘b’).text
# 用find提取出标签的内容,当前页面所属的分类
foods = bs_res.find_all(‘li’)
# 用find_all提取出

  • 标签的内容
    for food in foods:# 遍历foods
    food_name = food.find(‘a’).find_all(‘div’)[1].find(‘h3’).text
    # 用find_all在
  • 标签下,提取出第二个
    标签中

    标签中的文本,也就是食物名称
    food_calorie = food.find(‘a’).find_all(‘div’)[1].find(‘p’).text
    # 用find_all在
    • 标签下,提取出第二个
      标签中

      标签中的文本,也就是食物热量
      food_url = ‘http:’ + food.find(‘a’)[‘href’]
      # 用find_all在

    • 标签下,提取出唯一一个标签中href属性的值,跟’http:'组合在一起,就是食物详情页的链接
      print([category, food_name, food_calorie, food_url])
      # 打印食物的名称

  • tasks_list = []

    创建空的任务列表

    for x in range(5):
    # 相当于创建了5个爬虫
    task = gevent.spawn(crawler(work))
    # 用gevent.spawn()函数创建执行crawler()函数的任务
    tasks_list.append(task)
    # 往任务列表添加任务
    gevent.joinall(tasks_list)

    用gevent.joinall方法,启动协程,执行任务列表里的所有任务,# 欢迎使用Markdown编辑器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于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秒钟的延时,以避免被封禁。如果您需要更高的爬取速度,请自行调整代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩,与谁同坐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值