1、爬取8个网站(包括百度、新浪、搜狐、腾讯、网易、爱奇艺、天猫、凤凰)。用多协程gevent()模块来爬取。

这里有一个关于gevent的一些基础介绍的链接
Python并发之协程gevent基础(5)

from gevent import monkey
#从gevent库里导入monkey模块。
monkey.patch_all()
#monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。
import gevent,time,requests
#导入gevent、time、requests。start = time.time()
#记录程序开始时间。url_list = ['https://www.baidu.com/',
'https://www.sina.com.cn/',
'http://www.sohu.com/',
'https://www.qq.com/',
'https://www.163.com/',
'http://www.iqiyi.com/',
'https://www.tmall.com/',
'http://www.ifeng.com/']
#把8个网站封装成列表。def crawler(url):
#定义一个crawler()函数。r = requests.get(url)#用requests.get()函数爬取网站。print(url,time.time()-start,r.status_code)#打印网址、请求运行时间、状态码。tasks_list = [ ]
#创建空的任务列表。for url in url_list:
#遍历url_list。task = gevent.spawn(crawler,url)#用gevent.spawn()函数创建任务。tasks_list.append(task)#往任务列表添加任务。
gevent.joinall(tasks_list)
#执行任务列表里的所有任务,就是让爬虫开始爬取网站。
end = time.time()
#记录程序结束时间。
print(end-start)
#打印程序最终所需时间。
print(tasks_list)

运行代码如下:

https://www.baidu.com/ 0.4305078983306885 200
https://www.sina.com.cn/ 0.652501106262207 200
http://www.ifeng.com/ 0.6529850959777832 200
https://www.163.com/ 0.6529850959777832 200
http://www.sohu.com/ 0.7468271255493164 200
https://www.qq.com/ 0.799919605255127 200
https://www.tmall.com/ 0.8475008010864258 200
http://www.iqiyi.com/ 0.9194967746734619 200
0.9199841022491455
[<Greenlet at 0x2162cb6c9d8: _run>, <Greenlet at 0x2162d915158: _run>, <Greenlet at 0x2162d915268: _run>, <Greenlet at 0x2162d915378: _run>, <Greenlet at 0x2162d915488: _run>, <Greenlet at 0x2162d915598: _run>, <Greenlet at 0x2162d9156a8: _run>, <Greenlet at 0x2162d9157b8: _run>]

2、爬取8个网站(包括百度、新浪、搜狐、腾讯、网易、爱奇艺、天猫、凤凰)。用多协程gevent()和queue()模块来爬取。
queue模块
当我们用多协程来爬虫,需要创建大量任务时,我们可以借助queue模块。
queue翻译成中文是队列的意思。我们可以用queue模块来存储任务,让任务都变成一条整齐的队列,就像银行窗口的排号做法。因为queue其实是一种有序的数据结构,可以用来存取数据。
这样,协程就可以从队列里把任务提取出来执行,直到队列空了,任务也就处理完了。就像银行窗口的工作人员会根据排号系统里的排号,处理客人的业务,如果已经没有新的排号,就意味着客户的业务都已办理完毕。

我们创建了两只可以异步爬取的爬虫。它们会从队列里取走网址,执行爬取任务。一旦一个网址被一只爬虫取走,另一只爬虫就取不到了,另一只爬虫就会取走下一个网址。直至所有网址都被取走,队列为空时,爬虫就停止工作。

用协程技术和队列爬取8个网站的完整代码如下:

from gevent import monkey
#从gevent库里导入monkey模块。
monkey.patch_all()
#monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。
#会自动将python的一些标准模块替换成gevent框架
import gevent,time,requests
#导入gevent、time、requests
from gevent.queue import Queue
#从gevent库里导入queue模块start = time.time()url_list = ['https://www.baidu.com/',
'https://www.sina.com.cn/',
'http://www.sohu.com/',
'https://www.qq.com/',
'https://www.163.com/',
'http://www.iqiyi.com/',
'https://www.tmall.com/',
'http://www.ifeng.com/']work = Queue()
#创建队列对象,并赋值给work。
#用Queue()能创建queue对象,相当于创建了一个不限任何存储数量的空队列。如果我们往Queue()中传入参数,比如Queue(10),则表示这个队列只能存储10个任务。
for url in url_list:
#遍历url_listwork.put_nowait(url)#用put_nowait()函数可以把网址都放进队列里。queue.put_nowait即往队列里存储数据。def crawler():while not work.empty():#当队列不是空的时候,就执行下面的程序。queue.empty()是判断队列是否为空。url = work.get_nowait()#用get_nowait()函数可以把队列里的网址都取出。r = requests.get(url)#用requests.get()函数抓取网址。print(url,work.qsize(),r.status_code)#打印网址、队列长度、抓取请求的状态码。queue.qsize()是判断队列还剩多少数量tasks_list  = [ ]
#创建空的任务列表
for x in range(2):
#相当于创建了2个爬虫task = gevent.spawn(crawler)#用gevent.spawn()函数创建执行crawler()函数的任务。#gevent.spawn()会自动将python的一些标准模块替换成gevent框架。tasks_list.append(task)#往任务列表添加任务。
gevent.joinall(tasks_list)
#用gevent.joinall方法,执行任务列表里的所有任务,就是让爬虫开始爬取网站。
#gevent.joinall(jobs)是将协程任务添加到事件循环,接收一个任务列表。
end = time.time()
print(end-start)

