`

python爬取邮箱的实例代码

阅读更多
不用编码也是可以匹配邮箱的。

下面是一个用队列实现,广度优先的简单爬虫代码。先就这样吧,目测暂时不会再理它了,以后有时间再修改。
 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()
分享到:
评论

相关推荐

    python爬取51job中hr的邮箱

    本文实例为大家分享了python爬取51job中hr的邮箱具体代码,供大家参考,具体内容如下 #encoding=utf8 import urllib2 import cookielib import re import lxml.html from _ast import TryExcept from warnings ...

    python爬虫爬取监控教务系统的思路详解

    实例代码展示了整个爬虫的构建过程。其中包括登录教务系统的流程、获取成绩的流程、比较新旧成绩并找出差异的逻辑,以及通过邮件发送成绩更新通知的步骤。 具体到代码实现,我们首先建立了一个session会话,以便在...

    scrapy爬虫完整实例

    Scrapy是一个用于Python的快速高级网页抓取和网络爬虫框架,用于抓取网站并从页面中提取结构化的数据。它可以用于各种用途,包括收集特定类型的网页内容、为搜索引擎建立数据仓库或为任何类型的数据挖掘提供支持。 ...

    [Python爬虫]-模拟登录qq邮箱实验报告.docx

    以下是使用Selenium模拟登录QQ邮箱的Python代码片段: ```python from selenium import webdriver from selenium.webdriver import ActionChains import time driver = webdriver.Edge() driver.get(...

    15行Python代码实现免费发送手机短信推送消息功能

    标题中的“15行Python代码实现免费发送手机短信推送消息功能”是指使用Python编程语言,通过15行简洁的代码实现在不产生费用的情况下向手机发送短信的通知服务。这一功能通常涉及API接口的使用,特别是那些提供免费...

    Python定时发送天气预报邮件代码实例

    总结来说,这个Python代码实例演示了如何结合网络爬虫、邮件发送和定时任务来实现一个实用的功能:每天定时向指定邮箱发送当前地区的天气预报。通过这个例子,我们可以学习到Python中网络请求、HTML解析、邮件发送...

    Python读取指定日期邮件的实例

    总结来说,Python读取指定日期邮件的实例展示了如何结合`imaplib`和`email`库,以及二分查找算法来高效地处理大量邮件。在实际应用中,这可以极大地提高工作效率,特别是在需要从历史邮件中检索特定信息的情况下。...

    爬虫案例和源码 code.rar包含源代码,文本,和爬取的数据

    这个压缩包包含源代码、文本文件以及爬取的实际数据,这对于那些正在探索网络爬虫世界的人来说是一份宝贵的资料。让我们逐一剖析其中涉及的知识点。 首先,我们关注的是"爬虫"这一主题。爬虫,全称为网络爬虫,是一...

    python--re模块及爬取红牛分公司实战演练(csdn)————程序.pdf

    在爬取红牛分公司的数据时,我们可能会遇到以下步骤: - 打开HTML文件:`with open(file_path, 'r', encoding='utf-8') as f` - 读取文件内容:`data = f.read()` - 使用正则表达式查找信息:`title = re.findall('...

    python3用urllib抓取贴吧邮箱和QQ实例

    #### 实例代码分析 下面是对部分代码片段的具体分析: ```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 = '...

    爬虫代码实现.rar

    在爬虫中,XPath 可以帮助我们精准定位目标信息,例如专家的姓名、研究方向和邮箱。 3. **CSV 文件操作**:在爬取到数据后,通常需要将其存储以便后续分析。Python 的 `csv` 模块提供了读写 CSV 文件的功能。我们...

    python爬虫,含注释讲解,来自于大数据分析课程.zip

    在提供的Python源代码文件中,很可能包含了这些知识点的实例应用和详细注解,这对于学习者来说是非常宝贵的资源。通过逐步解读和实践,可以深入了解Python爬虫的实现过程,为大数据分析打下坚实的基础。尽管标签中...

    爬取广东工业大学官网新闻并发送到QQ邮箱

    综上所述,这个爬虫程序实现了从广东工业大学官网爬取新闻链接,提取新闻标题,并通过SMTP协议将这些信息发送到指定的QQ邮箱。它涉及到了网络请求、HTML解析、数据提取以及邮件发送等多个关键知识点。为了提高效率和...

    Python网络爬虫视频教程.docx

    - **应用实例**:验证邮箱格式、提取URL链接等。 ##### 3-6 使用正则表达式获取网页标题信息 - **提取标题方法**:通过正则表达式匹配`&lt;title&gt;`标签内容。 - **注意事项**:确保匹配准确性,避免误匹配。 ##### 3-...

    爬虫零基础入门-爬取天气预报.pdf

    #### 六、爬取天气预报数据实例 - **目标网址**:`http://www.weather.com.cn/weather/101010100.shtml` - **请求方式**:GET - **爬取步骤**: 1. **发送请求**:使用Python的requests库发起GET请求。 2. **解析...

    完整版精品Python网络爬虫教程 数据采集 信息提取课程 02-网络爬虫的盗亦有道(共19页).pptx

    7. **实例应用**:课程中的实例涵盖了从简单的中国大学排名爬虫到复杂的股票数据爬虫,这些实战项目将帮助你将理论知识应用于实际问题,提升解决复杂爬虫挑战的能力。 8. **法律风险与隐私保护**:网络爬虫在获取...

    python爬虫中get和post方法介绍以及cookie作用

    首先确定你要爬取的目标网站的表单提交方式,可以通过开发者工具看到。这里推荐使用chrome。 这里我用163邮箱为例 打开工具后再Network中,在Name选中想要了解的网站,右侧headers里的request method就是提交方式...

    trinity-scraper:抓取三位一体目录以获取所有当前学生的电子邮件

    总的来说,trinity-scraper提供了一个实例,展示了如何利用Python进行Web爬虫开发,以及如何从特定的Web资源中提取有价值的信息。同时,这也提醒我们在使用这类工具时,必须尊重数据来源的规则和用户的隐私权。

Global site tag (gtag.js) - Google Analytics