- 浏览: 112152 次
文章分类
最新评论
不用编码也是可以匹配邮箱的。
下面是一个用队列实现,广度优先的简单爬虫代码。先就这样吧,目测暂时不会再理它了,以后有时间再修改。
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 2157一个python实现的网络爬虫代码。 写了个python3 ... -
python抓取网页图片python爬虫
2014-05-05 17:01 911python抓取网页图片示例(python爬虫) - ... -
python访问纯真IP数据库
2014-03-20 09:17 497通过IP地址判断客户端是网通的还是电信的。 使用一个纯文本 ... -
Python和MD5网站挂马检测程序
2014-03-13 17:02 811系统管理员通常从svn/git中检索代码,部署站点后通常首先会 ... -
python登陆Tom邮箱的代码一例
2013-05-22 07:06 3734本文出处参考:http://www.cnblogs.com/L ... -
python实现登录QQ邮箱发信的代码
2013-05-22 07:03 2113python登录QQ邮箱发信的代码。 # -*- codin ... -
python自动登录126等邮箱的代码
2013-05-22 07:00 2415本节python教程,为大家介绍,用 python实现自动登录 ... -
python处理utf8编码中文及打印中文列表和字典的方法
2013-05-18 04:01 987python处理utf8编码中文,需要在py文件的第一行加入: ... -
Python序列的切片操作技巧总结
2013-05-18 03:57 1134序列 序列(consequence)是python中一种数据 ... -
有关Python中递归的最大次数
2013-05-18 03:47 1257看到一个同学问递归最多达到多少次,因为在他跑的时候,次数有时多 ... -
重命名批处理的python脚本
2013-04-06 22:31 807采集的视网膜图像放在一个文件夹下,分类十分混乱,出现了一个文件 ...
相关推荐
本文实例为大家分享了python爬取51job中hr的邮箱具体代码,供大家参考,具体内容如下 #encoding=utf8 import urllib2 import cookielib import re import lxml.html from _ast import TryExcept from warnings ...
实例代码展示了整个爬虫的构建过程。其中包括登录教务系统的流程、获取成绩的流程、比较新旧成绩并找出差异的逻辑,以及通过邮件发送成绩更新通知的步骤。 具体到代码实现,我们首先建立了一个session会话,以便在...
Scrapy是一个用于Python的快速高级网页抓取和网络爬虫框架,用于抓取网站并从页面中提取结构化的数据。它可以用于各种用途,包括收集特定类型的网页内容、为搜索引擎建立数据仓库或为任何类型的数据挖掘提供支持。 ...
以下是使用Selenium模拟登录QQ邮箱的Python代码片段: ```python from selenium import webdriver from selenium.webdriver import ActionChains import time driver = webdriver.Edge() driver.get(...
标题中的“15行Python代码实现免费发送手机短信推送消息功能”是指使用Python编程语言,通过15行简洁的代码实现在不产生费用的情况下向手机发送短信的通知服务。这一功能通常涉及API接口的使用,特别是那些提供免费...
总结来说,这个Python代码实例演示了如何结合网络爬虫、邮件发送和定时任务来实现一个实用的功能:每天定时向指定邮箱发送当前地区的天气预报。通过这个例子,我们可以学习到Python中网络请求、HTML解析、邮件发送...
总结来说,Python读取指定日期邮件的实例展示了如何结合`imaplib`和`email`库,以及二分查找算法来高效地处理大量邮件。在实际应用中,这可以极大地提高工作效率,特别是在需要从历史邮件中检索特定信息的情况下。...
这个压缩包包含源代码、文本文件以及爬取的实际数据,这对于那些正在探索网络爬虫世界的人来说是一份宝贵的资料。让我们逐一剖析其中涉及的知识点。 首先,我们关注的是"爬虫"这一主题。爬虫,全称为网络爬虫,是一...
在爬取红牛分公司的数据时,我们可能会遇到以下步骤: - 打开HTML文件:`with open(file_path, 'r', encoding='utf-8') as f` - 读取文件内容:`data = f.read()` - 使用正则表达式查找信息:`title = re.findall('...
#### 实例代码分析 下面是对部分代码片段的具体分析: ```python import urllib import urllib.request import re from urllib import parse # 抓取贴吧页面数量信息 def gettiebalistnumbers(name): # 计算搜索的...
在Python中,我们通常使用requests库进行网络请求,获取网页的HTML源代码。首先,我们需要导入requests库,并使用`get()`函数来发送HTTP GET请求到目标URL。例如: ```python import requests url = '...
在爬虫中,XPath 可以帮助我们精准定位目标信息,例如专家的姓名、研究方向和邮箱。 3. **CSV 文件操作**:在爬取到数据后,通常需要将其存储以便后续分析。Python 的 `csv` 模块提供了读写 CSV 文件的功能。我们...
在提供的Python源代码文件中,很可能包含了这些知识点的实例应用和详细注解,这对于学习者来说是非常宝贵的资源。通过逐步解读和实践,可以深入了解Python爬虫的实现过程,为大数据分析打下坚实的基础。尽管标签中...
综上所述,这个爬虫程序实现了从广东工业大学官网爬取新闻链接,提取新闻标题,并通过SMTP协议将这些信息发送到指定的QQ邮箱。它涉及到了网络请求、HTML解析、数据提取以及邮件发送等多个关键知识点。为了提高效率和...
- **应用实例**:验证邮箱格式、提取URL链接等。 ##### 3-6 使用正则表达式获取网页标题信息 - **提取标题方法**:通过正则表达式匹配`<title>`标签内容。 - **注意事项**:确保匹配准确性,避免误匹配。 ##### 3-...
#### 六、爬取天气预报数据实例 - **目标网址**:`http://www.weather.com.cn/weather/101010100.shtml` - **请求方式**:GET - **爬取步骤**: 1. **发送请求**:使用Python的requests库发起GET请求。 2. **解析...
7. **实例应用**:课程中的实例涵盖了从简单的中国大学排名爬虫到复杂的股票数据爬虫,这些实战项目将帮助你将理论知识应用于实际问题,提升解决复杂爬虫挑战的能力。 8. **法律风险与隐私保护**:网络爬虫在获取...
首先确定你要爬取的目标网站的表单提交方式,可以通过开发者工具看到。这里推荐使用chrome。 这里我用163邮箱为例 打开工具后再Network中,在Name选中想要了解的网站,右侧headers里的request method就是提交方式...
总的来说,trinity-scraper提供了一个实例,展示了如何利用Python进行Web爬虫开发,以及如何从特定的Web资源中提取有价值的信息。同时,这也提醒我们在使用这类工具时,必须尊重数据来源的规则和用户的隐私权。