因为需要拿一些外部邮箱做测试,所以要获得一些真实的邮箱地址,我在百度上搜索"@xxxx.com.cn"(xxxx保密,哈哈)之后,得到大概1,700,000条结果。但我只需要一千个不重复的就够了,鼓捣了一下午终于搞定,直接贴上代码,具体说明都写在注释里。(另外我发现学会正则表达式真的特别重要,附上大神写的正则表达式学习指南:)
# -*- coding: utf-8 -*-
#---------------------------------------
# 程序:百度搜索爬虫
# 版本:0.1
# 作者:LuoQi
# 日期:2015-03-24
# 语言:Python 2.7
# 操作:输入带分页的地址,去掉最后面的数字,设置一下起始页数和终点页数。
# 功能:下载对应页码内的所有页面并存储为txt文件。
#---------------------------------------
import string
import urllib
import urllib2
import re
import os
import socket
import time
#全局变量,如果频繁urlopen一个网站会被远程连接强制断掉,这里为了递归调用函数,接着从断掉的那一页重新开始爬取
CONSTANT = 1
def MailSearch(url,begin_page,end_page):
global CONSTANT
#正则匹配,这里我要获取@xxxx.com.cn结尾的邮箱号
p = re.compile(r'\w+<em>@xxxx.com.cn')
base_dir = "E:\\mailAddress\\"
for i in range(begin_page, end_page+1):
print i
CONSTANT +=1
try:
sName = string.zfill(i,7) + '.txt' #自动填充成六位的文件名
f = open(base_dir + sName,'w+')
#不加sleep_download_time保持隔一段时间一次爬取指定会出现(python socket.error: [Error #10054] 远程主机强迫关闭了一个现有的连接)
#加了貌似还会出现,呵呵,所以被迫写了递归函数,保证我能爬完所有的搜索结果
timeout = 10
socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用 #到socket,不必再设置
sleep_download_time = 1
time.sleep(sleep_download_time) #这里时间自己设定
requests = urllib2.urlopen(url + str(i*10)) #这里是要读取内容的,不断变更的地址
content = requests.read()#读取,一般会在这里报异常,被爬取的网站强行断掉
#之前直接获取到网页内容,然后直接正则匹配发现始终只能拿到第一页的内容后面的没有了
#只能先下载下来,再正则再删去该网页,不知道哪位大神能给出解释
f.write(content)
f.close()
requests.close()#记得要关闭
except UnicodeDecodeError as e:
print('-----UnicodeDecodeError url:',url)
#继续调用爬取函数
cnpcMailSearch(bdurl,CONSTANT,end_page)
except urllib2.error.URLError as e:
print("-----urlError url:",url)
cnpcMailSearch(bdurl,CONSTANT,end_page)
except socket.timeout as e:
print("-----socket timout:",url)
cnpcMailSearch(bdurl,CONSTANT,end_page)
file_object = open(base_dir + sName)
try:
all_the_text = file_object.read()
mailAddress= p.findall(all_the_text)
f = open(r'E:\\test.txt','a')
for num in mailAddress:
s = str(num)
#在网页源代码里邮箱地址是这样的xxxxx<em>@xxxx.com.cn,没办法我得去掉<em>
s = s[:-16]+s[-12:]
f.write(s)
f.write('\n')
f.close()
finally:
file_object.close()
#即时删除下载的网页
os.remove(base_dir + sName)
#-------- 在这里输入参数 ------------------
#这是原始的搜索结果地址特别长,而且每翻一页地址都会变化,研究了一下,其实不需要&rsv_*这个东东,&连接的内容之间<span style="font-family: Arial, Helvetica, sans-serif;">显然无顺序要求</span>#http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=%40xxxx.com.cn&rsv_pq=f96adbb30000145f&
#rsv_t=a5db0FgY8cAll9kpqEfb2F9yqcfIoZRa0BxSyHghKZJU8PvXwrGXvlTzT10&rsv_enter=0&rsv_sug3=1&rsv_sug1=1&rsv_sug4=1167&rsv_sug=1
#所以改为以下地址,方便获取
bdurl = "http://www.baidu.com/s?wd=%40xxxx.com.cn&oq=%40xxxx.com.cn&tn=sitehao123&ie=utf-8&pn="
#设置起始页,终止页
begin_page = 0
end_page = 1000
#-------- 在这里输入参数 ------------------
#调用
MailSearch(bdurl,begin_page,end_page)
提取邮件内容表格python python批量爬取邮箱
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章