代码运行结果如下:

https://www.baidu.com/ 6 200
https://www.sina.com.cn/ 5 200
http://www.sohu.com/ 4 200
https://www.qq.com/ 3 200
https://www.163.com/ 2 200
https://www.tmall.com/ 1 200
http://www.iqiyi.com/ 0 200
http://www.ifeng.com/ 0 200
3.0378034114837646

3、用多协程爬取薄荷网的食物热量。

代码如下:

import gevent
from gevent.queue import Queue
from gevent import monkey
monkey.patch_all()
import requests, bs4, csvwork = Queue()
url_1 = 'http://www.boohee.com/food/group/{type}?page={page}'
for x in range(1, 4):for y in range(1, 4):real_url = url_1.format(type=x, page=y)work.put_nowait(real_url)url_2 = 'http://www.boohee.com/food/view_menu?page={page}'
for x in range(1,4):real_url = url_2.format(page=x)work.put_nowait(real_url)def crawler():headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}while not work.empty():url = work.get_nowait()res = requests.get(url, headers=headers)bs_res = bs4.BeautifulSoup(res.text, 'html.parser')foods = bs_res.find_all('li', class_='item clearfix')for food in foods:food_name = food.find_all('a')[1]['title']food_url = 'http://www.boohee.com' + food.find_all('a')[1]['href']food_calorie = food.find('p').textwriter.writerow([food_name, food_calorie, food_url])#借助writerow()函数,把提取到的数据:食物名称、食物热量、食物详情链接,写入csv文件。print(food_name)csv_file= open('boohee.csv', 'w', newline='')
#调用open()函数打开csv文件,传入参数:文件名“boohee.csv”、写入模式“w”、newline=''。
writer = csv.writer(csv_file)
# 用csv.writer()函数创建一个writer对象。
writer.writerow(['食物', '热量', '链接'])
#借助writerow()函数往csv文件里写入文字:食物、热量、链接tasks_list = []
for x in range(5):task = gevent.spawn(crawler)tasks_list.append(task)
gevent.joinall(tasks_list)

运行结果:

