设为首页 收藏本站
查看: 1159|回复: 0

[经验分享] 使用python多线程实现一个简单spider

[复制链接]

尚未签到

发表于 2015-4-21 10:40:15 | 显示全部楼层 |阅读模式
  老习惯,先看看别人的工作。推荐看看 我的知识库(1)--Java 搜索引擎的实现— 网络爬虫 文章把相关概念讲的很详细了。
  老样子,我也是初学者,通过本次学习主要掌握以下几点:
  1.了解python 网络编程
  2.了解python多线程锁机制
  3.掌握python re模块match使用
  那么开始吧
  1.使用python抓取一个网页的内容
  使用urllib模块



1 def getWebPage(url):
2     wp = urllib.urlopen(url)
3     content = wp.read()
4     return content
  2.对抓取到的网页内容进行分析,提取有用URL
抓到的数据是用str存储的,下面使用python里的re.split()和re.match()



1 def analysisPage(content):
2     strlist = re.split('\"',content)
3     urlset = set([])
4     for str in strlist:
5         if re.match('http://www.iyunv.com(/|\w)+', str):
6                 urlset.add(str + '\n')
7     return list(urlset)
  园里关于python的html解析的文章很多,看的我眼花缭乱,这里就不一一列举了。
  这里有个问题,我把match里的pattern改成 ’http://www.iyunv.com(/|\w)+html$' 就
  匹配不出结果了,不知道什么原因,哪位大神知道。
  3.多线程
  主要用了一个urllist和一个urlset。
  urlset用来存储已经访问过的网页url,urllist用来存储待访问的网页url
  申请四个线程并行的对urllist的url进行页面抽取,提取页面url加入到urllist中
  为了互斥使用urllist和urlset,引入了listlock和setlock两把锁
  全部代码如下:



1 import re
2 import urllib
3 import threading
4
5 def getWebPage(url):
6     wp = urllib.urlopen(url)
7     content = wp.read()
8     return content
9
10 def analysisPage(content, urllist, urlset):
11     strlist = re.split('\"',content)
12     geturlset = set([])
13     for str in strlist:
14         if re.match('http://www.iyunv.com/(/|\w)+', str):
15             geturlset.add(str + '\n')
16
17     setlock.acquire()
18     geturlset = geturlset - urlset
19     setlock.release()
20
21     listlock.acquire()
22     for url in list(geturlset):
23         urllist.append(url)
24     listlock.release()
25
26 class MyThread(threading.Thread):
27     def __init__(self, urllist, urlset):
28         threading.Thread.__init__(self)
29         self.urllist = urllist
30         self.urlset = urlset
31
32     def run(self):
33         while True:
34             listlock.acquire()
35             if self.urllist:
36                 url = self.urllist.pop(0)
37                 listlock.release()
38             else:
39                 listlock.release()
40                 break
41
42             setlock.acquire()
43             if len(self.urlset) >= 50:
44                 setlock.release()
45                 break
46             else:
47                 if url in self.urlset:
48                     setlock.release()
49                     continue
50                 else:
51                     self.urlset.add(url)
52                     setlock.release()
53                     content = getWebPage(url)
54                     analysisPage(content, self.urllist, self.urlset)
55
56 listlock = threading.RLock()
57 setlock = threading.RLock()
58
59 if __name__ == '__main__':
60     starturl = 'http://www.iyunv.com/\n'
61     content = getWebPage(starturl)
62     #urlset存放已访问过的网页url
63     #urllist存放待访问的网页url
64     urlset = set([starturl])
65     urllist = []
66     analysisPage(content, urllist, urlset)   
67     tlist = []
68     for i in range(4):
69         t = MyThread(urllist, urlset)
70         t.start()
71         tlist.append(t)
72     for t in tlist:
73         t.join()
74     f = open('url.txt', 'w')
75     f.writelines(list(urlset))
76     f.close()
  当urlset集合的元素超过50时就停止,当这个数值较大时,socket会出问题,我也不知道什么原因,应该和网络有关。
  完
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59165-1-1.html 上篇帖子: 百度云计算平台Python环境试用 下篇帖子: Python和Node.js支持尾递归吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表