python并发爬虫实用工具tomorrow实用解析
Python  /  管理员 发布于 7年前   170
tomorrow是我最近在用的一个爬虫利器,该模块属于第三方的一个模块,使用起来非常的方便,只需要用其中的threads方法作为装饰器去修饰一个普通的函数,既可以达到并发的效果,本篇将用实例来展示tomorrow的强大之处。后面将对tomorrow的实现原理做进一步的分析。
1.安装第三方包
pip install requests_html #网络请求包pip install fake-useragent #获取useragent包pip install tomorrow
2.普通下载方式
在这里我们用20个电影网址进行测试,并获取其标题,计算所用的时间
start=time.time()for i in url_list: print(get_xpath(get_req(i),"//title//text()"))end=time.time()print("普通方式花费时间",end-start)
get_req是我定义的访问网络的一个方法,get_xpath是为例使用xpath表达式获取其结果,这里是获取网址的标题。20个电影网址普通方式访问的结果在8-9秒之间。
3.使用tomorrow以后
start2 = time.time()req_list = []for url in url_list: req = async_get_req(url) req_list.append(req)for req in req_list: print(get_xpath(req, "//title//text()"))end2 = time.time()print("并发后花费时间", end2 - start2)
如果我们想要使用tomorrow,就要尽量减少耗时操作,访问网络并等待其回应就是一个非常耗时的工作,在这里我们需要做的是,并发的时候除了访问网络不要做其他操作,然后我们把获取的请求存一个列表,然后再去循环做其他操作,看不懂我说的没关系,直接看下面代码并尝试几次就明白了。
4.测试结果对比
来看程序的完整代码:
import timefrom requests_html import HTMLSessionfrom fake_useragent import UserAgent as uafrom tomorrow import threadsheaders = {"User-Agent": ua().Chrome}session = HTMLSession()url_list = ["https://movie.douban.com", "http://www.1905.com/", "http://www.mtime.com/", "https://www.dy2018.com/", "http://dytt8.net", "https://www.piaohua.com/", "http://maoyan.com", "https://www.xigua110.com/", "https://www.vmovier.com/", "http://movie.kankan.com/", "https://107cine.com/", "http://movie.youku.com", "http://film.qq.com", "http://film.spider.com.cn", "https://dianying.taobao.com/", "http://www.wandafilm.com/", "http://www.dygang.net/", "http://www.bale.cn/", "http://dianying.2345.com/", "http://v.x2y4.com/"]def get_req(url, timeout=10): req = session.get(url, headers=headers, timeout=timeout) if req.status_code == 200: return req@threads(5)def async_get_req(url, timeout=10): req = session.get(url, headers=headers, timeout=timeout) if req.status_code == 200: return reqdef get_xpath(req, xpath_str): return req.html.xpath(xpath_str)[0].strip().replace("\n", "")start=time.time()for i in url_list: print(get_xpath(get_req(i),"//title//text()"))end=time.time()print("普通方式花费时间",end-start)start2 = time.time()req_list = []for url in url_list: req = async_get_req(url) req_list.append(req)for req in req_list: print(get_xpath(req, "//title//text()"))end2 = time.time()print("并发后花费时间", end2 - start2)
运行三次上面的程序记录下每次的结果
第一次:普通方式花费时间 7.883908271789551并发后花费时间 2.2888755798339844第二次:普通方式花费时间 8.522203207015991并发后花费时间 2.4674007892608643第三次:普通方式花费时间 9.062756061553955并发后花费时间 2.8703203201293945
tomorrow使用起来很简单,在普通的函数上面加个threads装饰器即可以实现并发效果,括号中的数字是表示并发的次数,经过我的测试并不是并发次数越多越好,你需要选择一个中间点,因为还会受到网速的影响,我觉得一般并发数5-10就好.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号