上周刚学习了python的多线程,这周写个速度对比测试一下,也是我的博客园第一篇文章
算是一次不太合格的关于python多线程的文章,不过当做对于我上周学习的总结和实践,我还是满意的
代码都放在了https://github.com/robzza/python 这里
爬取的地址是 http://www.xinfadi.com.cn/
通过url分析页面很简单,第一页是list/1 一直到最后一页list/15525
http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml
http://www.xinfadi.com.cn/marketanalysis/0/list/15525.shtml
通过列表生成器加上for循环就能得到所有的url地址,没反爬,连 user-agent都不用添加
分析下我们内容存储的数据
都在td标签内,需要注意的一点是tbody标签是谷歌浏览器自动添加的,通过requests返回的是没有的
第一个tr标签是标题,所以用[1:]取除去第一个后面的内容
先爬取到一页的数据,恩,没问题,然后通过for循环替换url获取每页的数据:
由于时间关系,就只获取了前1000页数据,
一页20条内容,1000页就是20000加上第一行的标题,20001,没问题的
单线程花了快587秒,接近10分钟,太慢了
50线程的多线程只要了134秒,快了5 倍。下面我们加大线程试试,200线程
恩,发包很快,但是卡很久了,感觉肯定是要比50线程还慢,对相同的网址要等他返回,单纯加大线程并不能让速度变快
我还手动访问连接测试了下是不是发包太快ban ip了,很久没返回,不等了,减到100线程再试
100秒,还是能快点
下面是多进程,python真是太棒了,多线程和多进程的语法完全一样,只需要把
ThreadPoolExecutor()改成ProcessPoolExecutor()就能使用多进程了
119秒,再试一次
55秒-------------------------八嘎
这怎么比啊,那是不是我前面多线程的在重新试试两次也能再快点,那跑3次,取最快的一次,都是50线程/进程
两次35s,一次55s,取最快的35s
根据目标网站网速使用合适的线程,过大的线程只会让速度更慢
下面是协程
而且鬼校园网一大批量发包就掉线,跑1000页的协程每次点开始我就断网
协程就跑100页的吧
由于受网络波动影响较大,所以起的是个人总结,不能做速度方面的对比