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()

分享到:

2013-05-18 03:59

浏览 4513

评论

python最简单的爬取邮箱地址_python爬取邮箱的实例代码相关推荐

  1. python爬取地图地址_python爬取了高德地图一些地点的数据,爬出来数据大致情况如下:...

    python爬取了高德地图一些地点的数据,爬出来数据大致情况如下: 下面是基本流程: 1.注册成为高德地图API开发者,网址http://lbs.amap.com/(主要是获取自己的keywords ...

  2. python爬取地图地址_Python爬取百度地图poi数据 !

    锵锵锵,我来啦.10天过的好快呀,4月份都已经过了三分之一,我的体重还居高不下,qwq.今天给大家分享python爬取百度地图小区的数据,希望大家看后,可以尝试自己编写爬取自己所在市的中学,公园,银行 ...

  3. python最简单的爬取邮箱地址_python3爬取网页中的邮箱地址

    1.爬虫分析 分析结果对: http://xxx.com?method=getrequest&gesnum=00000001 http://xxx.com?method=getrequest& ...

  4. python爬虫小说下载到txt文档_python 爬取网络小说 清洗 并下载至txt文件

    什么是爬虫 网络爬虫,也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. 网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引.网络爬虫可以 ...

  5. python爬取手机微信_Python爬取微信好友

    前言 今天看到一篇好玩的文章,可以实现微信的内容爬取和聊天机器人的制作,所以尝试着实现一遍,本文记录了实现过程和一些探索的内容 itchat安装 对微信的控制可以使用itchat来实现,我们找到itc ...

  6. python抓取微博评论_Python爬取新浪微博评论数据,你有空了解一下?

    开发工具 Python版本:3.6.4 相关模块: argparse模块: requests模块: jieba模块: wordcloud模块: 以及一些Python自带的模块. 环境搭建 安装Pyth ...

  7. python爬取酒店信息_Python 爬取美團酒店信息

    事由:近期和朋友聊天,聊到黃山酒店事情,需要了解一下黃山的酒店情況,然后就想着用python 爬一些數據出來,做個參考 主要思路:通過查找,基本思路清晰,目標明確,僅僅爬取美團莫一地區的酒店信息,不過 ...

  8. python爬取学校新闻_Python抓取学院新闻报告

    们发现,我们能够直接在新闻详情页面抓取到我们需要的数据:标题,时间,内容.URL. 好,到现在我们清楚抓取一篇新闻的思路了.但是,如何抓取所有的新闻内容呢? 这显然难不到我们. 我们在新闻栏目的最下方 ...

  9. python爬取动态网页_python爬取动态网页数据,详解

    原理:动态网页,即用js代码实现动态加载数据,就是可以根据用户的行为,自动访问服务器请求数据,重点就是:请求数据,那么怎么用python获取这个数据了? 浏览器请求数据方式:浏览器向服务器的api(例 ...

最新文章

  1. linux挂载移动硬盘 格式化_linux系统下如何挂载NTFS移动硬盘
  2. 4104 oracle 数据文件名,Oracle 11g 常遇到ora-01034错误,这是为什么?
  3. 开发日记-20190527 关键词 ubuntu无线网卡驱动安装
  4. Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用
  5. An In-Depth Look at the HBase Architecture--转载
  6. 地图API引发的设想
  7. Objective C 基础教程
  8. 防火墙对nginx服务器有影响
  9. 【今日CV 视觉论文速览】27 Nov 2018
  10. iOS AVPlayer视频播放器
  11. python装饰器快速入门
  12. 摩斯电码php源码,PHP实现基于文本的莫斯电码生成器
  13. qt android编程,Qt for Android开发实例教程
  14. Laya Shader3D之边缘光照
  15. vue table表格中身份证隐藏中间几位
  16. js与朴php订单评价功能
  17. 七、最短路径——弗洛伊德(Floyd)算法
  18. 前端开发:使用JS正则表达式校验邮箱和手机号的方法,安卓面试题最新2020
  19. APOllO服务器性能,HPE Apollo 4200 Gen9 服务器
  20. Git上传文件不能超过100M的解决办法

热门文章

  1. 关于C++中公有继承、私有继承、保护继承的讨论
  2. hdu5514Frogs
  3. win10无线投屏_miracast投屏的未来
  4. 区块链白皮书阅读笔记
  5. keep-alive上加v-if导致缓存失效
  6. android.view.WindowLeaked解决办法
  7. 用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
  8. AOJ-proble-807
  9. 设备在升级界面文字或图像方向偏转问题修改方案(RK3399方案)
  10. 【已解决】模拟人生4(Sims4) 启动失败 orangeEmu.dll及应用程序错误0x0000142