基于Python的urllib2模块的多线程网络爬虫程序

  1 m Queue import Queue
  2 from gzip import GzipFile
  3 from StringIO import StringIO
  4 import time
  5 import socket
  6 class ContentEncodingProcessor(urllib2.BaseHandler):
  7   """A handler to add gzip capabilities to urllib2 requests """
  8
  9   # add headers to requests
 10   def http_request(self, req):
 11     req.add_header("Accept-Encoding", "gzip, deflate")
 12     return req
 13
 14   # decode
 15   def http_response(self, req, resp):
 16     old_resp = resp
 17
 18    # if(resp.geturl() != req):
 19     #    print ‘no‘
 20      #   return 1
 21     # gzip
 22     if resp.headers.get("content-encoding") == "gzip":
 23         gz = GzipFile(
 24                     fileobj=StringIO(resp.read()),
 25                     mode="r"
 26                   )
 27         resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code)
 28         resp.msg = old_resp.msg
 29     # deflate
 30     if resp.headers.get("content-encoding") == "deflate":
 31         gz = StringIO( deflate(resp.read()) )
 32         resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code)  # ‘class to add info() and
 33         resp.msg = old_resp.msg
 34     return resp
 35
 36 # deflate support
 37 import zlib
 38 def deflate(data):   # zlib only provides the zlib compress format, not the deflate format;
 39   try:               # so on top of all there‘s this workaround:
 40     return zlib.decompress(data, -zlib.MAX_WBITS)
 41   except zlib.error:
 42     return zlib.decompress(data)
 43
 44
 45 #(set timeout)
 46 socket.setdefaulttimeout(10)
 47
 48 encoding_support = ContentEncodingProcessor
 49 opener = urllib2.build_opener( encoding_support, urllib2.HTTPHandler)
 50
 51 class Fetcher:
 52     def __init__(self,threads):
 53         self.opener = urllib2.build_opener(urllib2.HTTPHandler)
 54         self.lock = Lock() #线程锁
 55         self.q_req = Queue() #任务队列
 56         self.q_ans = Queue() #完成队列import socket
 57         self.threads = threads
 58         for i in range(threads):
 59             t = Thread(target=self.threadget)
 60             t.setDaemon(True)
 61             t.start()
 62         self.running = 0
 63
 64     def __del__(self): #解构时需等待两个队列完成
 65         time.sleep(0.5)
 66         self.q_req.join()
 67         self.q_ans.join()
 68
 69     def taskleft(self):
 70         return self.q_req.qsize()+self.q_ans.qsize()+self.running
 71
 72     def push(self,req):
 73         self.q_req.put(req)
 74
 75     def pop(self):
 76         return self.q_ans.get()
 77
 78     def threadget(self):
 79         while True:
 80             ans = ‘‘
 81             req = self.q_req.get()
 82      #       print req
 83
 84             with self.lock: #要保证该操作的原子性,进入critical area
 85                 self.running += 1
 86
 87             try:
 88 #               ans = self.opener.open(req).read()
 89                #content =  opener.open(req).read()
 90                 content = urllib2.urlopen(req).read()
 91             #    print temp.geturl()
 92             #    print req
 93             #    add gzip support from here
 94                 ans = str(content)
 95             except Exception, what:
 96                 print what
 97                 pass
 98
 99             self.q_ans.put((ans,req))
