Python 爬虫(2)多线程
前面说过由于GIL的存在,Python的多线程效率没有希望的那么高,python的多线程适合IO密集型的情况,而爬虫恰好就是一个IO密集的情况,因为爬虫中很大一部分时间,是在等待socket返回数据。
下面写一个例子:
import requests
import time if __name__ == '__main__':
codes = ['sh600993', 'sh000006', 'sh600658', 'sh600153', 'sh600005']
start = time.time()
for code in codes:
url = 'http://hq.sinajs.cn/list=' + code
response = requests.get(url).text
print response
print time.time() - start
var hq_str_sh600993="马应龙,20.020,20.090,20.060,20.060,19.950,20.040,20.060,486809,9740634.000,2100,20.040,8300,20.030,1300,20.020,2300,20.010,4100,20.000,101,20.060,10000,20.070,14400,20.080,19000,20.090,25700,20.100,2017-01-24,11:30:00,00"; var hq_str_sh000006="地产指数,6567.8364,6574.1060,6568.6375,6577.7249,6542.6599,0,0,1486830,1392918131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2017-01-24,11:35:51,00"; var hq_str_sh600658="电子城,13.320,13.200,13.270,13.320,13.040,13.270,13.280,559733,7389992.000,30800,13.270,300,13.220,6200,13.200,2500,13.100,4900,13.090,9300,13.280,6400,13.290,8200,13.300,6900,13.310,9000,13.320,2017-01-24,11:30:00,00"; var hq_str_sh600153="建发股份,10.520,10.510,10.500,10.540,10.460,10.490,10.500,4834159,50730040.000,32800,10.490,60100,10.480,186000,10.470,181241,10.460,125800,10.450,56600,10.500,105500,10.510,108400,10.520,110400,10.530,139900,10.540,2017-01-24,11:30:00,00"; var hq_str_sh600005="武钢股份,0.000,3.710,3.710,0.000,0.000,0.000,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,2017-01-24,11:30:00,03"; 0.110999822617
换成多线程之后:
import requests
import threading
import time def get_stock(code):
url = 'http://hq.sinajs.cn/list=' + code
response = requests.get(url).text
# js_info = response.read()
print response if __name__ == '__main__':
codes = ['sh600993', 'sh000006', 'sh600658', 'sh600153', 'sh600005']
start = time.time()
threads = [threading.Thread(target = get_stock,args = (code,)) for code in codes]
for t in threads:
t.start()
for t in threads:
t.join()
print time.time()-start
var hq_str_sh600993="马应龙,20.020,20.090,20.060,20.060,19.950,20.040,20.060,486809,9740634.000,2100,20.040,8300,20.030,1300,20.020,2300,20.010,4100,20.000,101,20.060,10000,20.070,14400,20.080,19000,20.090,25700,20.100,2017-01-24,11:30:00,00"; var hq_str_sh600658="电子城,13.320,13.200,13.270,13.320,13.040,13.270,13.280,559733,7389992.000,30800,13.270,300,13.220,6200,13.200,2500,13.100,4900,13.090,9300,13.280,6400,13.290,8200,13.300,6900,13.310,9000,13.320,2017-01-24,11:30:00,00"; var hq_str_sh000006="地产指数,6567.8364,6574.1060,6568.6375,6577.7249,6542.6599,0,0,1486830,1392918131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2017-01-24,11:35:51,00"; var hq_str_sh600153="建发股份,10.520,10.510,10.500,10.540,10.460,10.490,10.500,4834159,50730040.000,32800,10.490,60100,10.480,186000,10.470,181241,10.460,125800,10.450,56600,10.500,105500,10.510,108400,10.520,110400,10.530,139900,10.540,2017-01-24,11:30:00,00"; var hq_str_sh600005="武钢股份,0.000,3.710,3.710,0.000,0.000,0.000,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,2017-01-24,11:30:00,03"; 0.0379998683929
速度有了很大的提升
线程池
import requests
import threadpool
import time def get_stock(code):
url = 'http://hq.sinajs.cn/list=' + code
response = requests.get(url).text
# js_info = response.read()
print response if __name__ == '__main__':
codes = ['sh600993', 'sh000006', 'sh600658', 'sh600153', 'sh600005']
start = time.time()
pool = threadpool.ThreadPool(5)
tasks = threadpool.makeRequests(get_stock,codes)
[pool.putRequest(task) for task in tasks]
pool.wait()
print time.time() - start
threadpool.ThreadPool定义了一个线程池,表示可以创建4个线程;
makeRequests创建了要开启多线程的函数,已经函数的参数以及回调函数,回调函数callback可以不写,默认是无。
[pool.putRequest(task) for task in tasks]是将所有多线程的请求扔进了线程池,等价于
for code in codes:
pool.putRequest(code)
pool.wait()是等待所有工作完成后退出。这里执行的数量还比较少,基本的多线程就够用了,当数量多了起来之后,线程池的效果会好一些。
Python 爬虫(2)多线程的更多相关文章
- python爬虫之多线程、多进程+代码示例
python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...
- Python爬虫之多线程下载豆瓣Top250电影图片
爬虫项目介绍 本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
- Python爬虫之多线程下载程序类电子书
近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音.其页面如下: 那么我们是否可以通过Py ...
- Python爬虫之多线程
详情点我跳转 关注公众号"轻松学编程"了解更多. 多线程 在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全 ...
- python爬虫之多线程、多进程、GIL锁
背景: 我们知道多线程要比多进程效率更高,因为线程存在于进程之内,打开一个进程的话,首先需要开辟内存空间,占用内存空间比线程大.这样想也不怪,比如一个进程用10MB,开10个进程就得100MB的内存空 ...
- 【新手必学】Python爬虫之多线程实战
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:清风化煞_ 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
- Python爬虫进阶 | 多线程
一.简介 为了提高爬虫程序效率,由于python解释器GIL,导致同一进程中即使有多个线程,实际上也只会有一个线程在运行,但通过request.get发送请求获取响应时有阻塞,所以采用了多线程依然可以 ...
- 爬虫篇-python爬虫中多线程的使用
queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...
- Python爬虫练习(多线程,进程,协程抓取网页)
详情点我跳转 关注公众号"轻松学编程"了解更多. 一.多线程抓取网页 流程:a.设置种子url b.获取区域列表 c.循环区域列表 d.创建线程获取页面数据 e.启动线程 impo ...
- Python爬虫的N种姿势
问题的由来 前几天,在微信公众号(Python爬虫及算法)上有个人问了笔者一个问题,如何利用爬虫来实现如下的需求,需要爬取的网页如下(网址为:https://www.wikidata.org/w/ ...
随机推荐
- ubuntu 系统提示升级失败,boot空间不足
系统提示升级失败,boot空间不足,解决方法: linux 随着系统的升级,会自动攒下好几个内核 执行 uname -a 看下自己当前启动的是哪个内核 dpkg --get-selections |g ...
- css3实现立方体,并且自转效果
先是HTML 一个父div包含四个绝对定位的div <div class='container container--realistic'> <div class='cube cub ...
- javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)
//十进制转其他 var x=110; alert(x); alert(x.toString(8)); alert(x.toString(32)); alert(x.toString(16)); // ...
- U2随笔
Html 结构化 CSS 样式 JavaScript 行为交互 1.JavaScript基础 2.JavaScript操作BOM对象 3.JavaScript操作DOM对象***** 4.JavaSc ...
- Unity Shader基础
Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...
- C和指针之学习笔记(2)
第6章 指针 1.在一组字符串中查找字符: #include<stdio.h> #include<assert.h> #include<stdlib.h> #def ...
- cocos2d-android 使用 cocos2d 绘图
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha cocos2d-android-1 https://github.com/ZhouWei ...
- Varnish与Squid的对比
Varnish与Squid的对比 说到Varnish,就不能不提Squid.Squid是一个高性能的代理缓存服务器,它和Varnish相比较有诸多的异同点,下面进行分析. 下面是Varnish与Squ ...
- [NC13C]形态形成场/[Gym100430B]Divisible Substrings
[NC13C]形态形成场/[Gym100430B]Divisible Substrings 题目大意: 有\(m(m\le26)\)个字符串替换式\(S_i(|S_i\le100|)\),表示某个大写 ...
- scp使用笔记
yum install openssh-clients 就能使用了 上传 microgolds-prodeMacBook-Pro:Desktop mg$ sudo scp /Users/mg/Desk ...