欢迎各位小哥哥小姐姐阅读本的文章,对大家学习有帮助,请点赞加关注哦!!!!!!!!!!

您的点赞和关注将是我持续更新的动力呢.^v^

有不懂的问题可以私聊我哦!

如题,同步运行就是python按照代码逐一运行,如向服务器发送请求,前一个请求得到回应后,才会发起后一个请求,而异步可以在前一个请求在等待回应的时候,就可以发起后一个请求,甚至后两个请求,等到第一个请求得到响应后再回来处理,即可以在多个任务之间来回切换运行,这样就提高了python跑程序的效率,如任务量大,抓取网页多,可能会缩短大量时间。但是,这两种运行方式有一个共同点,那就是同一时刻只能执行一个任务。现分别以同步与异步的方法抓取了时光网Top100的电影(共10个网页),发现异步方式确实一定程度提高了代码运行效率,但是值得注意的是,应为异步运行每次的流程与服务器响应有关,所以每次的运行流程稍有不同,在代码中我用print打印了整个抓取流程,列出代码如下:

同步运行:

图一

图二

import requestsfrom bs4 import BeautifulSoupimport openpyxlimport timestart=time.time()headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36  (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' }url1='http://www.mtime.com/top/movie/top100/'#爬第1页res=requests.get(url1,headers=headers)print(res.status_code)soup=BeautifulSoup(res.text,'html.parser')mov_con=soup.find_all('div',class_='mov_con')num=soup.find_all('div',class_='number')list=[]for i in mov_con: protagonist=[] name=i.find('h2').text director=i.find_all('p')[0].find('a').text protagonist_con=i.find_all('p')[1].find_all('a') for item in protagonist_con: actor=item.text protagonist.append(actor) abstract=i.find_all('p')[3].text list.append([name,director,','.join(protagonist),abstract])for x in range(2,11): url2='http://www.mtime.com/top/movie/top100/index-'+str(x)+'.html' #爬2-10页 res=requests.get(url2,headers=headers) print(res.status_code) soup=BeautifulSoup(res.text,'html.parser') mov_con=soup.find_all('div',class_='mov_con') for i in mov_con: protagonist=[] name=i.find('h2').text director=i.find_all('p')[0].find('a').text protagonist_con=i.find_all('p')[1].find_all('a') for item in protagonist_con: actor=item.text protagonist.append(actor) abstract=i.find('p',class_='mt3').text #由于网页设计‘暴力云与送子鹳 Partly Cloudy (2009)’错误原因, #abstract=i.find_all('p')[3].text报错 list.append([name,director,','.join(protagonist),abstract]) #protagonist时列表不能直接写入excel的单元格,需要先把列表转换成字符串格式wb=openpyxl.Workbook()sheet=wb.activesheet['A1']='剧名'sheet['B1']='导演'sheet['C1']='主演'sheet['D1']='简介'for i in list: sheet.append(i)wb.save('时光热榜电影.xlsx')wb.close()end=time.time() print('耗时:',end-start)

异步运行(协程):

图一

图二

from gevent import monkeymonkey.patch_all()import gevent,time,requests,openpyxlfrom gevent.queue import Queuefrom bs4 import BeautifulSoupstart=time.time()headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' }url_list=['http://www.mtime.com/top/movie/top100/']for i in range(2,11): url_list.append('http://www.mtime.com/top/movie/top100/index-'+str(i)+'.html')#生成待抓取网页列表work=Queue()#创建、实例化队列对象for url in url_list: work.put_nowait(url)#把网页放进queue队列里list =[]def spider(): while not work.empty():#队列非空时 url=work.get_nowait()#在队列里取网页 res=requests.get(url,headers=headers) print(url,res.status_code) soup=BeautifulSoup(res.text,'html.parser') mov_con=soup.find_all('div',class_='mov_con') for i in mov_con: protagonist=[] name=i.find('h2').text director=i.find_all('p')[0].find('a').text protagonist_con=i.find_all('p')[1].find_all('a') for item in protagonist_con: actor=item.text protagonist.append(actor) abstract=i.find('p',class_='mt3').text print([name,director,','.join(protagonist),abstract]) print('-------------------------------------------') #由于网页设计‘暴力云与送子鹳 Partly Cloudy (2009)’错误原因,abstract=i.find_all('p')[3].text报错 list.append([name,director,','.join(protagonist),abstract])#protagonist时列表不能直接写入excel的单元格,需要先把列表转换成字符串格式 print(' 换页')task_list=[]#创建任务列表for x in range(3):#创建3只爬虫 task=gevent.spawn(spider)#创建每个爬虫的任务,需要任务流程(spider函数)和任务所需资源(spider函数自变量,这里是不需要) task_list.append(task)#任务组成任务列表gevent.joinall(task_list)#任务列表加入协程,开始协程执行任务列表中的任务wb=openpyxl.Workbook()sheet=wb.activesheet['A1']='剧名'sheet['B1']='导演'sheet['C1']='主演'sheet['D1']='简介'for i in list: sheet.append(i)wb.save('时光热榜电影.xlsx')wb.close()end=time.time()print(end-start)

运行结果,异步运行耗时16.9s,同步运行耗时39.5s。显然,异步效率高于同步,但是异步有一个缺点就是抓取的页面不是按顺序响应的,即保存的电影顺序是响应速度快的在前,速度慢的在后,没有按照TOP100顺序来保存,所以我们应该根据抓取需求来选择抓取的方式是用同步还是异步。

另外,多协程抓取的对象过程为:url_list--------> task_list------->result_list----->sheet.append(result_list)

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

python find()效率_基于python分别采用同步与异步(协程)方式抓取时光网TOP100电影...相关推荐

  1. python异步协程,抓取豆瓣top250电影海报。

    # 利用正则及异步协程 爬取豆瓣top250电影图片 # author:xyislove # 欢迎各位大神修改指导 from asyncio import tasks import re from f ...

  2. [Python] 抓取时光网的电影列表并生成网页

    抓取时光网的电影列表并生成网页 源码 https://github.com/YouXianMing/BeautifulSoup4-WebCralwer 分析 利用BeautifulSoup进行分析网页 ...

  3. Python+Neo4j构建时光网TOP100电影知识图谱

    Python+Neo4j构建时光网TOP100电影知识图谱 环境 1.Neo4j 3.5.6(2019年6月25日) 2.Java 1.8.0_181 3.Annaconda 3 一.准备工作 Neo ...

  4. 基于python的网站_基于Python的网站爬虫应用研究

    基于 Python 的网站爬虫应用研究 陈清 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2020(027)001 [摘要] 如何于海量的互联网网站中获取有用资源信息 , 对网站 ...

  5. python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...

    Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium .Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozi ...

  6. 大学计算机基础python学多久_基于Python 的“大学计算机基础”课程教学设计

    基于Python 的"大学计算机基础"课程教学设计 日期:2018-04-11 04:32 摘要 培养非计算机专业大学生的计算思维能力,在"大学计算机基础"课程 ...

  7. python实现文件共享_基于Python的分布式文件共享系统的实现

    龙源期刊网 http://www.qikan.com.cn 基于 Python 的分布式文件共享系统的实现 作者:朱亚林 纪宏伟 来源:<智能计算机与应用> 2015 年第 04 期 摘 ...

  8. python通信自动化测试_基于Python的无线通信设备自动化测试软件的研制

    基于Python的无线通信设备自动化测试软件的研制 中国电子科技集团公司第十研究所 冯启俊 [期刊名称]<电子世界> [年(卷),期]2019(000)015 [总页数]2 无线通信设备的 ...

  9. python 英语分词_基于Python NLTK库进行英文文本预处理

    文本预处理是要文本处理成计算机能识别的格式,是文本分类.文本可视化.文本分析等研究的重要步骤.具体流程包括文本分词.去除停用词.词干抽取(词形还原).文本向量表征.特征选择等步骤,以消除脏数据对挖掘分 ...

最新文章

  1. c语言修改elf文件crc32,hash/crc32
  2. html div数据替换,javascript – 将html添加到div而不替换其中的当前内容
  3. 流式计算框架Storm 编程案例部署Linux结果演示及pom依赖
  4. 静态内存、动态内存与堆栈
  5. java重入锁_java并发编程:可重入锁是什么?
  6. Linux ab 命令
  7. gradle 构建 Smack 报错:Can't find android.jar for 8 API. + steps for building android platform
  8. oracle 地市 区县分组,oracle分组写法 - 挣扎在陌生城市ITMAN的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 『Spring.Net』为什么使用?
  10. 为什么专家都看好这本书
  11. 关于COM类工厂80070005和8000401a错误分析及解决办法
  12. 使用java实现MD5码算法
  13. 笔记本android vga输出,笔记本VGA接口基础知识普及
  14. ubuntu装指定分区_Ubuntu安装过程中如何手动指定分区
  15. linux网络配置文件,Linux下一块网卡设置多个IP地址
  16. Footprint:如何寻找有增长潜力的NFT项目?
  17. 【FPGA的小娱乐】tft显示屏生成信号辅助测试阵列
  18. Unity2020版本使用Kinect的修复(附粒子人像互动demo)
  19. ios查看线程数量_iOS线程数量监控工具
  20. 75-CentOS-Docker构建nginx镜像

热门文章

  1. 国内最缺的架构实践,DDD领域驱动设计排第一!
  2. 年薪35W+ 的程序员看过来!百万架构师第3期招生
  3. 2020年度JEECG开发者大赛,开发插件赚外块还能赢大奖!!
  4. 虚拟机系列 | JVM特点,基础结构与执行周期
  5. kindeditor图片上传
  6. 6.HBase时髦谨慎财会会计
  7. hive入ES5.6.8
  8. usermod命令 、用户密码管理、mkpasswd命令
  9. 基于友善之臂ARM-ContexA9-ADC驱动开发
  10. Windows 10 LTSB 还原默认照片查看器