Easy Fun 高蛋白小酥鱼(藤椒味)
鸡蛋,又叫鸡子、鸡卵、蛋
Easy Fun 低脂鸡胸肉肠(香辣味)
Easy Fun 鸡胸肉丝(原味)
Easy Fun 低脂鸡胸肉(黑椒味)
Easy Fun 低脂鸡胸肉(香辣味)
Easy Fun 低脂鸡肉丸(原味),又叫Easy Fun 低脂鸡肉丸(原味)、Easy Fun 低脂鸡胸肉丸(原味)
Easy Fun 高蛋白小酥鱼(海苔味)
Easy Fun 低脂鸡胸肉肠(原味)
猪小排,又叫排骨、猪排
鸡(土鸡,家养)
鸡(母鸡,一年内)
鸡(肉鸡,肥)
鸭肉,又叫鸭子、鹜肉、家凫肉
猪蹄,又叫猪脚、猪手、猪蹄爪
螃蟹(河蟹),又叫螃蟹、毛蟹、稻蟹、中华绒螯蟹、横行介士、无肠公子
猪肉(瘦),又叫猪精肉,瘦肉
鸡蛋白(鸡蛋清),又叫鸡蛋白、鸡蛋清、蛋清、蛋白
火腿肠
鸡胸脯肉,又叫鸡柳肉、鸡里脊肉、鸡胸、鸡胸肉
荷包蛋(油煎),又叫荷包蛋、煎蛋、煎荷包蛋、煎鸡蛋
咸鸭蛋,又叫盐蛋、腌蛋、味蛋
猪肉(肥瘦),又叫豕肉、彘肉
瓦罐鸡汤(含料),又叫瓦罐汤
瓦罐鸡汤(无料)
猪小排(良杂猪)
猪肉(奶脯),又叫软五花、奶脯、五花肉
猪大排,又叫猪排
Easy Fun 低脂鸡胸肉肠
松花蛋(鸭蛋),又叫皮蛋
酸奶
牛奶,又叫纯牛奶、牛乳、全脂牛奶
无糖全脂拿铁,又叫拿铁咖啡、拿铁(全脂,无糖)
奶酪,又叫乳酪、芝士、起司、计司
酸奶(中脂)
脱脂奶粉
酸奶(调味)
酸奶(果料),又叫果料酸奶
酸奶(果粒),又叫果粒酸奶
蒙牛 高钙牛奶,又叫蒙牛袋装高钙牛奶
脱脂牛奶,又叫脱脂奶
光明 e+益生菌酸牛奶(原味)220ml (袋装)
低脂牛奶,又叫低脂奶 脱脂奶
早餐奶
酸奶(高蛋白)
奶片
全脂牛奶粉
光明 纯牛奶,又叫光明牛奶
光明 优倍 高品质鲜牛奶,又叫光明 优倍高品质鲜牛奶
光明 优倍 0脂肪 高品质脱脂鲜牛奶
Easy Fun 营养粉丝(香菇炖鸡),又叫Easy Fun 营养粉丝(香菇炖鸡味)
Easy Fun 营养粉丝(牛肉味噌味)
白粥,又叫白粥(粳米),稀饭,大米粥,白米粥,米粥,大米汤汤
Easy Fun 营养粉丝(番茄鸡蛋),又叫Easy Fun 营养粉丝(番茄鸡蛋味)
Easy Fun 低脂咖喱鸡饭
Easy Fun 抹茶红豆麦片
Easy Fun 高蛋白微波蛋糕预拌粉(香浓可可味)
Easy Fun 红枣黑米圈(新包装)
Easy Fun 鸡肉松烤麦片
Easy Fun 山药紫薯圈
包子(猪肉馅)
米饭,又叫大米饭,饭,蒸米、锅巴饭
Easy Fun 高纤奇亚籽苏打饼干,又叫Easy Fun 高纤 奇亚籽苏打饼干、奇亚籽苏打咸味饼干、苏打饼干、EASY FUN 苏打饼干
白薯,又叫山芋、红皮山芋,地瓜、甘薯
大米,又叫稻米、米、生米
全麦面包,又叫全麦面包、全麦吐司、全麦面包片、全麦土司
烙饼
花卷,又叫花之卷、大花卷、小花卷
油条,又叫小油条
曼可顿全麦高纤维面包
稀饭,又叫白粥(籼米),大米粥,白米粥
玉米(鲜),又叫苞谷、珍珠米、棒子、玉蜀黍、苞米、六谷、鲜玉米
燕麦片,又叫燕麦
面条(生),又叫面
煮面条,又叫面、水煮面、面条(煮)
籼米粉,又叫米线、米粉、粉
面包
红薯,又叫地瓜、番薯、甘薯
小米粥
马铃薯,又叫土豆、洋芋、地蛋、山药蛋、洋番薯
光明 优倍 0乳糖 巴士杀菌调制乳
光明 致优 全鲜乳,又叫光明 致优全鲜乳
光明 0脂肪 鲜牛奶,又叫光明 0脂肪鲜牛奶
牛奶(强化VA,VD),又叫牛乳(强化VA,VD)
光明 低脂牛奶
蒙牛 木糖醇酸牛奶,又叫蒙牛木糖醇酸奶
低脂奶酪
伊利 无蔗糖酸牛奶(利乐包)150g
蒙牛 酸牛奶(草莓+树莓)100g (小盒装)
光明减脂90%脱脂鲜牛奶
牛肉面,又叫兰州拉面、牛腩面、牛肉拌面
炒上海青,又叫炒青菜
番茄炒蛋,又叫番茄炒鸡蛋、西红柿炒蛋、西红柿炒鸡蛋、西虹市炒鸡蛋、番茄炒蛋
吐司,又叫吐司面包、白吐司、面包片、切片面包
鸡蛋羹,又叫蒸蛋
绿豆汤
素炒小白菜,又叫小青菜
烧茄子
绿豆粥,又叫绿豆稀饭
菜包子,又叫香菇菜包、菜包子、素包子、素包、香菇青菜包、素菜包、香菇青菜包、香菇包子
卤蛋,又叫卤鸡蛋
清炒土豆丝
清爽西兰花
烧麦,又叫烧卖、糯米烧卖
炒大白菜,又叫大白菜
西红柿鸡蛋汤,又叫西红柿蛋汤、西红柿蛋花汤
大饼,又叫饼,家常饼,死面饼
清蒸鱼,又叫清蒸鱼、蒸鱼、鱼、蒸洄鱼
酸菜鱼,又叫酸汤鱼、酸辣鱼、酸菜鱼
寿司 自制1,又叫寿司卷
蛋炒饭,又叫黄金炒饭、蛋炒饭
红烧鳓鱼
盐水虾,又叫焖鲜虾
清炒绿豆芽,又叫有机活体豆苗、炒绿豆芽
葱油饼,又叫葱花饼、葱油饼
清炒西葫芦,又叫炒西葫、西葫芦丝
西红柿鸡蛋面,又叫番茄蛋面、番茄鸡蛋面
酸辣土豆丝
红烧肉
韭菜包子

