因为需要拿一些外部邮箱做测试,所以要获得一些真实的邮箱地址,我在百度上搜索"@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+<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爬虫爬取百度搜索结果——邮箱地址
最新推荐文章于 2025-03-11 23:06:44 发布