- # -*- coding: utf-8 -*-
- #---------------------------------------
- # 程序:百度搜索爬蟲
- # 版本:0.1
- # 作者:LuoQi
- # 日期:2015-03-24
- # 語言:Python 2.7
- # 操作:輸入帶分頁的地址,去掉最后面的數(shù)字,設(shè)置一下起始頁數(shù)和終點頁數(shù)。
- # 功能:下載對應(yīng)頁碼內(nèi)的所有頁面并存儲為txt文件。
- #---------------------------------------
- import string
- import urllib
- import urllib2
- import re
- import os
- import socket
- import time
- #全局變量,如果頻繁urlopen一個網(wǎng)站會被遠程連接強制斷掉,這里為了遞歸調(diào)用函數(shù),接著從斷掉的那一頁重新開始爬取
- CONSTANT = 1
- def MailSearch(url,begin_page,end_page):
- global CONSTANT
- #正則匹配,這里我要獲取@xxxx.com.cn結(jié)尾的郵箱號
- 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保持隔一段時間一次爬取指定會出現(xiàn)(python socket.error: [Error
- #10054] 遠程主機強迫關(guān)閉了一個現(xiàn)有的連接)
- #加了貌似還會出現(xiàn),呵呵,所以被迫寫了遞歸函數(shù),保證我能爬完所有的搜索結(jié)果
- timeout = 10
- socket.setdefaulttimeout(timeout)#這里對整個socket層設(shè)置超時時間。后續(xù)文件中如果再使用
- #到socket,不必再設(shè)置
- sleep_download_time = 1
- time.sleep(sleep_download_time) #這里時間自己設(shè)定
- requests = urllib2.urlopen(url + str(i*10)) #這里是要讀取內(nèi)容的,不斷變更的地址
- content = requests.read()#讀取,一般會在這里報異常,被爬取的網(wǎng)站強行斷掉
- #之前直接獲取到網(wǎng)頁內(nèi)容,然后直接正則匹配發(fā)現(xiàn)始終只能拿到第一頁的內(nèi)容后面的沒有了
- #只能先下載下來,再正則再刪去該網(wǎng)頁,不知道哪位大神能給出解釋
- f.write(content)
- f.close()
- requests.close()#記得要關(guān)閉
- except UnicodeDecodeError as e:
- print('-----UnicodeDecodeError url:',url)
- #繼續(xù)調(diào)用爬取函數(shù)
- 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)
- #在網(wǎng)頁源代碼里郵箱地址是這樣的xxxxx<em>@xxxx.com.cn,沒辦法我得去掉<em>
- s = s[:-16]+s[-12:]
- f.write(s)
- f.write('\n')
- f.close()
- finally:
- file_object.close()
- #即時刪除下載的網(wǎng)頁
- os.remove(base_dir + sName)
-
-
- #-------- 在這里輸入?yún)?shù) ------------------
- #這是原始的搜索結(jié)果地址特別長,而且每翻一頁地址都會變化,研究了一下,其實不需要&rsv_*這個東東,&連接的內(nèi)容之間<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="
- #設(shè)置起始頁,終止頁
- begin_page = 0
- end_page = 1000
- #-------- 在這里輸入?yún)?shù) ------------------
- #調(diào)用
- MailSearch(bdurl,begin_page,end_page)
歡迎批評指正!
|