Python爬虫笔记——多协程(gevent and queue)相关推荐

  1. Python爬虫笔记——多协程gevent()

    1. 同步爬取时光网Top100 利用requests和bs4模块就行了 import requests from bs4 import BeautifulSoup import timestart= ...

  2. Python爬虫——aiohttp异步协程爬取同程旅行酒店评论

    大家好!我是霖hero Python并发编程有三种方式:多线程(Threading).多进程(Process).协程(Coroutine),使用并发编程会大大提高程序的效率,今天我们将学习如何选择多线 ...

  3. Python爬虫项目实例——多协程爬取【薄荷网】的食物热量

    爬虫网站:http://www.boohee.com/food/group 爬的信息:食物的名称及热量 代码: import gevent from gevent.queue import Queue ...

  4. Python 爬虫 - Instagram异步协程

    前言 没啥目的,就觉得ins里妹子图多... 正文 一.分析 1.分析目标网站 首先分析网站图片加载流程, taeri__taeri 应该有人认识这个网红.ins照片一次只加载了一定数量的照片,往下翻 ...

  5. Python并发之协程gevent基础

    基本示例 from gevent import monkey monkey.patch_all() # 记住一定放在第一行,这里是打补丁的意思,time模块在使用协程gevent模块的时候,必须打补丁 ...

  6. 异步爬虫框架与协程浅析

    异步爬虫框架与协程浅析 经典原文使用协成完成异步爬虫原文链接 根据分享原文链接. Python基于协程的实现,其实是利用了Python生成器的特性完成的,Python生成器的原理其实涉及到用户态绿色线 ...

  7. python并发编程之协程

    python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...

  8. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

  9. python协程是什么_在python中线程和协程的区别是什么

    在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...

最新文章

  1. 抖音怎么在电脑上看_抖音电脑直播权限怎么开通?抖音直播伴侣怎么操作?一文全解...
  2. Linux下rz,sz与ssh的配合使用,实现文件传输
  3. Kafka消费者详解
  4. 【152】C# 操作 Excel 杂记
  5. pat(基本编程题集)6-2 多项式求值 (15 分)
  6. ICS lab9 TinyShell 的10条建议
  7. Python 分析 10 万条弹幕告诉你:《古董局中局2》到底好不好看?
  8. python求高阶导数_Pythorch中的高阶梯度
  9. 手机修改html离线网页内容,HTML5--离线web应用
  10. 雨课堂卷子提前看_雨课堂提前看试卷
  11. 合宙Air105|Socket|UDP |TCP/IP|W5500|Serial 串口|透传|DTU|网络测试助手|双机互联|内网测试|官方demo|学习(8-3):Socket网络接口-双机互联透传
  12. 中国域名8大玩家传奇故事
  13. 进安全模式提示”Press ENTER to continue loading SPTD.sys”
  14. 语义分割介绍和FCN
  15. 华为云计算机访问手机软件,手机也能当电脑使用?华为黑科技:手机云电脑
  16. 品味30句对爱情的经典认识
  17. 说说本人学习DirectX之路
  18. 齐博模板直接写mysql_齐博CMS使用常见问题和技巧汇总
  19. 熟悉Elipse开发工具
  20. 测试踩坑:手机号一键登录的手机双卡运营商问题

热门文章

  1. unturned组服务器网站,Unturned
  2. unturned服务器重置,《Unturned》服务器建立方法详解
  3. Linux发行版 CentOS Ubuntu RedHat Android Tizen MeeGo
  4. 深入理解Prometheus(GO SDK及Grafana基本面板)
  5. php通过session保存用户信息,如何在php中利用session与cookie保存用户的登录信息
  6. matlab与模态分析,电压稳定模态分析基础知识MATLAB实例
  7. sap2000——模态分析
  8. 计算机课怎么上会觉得有趣,让信息技术课生动有趣
  9. 隐藏浏览器自带滚动条方法
  10. 抖店订单发货回传的实际开发笔记