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

歡迎批評指正!

發佈了47 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章