Python爬虫爬取百度搜索结果——邮箱地址

因为需要拿一些外部邮箱做测试,所以要获得一些真实的邮箱地址,我在百度上搜索"@xxxx.com.cn"(xxxx保密,哈哈)之后,得到大概1,700,000条结果。但我只需要一千个不重复的就够了,鼓捣了一下午终于搞定,直接贴上代码,具体说明都写在注释里。(另外我发现学会正则表达式真的特别重要,附上大神写的正则表达式学习指南:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html)

# -*- 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+@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@xxxx.com.cn,没办法我得去掉
				s = s[:-16]+s[-12:]
				f.write(s)
				f.write('\n')
			f.close()
		finally:
			file_object.close()
		#即时删除下载的网页
		os.remove(base_dir + sName)
 
 
#-------- 在这里输入参数 ------------------
#这是原始的搜索结果地址特别长,而且每翻一页地址都会变化,研究了一下,其实不需要&rsv_*这个东东,&连接的内容之间显然无顺序要求
#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语言学习)