由於實驗的要求,需要統計一系列的字符串通過百度搜索得到的關鍵詞個數,於是使用python寫了一個相關的腳本。
在寫這個腳本的過程中遇到了很多的問題,下面會一一道來。
ps:我並沒有系統地學習過python,只是很久之前用過它,感覺用起來還比較方便,於是這回又把它拾起來使用了。當然這也是考慮到手上有python機器學習的實戰書籍,所以估計一段時間后還會再用的緣故。
思路:首先使用python的庫函數把網頁的內容爬下來,然后使用正則表達式去匹配想要的字符串,最后進行字符串處理就能得到想要的東西了。
具體方法(以百度搜索為例):
(1)讀取存放關鍵詞的文本
fid = open(filename,'r') all_text = fid.readlines()
(2)根據讀取到的內容依次來搜索
socket.setdefaulttimeout(4)#設置4s延時 for eachtext in all_text: eachtext = eachtext.strip('\n')#去掉關鍵詞最后的換行符 output = open(r'data.txt','w+')#創建一個中間文本,用來存儲讀取到的數據,這里其實可以不需要這么做,但是我為了調試的方便,這里還是加上了 flag = 1 #設置標志 while(flag): #有時候網速不好,然后程序卡住,上面設置了4s延時時間,然后在這里設定標志位進行循環讀取(如果發生了延時錯誤) try: res=urllib2.urlopen(("http://www.baidu.com/s?"+urllib.urlencode({'wd': eachtext})+"&pn={0}&cl=3&rn=100")) html=res.read() flag = 0 except socket.error: errno, errstr = sys.exc_info()[:2] if errno == socket.timeout: print "There was a timeout" else: print "There was some other socket error" content = unicode(html, 'utf-8','ignore') output.write(html) output.seek(0) #把指針移到文件頭部
(3)使用正則表達式匹配內容
for line in output.readlines(): #通過兩次正則表達式的匹配得到最終的結果 m = re.search(r'相關結果約.*個',line) if m: text = m.group() re_text=text.replace(',',"") m = re.search(r'[0-9]{1,15}',re_text) if m: fout.write(m.group()+'\n') #把匹配的內容寫入文件 print eachtext+':'+m.group() #打印一些調試信息 break #匹配到直接跳出循環即可
遇到的問題:
(1)中文顯示的問題,更細致一點,就是編碼的問題了,相信每個學習Python的人都會遇到這個問題!不過這種問題一般不是很難解決,百度上有很多別人的經驗。
>>在我的程序中,我使用的全局編碼都是utf-8編碼,這樣在shell中運行時沒有問題的,但是如果在控制台中運行,中文顯示便是亂碼了,原因是中文系統默認編碼是gbk。
--我解決的辦法是在要顯示中文的地方先解碼然后再編碼,eg: print substr.decode('utf-8').encode('gbk')
(2)為了在不裝python的機器上也能運行我這個腳本,我使用py2exe對程序進行了打包,但是發現程序的圖標無法顯示出來,打包代碼如下:
from distutils.core import setup import py2exe import sys includes = ["encodings", "encodings.*"] sys.argv.append("py2exe") options = {"py2exe": { "bundle_files": 1 } } setup(options = options, description = 'search', zipfile=None, console = [{"script":'baidu_search.py', 'icon_resources':[(1, 'logo.ico')]
網上說有把序號1換成0就能顯示(然而並沒有什么卵用),以及一些相關的辦法我都嘗試了,最終得到一個可行的辦法:http://blog.csdn.net/xugangjava/article/details/8049224
(3)為了擴大搜索的范圍,例如使用百度新聞搜索、人民網檢索、搜狗搜索,我又進行了一些嘗試。
百度新聞搜索:
#搜索的方式 res=urllib2.urlopen(("http://news.baidu.com/ns?"+'cl=2&rn=20&tn=news&'+urllib.urlencode({'word':eachtext})))
人民網檢索:
發現使用的是js,查看源碼也沒有什么作用,又不會模擬瀏覽器的行為(預計學習起來要花費不少的時間,然而暫時沒有必要),作為爬蟲的菜鳥,只能放棄改為手動抓取了。
搜狗搜索:
這個是會檢測爬蟲的,我被多次封ip,可以使用代理ip的方式來對付一下,只不過網上的代理ip資源很少。另外瀏覽器訪問並沒有被封,所以個人覺得其中一定有一些技巧,但是只能之后又時間再來研究了。
總結:爬蟲這方面的資料還是有挺多的,一些諸如Scrapy的框架應用得很廣泛。上面我只是簡單地應用了,避免了繁雜的手動搜索。 、
參考資料:
http://cuiqingcai.com/1052.html
http://www.cnblogs.com/fnng/p/3576154.html