单线程、多线程、多进程、协程比较,以爬取新浪军事历史为例

演示python单线程、多线程、多进程、协程

  1 import requests,json,random
  2 import re,threading,time
  3 from lxml import etree
  4
  5 lock=threading.Lock()
  6 semaphore=threading.Semaphore(100)   ###每次限制只能100线程
  7
  8 user_agent_list = [   9         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" , 10         "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",  11         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",  12         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",  13         "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",  14         "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",  15         "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",  16         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",  17         "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",  18         "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",  19         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",  20         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",  21         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",  22         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",  23         "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",  24         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",  25         "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",  26         "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
 27     ]
 28 count=0
 29
 30 def sina(page_url):    ##列表页
 31     if semaphore.acquire():
 32         header={}
 33
 34         header[‘User-Agent‘]=random.choice(user_agent_list)
 35         header.update({
 36             "Host":"platform.sina.com.cn",
 37
 38             #"Cookie":"global_cookie=fb1g6d0w64d2cmu86sv4g9n3va0j137sk48; vh_newhouse=3_1491312022_2816%5B%3A%7C%40%7C%3A%5D833300ee3177d88529c7aa418942ece9; newhouse_user_guid=2F163DE7-8201-7FA9-2FB6-E507FE6F03B1; SoufunSessionID_Esf=3_1495389730_232; sf_source=; s=; showAdsh=1; hlist_xfadhq_SZ=0%7c2017%2f5%2f25+1%3a21%3a47%7c; city=sz; __utmt_t0=1; __utmt_t1=1; __utmt_t2=1; logGuid=a768dd46-b85b-47f4-a7a0-0a6596cab4cd; __utma=147393320.1111837171.1491290389.1495646208.1495650134.9; __utmb=147393320.12.10.1495650134; __utmc=147393320; __utmz=147393320.1495650134.9.4.utmcsr=esf.sz.fang.com|utmccn=(referral)|utmcmd=referral|utmcct=/; unique_cookie=U_cqyov4ut5vv1al8e2858qhzgt17j2z06mph*14"
 39             })
 40         while(1):
 41             content=‘‘
 42             try:
 43                 content=requests.get(page_url,headers=header,timeout=5).content
 44
 45             except Exception as e:
 46                 print e
 47             if content!=‘‘:
 48                 break
 49
 50
 51
 52
 53         jsona=re.findall(‘jQuery191012358189839869738_1495880348059\(([\s\S]*?"}]}})‘,content)[0]
 54         #print jsona
 55         dict= json.loads(jsona)
 56         #print type(dict)
 57         #print dict
 58         #print dict[‘result‘][‘data‘]
 59         for l in dict[‘result‘][‘data‘]:
 60             title= l[‘title‘]
 61             url= l[‘url‘]
 62             biaoqian=get_biaoqian(url)
 63
 64             lock.acquire()
 65             global count
 66             count+=1
 67             print time.strftime(‘%H:%M:%S‘,time.localtime(time.time())),‘    ‘,count
 68             print ‘列表页:‘
 69              70             print ‘ title: %s\n url: %s‘%(title,url)
 71
 72             print ‘详情页:‘
 73             print ‘ biaoqian: %s \n‘%(biaoqian)
 74             print ‘**************************************************************‘
 75             lock.release()
 76
 77         semaphore.release()
 78
 79
 80
 81 def get_biaoqian(url):    ###新闻页,爬取标签
 82
 83     header={‘User-Agent‘:random.choice(user_agent_list)}
 84     header.update({"Host":"mil.news.sina.com.cn"})
 85
 86     while(1):
 87         content=‘‘
 88         try:
 89             content=requests.get(url,headers=header,timeout=10).content
 90         except Exception as  e:
 91             #print e
 92             pass
 93         if content!=‘‘:
 94             break
 95
 96
 97     se=etree.HTML(content)
 98     #print etree.tounicode(se)
 99     biaoqian=se.xpath(‘//p[@class="art_keywords"]/a/text()‘)
100     return  ‘ ‘.join(biaoqian)
101
102
103
104
105 def singe_req():
106     for i in range(1,301):
107         page_url=‘http://platform.sina.com.cn/news/news_list?app_key=2872801998&channel=mil&cat_1=lishi&show_all=0&show_cat=1&show_ext=1&tag=1&format=json&page=%s&show_num=10&callback=jQuery191012358189839869738_1495880348059&_=1495880348069‘%i
108         sina(page_url)
109     print ‘over‘
110
111 def threading_red():
112     threads=[]
113     for i in range(1,301):
114         t=threading.Thread(target=sina,args=(‘http://platform.sina.com.cn/news/news_list?app_key=2872801998&channel=mil&cat_1=lishi&show_all=0&show_cat=1&show_ext=1&tag=1&format=json&page=%s&show_num=10&callback=jQuery191012358189839869738_1495880348059&_=1495880348069‘%i,))
115         threads.append(t)
116         t.start()
117     for t in threads:
118         t.join()
119     print ‘over‘
120
121 def  muiltiprocessing_req():
122     import multiprocessing
123     pool = multiprocessing.Pool(100)
124     #pool = multiprocessing.Pool(multiprocessing.cpu_count())
125
126     pool.map(sina, [‘http://platform.sina.com.cn/news/news_list?app_key=2872801998&channel=mil&cat_1=lishi&show_all=0&show_cat=1&show_ext=1&tag=1&format=json&page=%s&show_num=10&callback=jQuery191012358189839869738_1495880348059&_=1495880348069‘%i for i in range(1,301)])
127     pool.close()
128     pool.join()
129     print ‘over‘
130
131 def gevent_req():
132     ######################利用pool######################
133     from gevent import monkey
134     from gevent.pool import Pool
135
136     monkey.patch_all()
137     pool = Pool(100)
138     data= pool.map(sina, [‘http://platform.sina.com.cn/news/news_list?app_key=2872801998&channel=mil&cat_1=lishi&show_all=0&show_cat=1&show_ext=1&tag=1&format=json&page=%s&show_num=10&callback=jQuery191012358189839869738_1495880348059&_=1495880348069‘%i for i in range(1,301)])
139     print ‘over‘
140
141 if __name__==‘__main__‘:
142     pass
143     singe_req()                     ##单线程
144     #threading_red()                  ###多线程
145     #muiltiprocessing_req()             ####多进程146     #gevent_req()                      ##协程

这篇主要是用四种方法来实现爬虫。无论是100线程还是100进程或者100协程,网速都撑满了,爬取速度很快,单线程对网速利用很不充分,当然就爬取缓慢。

特别是我之前在面试房极客时候,那主管告诉我,他说他看了网上说python多线程是假的,所以他从来就没使用过多线程,只用多进程,他认为多线程不能加快爬虫速度。

关于这一点我是非常确定python多线程能加快爬取速度的,因为我使用多线程的时间很长,那主管应该只看了一半,python对cpu密集型速度提升不了多少,但对于io密集型的速度提升是立竿见影的,特别是对timeout比较大的网站,多线程爬取优势非常明显,因为爬虫是打开页面,请求服务器后端,服务器后端操作数据库查询数据,数据库返回给后端返回给前段,这种属于io密集型,多线程在爬虫和性能测试都是可以的。而多进程实在是开销太大了,开100进程,任务管理器可以看到100个python.exe,每个占用20M内存,多进程启动时候占用cpu极高。爬虫是非常适合多线程的,或者利用协程也可以。

发下运行结果:

时间: 2024-10-22 02:10:46

单线程、多线程、多进程、协程比较,以爬取新浪军事历史为例的相关文章

1)④爬取新浪军事新闻,并把内容存放到相应的文件夹中

1 __author__ = 'minmin' 2 #coding:utf-8 3 import re,urllib,sgmllib,os 4 5 #根据当前的url获取html 6 def getHtml(url): 7 page = urllib.urlopen(url) 8 html = page.read() 9 page.close() 10 return html 11 12 #根据html获取想要的文章内容 13 def func(str): 14 result= re.finda

爬虫协程比线程爬取速度更快?

先做个小示例,不用废话谈理论,没有实践的空谈都是扯蛋误导人. # coding=utf-8 import requests,time count=0 urlx= 'http://www.xxsy.net/' # 'http://www.danmeila.com/' http://www.sina.com.cn/ 'http://www.qingkan9.com/' # # 'http://www.qingkan9.com/' def fun(url): try: print url resp=r

爬虫练手,爬取新浪双色彩,信息并进行分析

爬虫练手,爬取新浪双色彩,信息并进行分析 import requests from lxml.html import etree url = 'http://zst.aicai.com/ssq/betOrder/' response = requests.get(url) response_html = etree.HTML(response.text) text_path = '/html/body/div[7]/form/div[2]/table/tbody/tr/td/text()' da

关于爬取新浪首页显示乱码的解决办法

爬取新浪的主页面,想采集主要页面的新闻板块的主要条目 import requests from bs4 import BeautifulSoup import re html = requests.get("https://www.sina.com.cn") bsobj = BeautifulSoup(html.text) title=bsobj.find_all("a",{"href":re.compile("https://news

多线程 多进程 协程 Queue(爬虫代码)

快速理解多进程与多线程以及协程的使用场合和特点 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都是一种CPU的执行单元. 进程:表示一个程序的上下文执行活动(打开.执行.保存...) 线程:进程执行程序时候的最小调度单位(执行a,执行b...) 一个程序至少有一个进程,一个进程至少有一个线程. 并行 和 并发: 并行:多个CPU核心,不同的程序就

多线程/多进程/协程

占用的资源:进程>线程>协程 进程:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文 进程的颗粒度太大,每次都要有上下的调入,保存,调出. 线程:一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成:这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段 https://www.zhihu.com/questi

【爬虫笔记】第一次写爬虫,爬取新浪新闻网标题

昨晚在网易云课堂上看到了这个爬虫教程,是个基础入门教程,看了几节课,按照示例也去爬了一下新闻标题 课程一些截图:

python2.7 爬虫初体验爬取新浪国内新闻_20161130

python2.7 爬虫初学习 模块:BeautifulSoup requests 1.获取新浪国内新闻标题 2.获取新闻url 3.还没想好,想法是把第2步的url 获取到下载网页源代码 再去分析源代码 获取新闻详情页 发表时间 新闻来源等数据 结合MySQLdb模块导入到数据库 4.疑惑:期望是整体获取这些字段 发表时间 发布标题 新闻详情内容 新闻来源 任重而道远..都想拜个老师带带了.. #coding:utf-8 import requests from bs4 import Beau

单线程实现并发——协程,gevent模块

一 并发的本质 1 切换 2 保存状态 二 协程的概念 协程,又称微线程,纤程.英文名Coroutine.单线程下实现并发,用户从应用程序级别控制单线程下任务的切换,注意一定是遇到I/O才切. 协程的特点在于是一个线程执行,那和多线程比,协程有何优势? 最大的优势就是协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显. 第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中