- 浏览: 107580 次
文章分类
最新评论
不用编码也是可以匹配邮箱的。
下面是一个用队列实现,广度优先的简单爬虫代码。先就这样吧,目测暂时不会再理它了,以后有时间再修改。
2013.5.13 update
本来想在加个多线程。。。。结果看了 好多资料 无处下手,再研究研究 ,日后再改
加了点 url规范化。代码整理如下:
下面是一个用队列实现,广度优先的简单爬虫代码。先就这样吧,目测暂时不会再理它了,以后有时间再修改。
1 # -*- coding: cp936 -*- 2 import urllib2 3 import re 4 from pyquery import PyQuery as pq 5 from lxml import etree 6 7 #mailpattern = re.compile('[^\._:>\\-][\w\.-]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+') 8 mailpattern = re.compile('[A-Za-z0-9_]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+') 9 10 htmlcount = 0 #to count the urls 11 maxcount = 3000 # the max count 12 allUrls = set() 13 allMails = set() 14 UrlsQlist = [] 15 UrlsQdict = {} 16 url = "http://www.163.com" 17 fmails = open("E:/py/crawler/mailresult.txt","a") 18 furls = open("E:/py/crawler/urlresult.txt","a") 19 20 21 22 23 def geturls(data):#the function to get the urls in the html 24 urls = set() 25 if data: 26 d = pq(data) 27 label_a = d.find('a')#用pyquery库去找到 a 标签. 28 if label_a: 29 label_a_href = d('a').map(lambda i,e:pq(e)('a').attr('href')) 30 for u in label_a_href: 31 if u[0:10]!="javascript" : 32 if u[0:4] == "http": 33 urls.add(u) 34 else: 35 urls.add(url + u) 36 #for u in urls: 37 #print u 38 return urls 39 else: 40 return None 41 42 def gethtml(url): 43 try: 44 fp = urllib2.urlopen(url) 45 except: 46 print "urllib2.urlopen error" 47 return None 48 else: 49 mybytes =fp.read() 50 fp.close() 51 return mybytes 52 53 def savemails(data): # the function to save the emails 54 if data: 55 mailResult = mailpattern.findall(data) 56 mailResultset = set(mailResult) 57 if mailResultset: 58 allMails.update(mailResultset) 59 60 def savehtml(pagecontent,count): 61 if pagecontent != None: 62 f = open("E:/py/crawler/html/"+str(count)+".html","w") 63 f.write(pagecontent) 64 f.close() 65 else: 66 f = open("E:/py/crawler/html/"+str(count)+"error"+".html","w") 67 f.write("this page empty") 68 f.close() 69 70 def BFS(firstUrl): 71 global htmlcount 72 global maxcount 73 allUrls.add(firstUrl) 74 UrlsQlist = list(allUrls) 75 while htmlcount < maxcount : #数量小于最大值 76 tempUrl = UrlsQlist.pop(0)# the queue 77 myWebStr = gethtml(tempUrl) 78 savehtml(myWebStr,htmlcount) 79 savemails(myWebStr) 80 firstUrls_set = geturls(myWebStr)#初始页面的处理 81 if firstUrls_set != None: 82 allUrls.update(firstUrls_set) #记录全部 url 83 for u in firstUrls_set: 84 if u not in UrlsQlist: 85 UrlsQlist.append(u) 86 htmlcount = htmlcount + 1 87 88 89 BFS(url) 90 for u in allMails: 91 try: 92 fmails.write(u) 93 fmails.write('\n') 94 except: 95 continue 96 for u in allUrls: 97 try: 98 furls.write(u) 99 furls.write('\n') 100 except: 101 continue 102 fmails.close() 103 furls.close()
2013.5.13 update
本来想在加个多线程。。。。结果看了 好多资料 无处下手,再研究研究 ,日后再改
加了点 url规范化。代码整理如下:
1 import urllib2 2 import re 3 from pyquery import PyQuery as pq 4 from lxml import etree 5 import urlparse 6 import time 7 8 allUrls = set() 9 allMails = set() 10 urlsDownlist = [] 11 12 class mailCrawler: 13 def __init__(self,mailExpression,start_url,maxcount): 14 ''' mailExpressoin 邮箱的正则表达式; 15 start_url开始邮箱; 16 maxcount最大数量''' 17 self.mailpattern = re.compile(mailExpression) 18 self.maxcount = maxcount 19 self.htmlcount = 0 20 self.UrlsQlist = []#url queue 实现广度优先 21 self.url = start_url 22 23 24 def url_normal(self,url): 25 '''url 规范化 ''' 26 scheme,netloc,path,query = urlparse.urlsplit(url)[:4] 27 netloc = netloc.lower() 28 29 url.encode("utf-8") 30 31 if path: 32 path = re.sub('/{2,}','/',path)#去除url中的重复/ 33 path = re.sub(r'\.$','',path)#去除url中结尾多余的点 34 path = re.sub('/$','',path)#去除url中结尾多余的/ 35 path = re.sub('\s','',path)#取出url中的空格 36 if query: 37 return '%s://%s%s?%s' % (scheme,netloc,path or '/',query) 38 else: 39 return '%s://%s%s' % (scheme,netloc,path) 40 41 def geturls(self,data): 42 '''解析html中的url''' 43 urls = set() 44 if data: 45 d = pq(data) 46 label_a = d.find('a')#用pyquery库去找到 a 标签. 47 if label_a: 48 label_a_href = d('a').map(lambda i,e:pq(e)('a').attr('href')) 49 for u in label_a_href: 50 if u[0:10]!="javascript" and u[0:6]!="mailto" : 51 if u[0:4] == "http": 52 normal_url = self.url_normal(u) 53 urls.add(normal_url) 54 else: 55 normal_url = self.url_normal(self.url + u) 56 urls.add(normal_url) 57 return urls 58 else: 59 return None 60 61 def gethtml(self,url): 62 '''下载html 5s超时''' 63 try: 64 fp = urllib2.urlopen(url,None,5) 65 except: 66 print "urllib2.urlopen error or timeout" 67 return None 68 else: 69 mybytes =fp.read() 70 fp.close() 71 return mybytes 72 73 def savemails(self,data): 74 '''将抓取到的url存放到 allmails中 ,set去重复''' 75 global allMails 76 if data: 77 mailResult = self.mailpattern.findall(data) 78 mailResultset = set(mailResult) 79 if mailResultset: 80 allMails.update(mailResultset) 81 82 def savehtml(self,pagecontent,htmlcount,url): 83 '''保存html文件 ''' 84 if pagecontent != None: 85 f = open("E:/py/crawler/html/"+str(htmlcount)+".html","w") 86 f.write(pagecontent) 87 f.close() 88 else: 89 f = open("E:/py/crawler/html/"+str(htmlcount)+"error"+".html","w") 90 try: 91 f.write(url) 92 except: 93 f.write("encode error") 94 f.close() 95 96 def BFS(self): 97 '''用队列实现广度优先,爬取url ''' 98 global allUrls 99 global urlsDownlist 100 allUrls.add(self.url) 101 self.UrlsQlist = list(allUrls) 102 while self.htmlcount < self.maxcount : #数量小于最大值 103 tempUrl = self.UrlsQlist.pop(0)# the queue 104 print tempUrl 105 urlsDownlist.append(tempUrl) 106 myWebStr = self.gethtml(tempUrl) 107 self.savehtml(myWebStr,self.htmlcount,tempUrl) 108 self.savemails(myWebStr) 109 firstUrls_set = self.geturls(myWebStr)#初始页面的处理 110 if firstUrls_set != None: 111 for u in firstUrls_set: 112 if u not in allUrls: 113 allUrls.add(u) 114 self.UrlsQlist.append(u) 115 self.htmlcount = self.htmlcount + 1 116 117 118 def main(): 119 reg = r'[A-Za-z0-9_]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+' 120 url = "http://www.baidu.com" 121 count = 100 122 fmails = open("E:/py/crawler/mailresult.txt","a") 123 furls = open("E:/py/crawler/urlresult.txt","a") 124 fdownUrls = open("E:/py/crawler/urlDownresult.txt","a") 125 newcrawler = mailCrawler(reg,url,count) 126 newcrawler.BFS() 127 for u in allMails: 128 try: 129 fmails.write(u) 130 fmails.write('\n') 131 except: 132 continue 133 for u in allUrls: 134 try: 135 furls.write(u) 136 furls.write('\n') 137 except: 138 continue 139 for u in urlsDownlist: 140 try: 141 fdownUrls.write(u) 142 fdownUrls.write('\n') 143 except: 144 continue 145 fmails.close() 146 furls.close() 147 fdownUrls.close() 148 149 if __name__ == '__main__': 150 main()
发表评论
-
python3简单爬虫代码
2014-06-13 16:45 2098一个python实现的网络爬虫代码。 写了个python3 ... -
python抓取网页图片python爬虫
2014-05-05 17:01 868python抓取网页图片示例(python爬虫) - ... -
python访问纯真IP数据库
2014-03-20 09:17 470通过IP地址判断客户端是网通的还是电信的。 使用一个纯文本 ... -
Python和MD5网站挂马检测程序
2014-03-13 17:02 782系统管理员通常从svn/git中检索代码,部署站点后通常首先会 ... -
python登陆Tom邮箱的代码一例
2013-05-22 07:06 3702本文出处参考:http://www.cnblogs.com/L ... -
python实现登录QQ邮箱发信的代码
2013-05-22 07:03 2090python登录QQ邮箱发信的代码。 # -*- codin ... -
python自动登录126等邮箱的代码
2013-05-22 07:00 2367本节python教程,为大家介绍,用 python实现自动登录 ... -
python处理utf8编码中文及打印中文列表和字典的方法
2013-05-18 04:01 947python处理utf8编码中文,需要在py文件的第一行加入: ... -
Python序列的切片操作技巧总结
2013-05-18 03:57 1099序列 序列(consequence)是python中一种数据 ... -
有关Python中递归的最大次数
2013-05-18 03:47 1227看到一个同学问递归最多达到多少次,因为在他跑的时候,次数有时多 ... -
重命名批处理的python脚本
2013-04-06 22:31 750采集的视网膜图像放在一个文件夹下,分类十分混乱,出现了一个文件 ...
相关推荐
python爬取百度文库实例,代码可见,仅用于学习研究,不可用于各种商业私有用途,
利用python中的re和requests模块,实现对网站中的视频进行爬取,对于图片和文字的爬取也是同样的原理,重点是学会就网页html标签的正确正则就能获取到我们需要的数据,这里是用的单线程爬取
python爬取微博关键词搜索博文,只需要修改cookie和url参数
80行Python代码爬取全国养老信息网数据,可以作为科研研究对象和资料,爬取的内容和数据条数,你可以自己设置,直接可以运行!!!!
Python爬取动态网站;Python爬取微信公众号文章以及评论源代码!
python爬取电影Top250数据并进行可视化分析.zip
【小白必看】使用Python爬取喜马拉雅音频并保存的示例代码,【小白必看】使用Python爬取喜马拉雅音频并保存的示例代码,【小白必看】使用Python爬取喜马拉雅音频并保存的示例代码,【小白必看】使用Python爬取喜马拉雅...
python爬虫实例,内含代理ip池实例,比较适合初学爬虫者。需要用到多线程和一些基本的第三方模块,仅供参考
用python爬取高校导师的主页信息,便于筛选信息,选择喜欢的导师
Python爬取小说源代码,Python实现小说自由 - 获取小说所有章节以及对应地址 - 遍历所有章节地址,获取其标题以及内容 - 最后,把内容写入文本
【小白必看】Python爬取NBA球员数据示例【小白必看】Python爬取NBA球员数据示例【小白必看】Python爬取NBA球员数据示例【小白必看】Python爬取NBA球员数据示例【小白必看】Python爬取NBA球员数据示例【小白必看】...
python爬取携程网评论.zip
python爬取百度百科的页面主要用BeautifulSoup ,urllib2等
Python应用实战代码-Python爬取新房数据
所以我决定写个爬虫帮他抓取数据。 看了一下各类信息还是很规则的,感觉应该很好写。 but这个网站设置了各种反爬虫手段。 经过各种百度,还是解决问题了。 设计思路: 1.先抓取每一个漏洞信息对应的网页url ...
mongodb的应用之用python爬取网页内容并用mongodb保存. 由于mongodb是文档型数据库,区别于传统的数据库,它是用来管理文档的。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的...
python 爬取百度搜索结果,及安全验证问题
Python 爬取肺炎疫情代码,结合requets和matplot,爬取163.com接口数据,使用堆叠柱状体显示各省市数据