100             with self.lock:
101                 self.running -= 1
102             self.q_req.task_done()
103             time.sleep(0.01) # don‘t spam
104
105 if __name__ == "__main__":
106     a = [0] * 3600000
107     links = [ ‘http://www.songtaste.com/song/%d/‘%i for i in range(1,3600000) ]
108     f = Fetcher(threads=50)
109     for url in links:
110         f.push(url)
111     while f.taskleft():
112         the_page,x =f.pop()
113        # print the_page
114         try:
115           npos = the_page.index(‘chart#fav‘)
116         except :
117           pass
118         else:
119            for j in range(npos,1,-1):
120             if the_page[j] == ‘,‘:
121                 k = j
122                 break
123            sum = 0 ;
124            t = 1 ;
125            for j in range(k-1,1,-1):
126               if  the_page[j] <= ‘9‘ and the_page[j] >=‘0‘:
127                   sum = sum + (int(the_page[j]) - int(‘0‘)) * t
128                   t *= 10;
129               else :
130                   break
131            p = int(x[30:-1])
132            if(p % 10000 <= 5  )
133            a[p] = sum
134            if sum != 0:
135                 print p
136                 print sum
137     

基于Python的urllib2模块的多线程网络爬虫程序,布布扣,bubuko.com

时间: 2024-10-26 20:52:51

基于Python的urllib2模块的多线程网络爬虫程序的相关文章

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本。

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本.

基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看)

前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超高智商的反爬虫技术. 一.什么是爬虫? 很多人说我们这些搞软件的人,总喜欢把虚拟世界里的事物跟现实中的东西扯上关系.这点我真不否认,脱离了现实,我们伟大的创举还有何意义? “爬虫”就是个例子,它对于我们开发人员而言,就是一段用来自动化采集网站数据的程序,结果跟现实中的虫子扯上了关系.听说是Googl

【转】 基于C#.NET的高端智能化网络爬虫

[转] 基于C#.NET的高端智能化网络爬虫 前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超高智商的反爬虫技术. 一.什么是爬虫? 很多人说我们这些搞软件的人,总喜欢把虚拟世界里的事物跟现实中的东西扯上关系.这点我真不否认,脱离了现实,我们伟大的创举还有何意义? "爬虫"就是个例子,它对于我们开发人员而言,就是一段用来自动化采集网站数

【转】 基于C#.NET的高端智能化网络爬虫 2

[转] 基于C#.NET的高端智能化网络爬虫2 本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之不理.因此就诞生了上一篇基础爬虫以及这一篇高级爬虫的开发教程. 有人评论我上一篇的简单爬虫:代码太过简单以至于弱爆了,真是被这群有文化的孩子给雷到了!不得不猜测你是不是携程网的托儿,我还没写完你咋就知道弱爆了?看来不下点猛料你是得不到满足啊! 今天我们就来学习高级爬虫的开发,同时我们还要利用之前的简

Python写的网络爬虫程序(很简单)

Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现. python程序如下: import re,urllib strTxt="" x=1 ff=open("wangzhi.txt","r") for line in ff.readlines(): f=open(str(x)+".txt&

crawler4j:轻量级多线程网络爬虫

crawler4j是Java实现的开源网络爬虫.提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫. 安装 使用Maven 使用最新版本的crawler4j,在pom.xml中添加如下片段: XHTML 1 2 3 4 5 <dependency> <groupId>edu.uci.ics</groupId> <artifactId>crawler4j</artifactId> <version>4.1</version

crawler4j:轻量级多线程网络爬虫实例

crawler4j是Java实现的开源网络爬虫.提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫. 下面实例结合jsoup(中文版API),javacvs 爬取自如租房网(http://sh.ziroom.com/z/nl/)租房信息. 1.maven导入相关包 1 <dependency> 2 <groupId>edu.uci.ics</groupId> 3 <artifactId>crawler4j</artifactId> 4 &

基于Python的datetime模块和time模块源码阅读分析

目录 1 前言  2 datetime.pyi源码分步解析 2.1 头部定义源码分析 2.2 tzinfo类源码分析 2.3 date类源码分析 2.4 time类源码分析 2.5 timedelta类源码分析 2.6 datetime类源码分析 2.7 格式化字符串 3 time模块time.pyi源码解析 1 前言 最近工作需求上对于datetime模块中的方法调用比较多,有时还要返回指定的格式,以及大小比较等情况.发现使用Python自带的datetime模块可以很好地实现相关需求,但是对

基于C#.NET的高端智能化网络爬虫(二)(攻破携程网)

本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之不理.因此就诞生了上一篇基础爬虫以及这一篇高级爬虫的开发教程. 有人评论我上一篇的简单爬虫:代码太过简单以至于弱爆了,真是被这群有文化的孩子给雷到了!不得不猜测你是不是携程网的托儿,我还没写完你咋就知道弱爆了?看来不下点猛料你是得不到满足啊! 今天我们就来学习高级爬虫的开发,同时我们还要利用之前的简单爬虫程序,来实现分布式爬虫的Links Mas