使用python抓取百度搜索、百度新闻搜索的关键词个数
由于實(shí)驗(yàn)的要求,需要統(tǒng)計(jì)一系列的字符串通過百度搜索得到的關(guān)鍵詞個(gè)數(shù),于是使用python寫了一個(gè)相關(guān)的腳本。
在寫這個(gè)腳本的過程中遇到了很多的問題,下面會(huì)一一道來。
ps:我并沒有系統(tǒng)地學(xué)習(xí)過python,只是很久之前用過它,感覺用起來還比較方便,于是這回又把它拾起來使用了。當(dāng)然這也是考慮到手上有python機(jī)器學(xué)習(xí)的實(shí)戰(zhàn)書籍,所以估計(jì)一段時(shí)間后還會(huì)再用的緣故。
思路:首先使用python的庫函數(shù)把網(wǎng)頁的內(nèi)容爬下來,然后使用正則表達(dá)式去匹配想要的字符串,最后進(jìn)行字符串處理就能得到想要的東西了。
具體方法(以百度搜索為例):
(1)讀取存放關(guān)鍵詞的文本
fid = open(filename,'r') all_text = fid.readlines()
(2)根據(jù)讀取到的內(nèi)容依次來搜索
socket.setdefaulttimeout(4)#設(shè)置4s延時(shí)
for eachtext in all_text:
eachtext = eachtext.strip('
')#去掉關(guān)鍵詞最后的換行符
output = open(r'data.txt','w+')#創(chuàng)建一個(gè)中間文本,用來存儲(chǔ)讀取到的數(shù)據(jù),這里其實(shí)可以不需要這么做,但是我為了調(diào)試的方便,這里還是加上了
flag = 1 #設(shè)置標(biāo)志
while(flag): #有時(shí)候網(wǎng)速不好,然后程序卡住,上面設(shè)置了4s延時(shí)時(shí)間,然后在這里設(shè)定標(biāo)志位進(jìn)行循環(huán)讀?。ㄈ绻l(fā)生了延時(shí)錯(cuò)誤)
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)使用正則表達(dá)式匹配內(nèi)容
for line in output.readlines():
#通過兩次正則表達(dá)式的匹配得到最終的結(jié)果
m = re.search(r'相關(guān)結(jié)果約.*個(gè)',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èi)容寫入文件
print eachtext+':'+m.group() #打印一些調(diào)試信息
break #匹配到直接跳出循環(huán)即可
遇到的問題:
(1)中文顯示的問題,更細(xì)致一點(diǎn),就是編碼的問題了,相信每個(gè)學(xué)習(xí)Python的人都會(huì)遇到這個(gè)問題!不過這種問題一般不是很難解決,百度上有很多別人的經(jīng)驗(yàn)。
>>在我的程序中,我使用的全局編碼都是utf-8編碼,這樣在shell中運(yùn)行時(shí)沒有問題的,但是如果在控制臺(tái)中運(yùn)行,中文顯示便是亂碼了,原因是中文系統(tǒng)默認(rèn)編碼是gbk。
--我解決的辦法是在要顯示中文的地方先解碼然后再編碼,eg:print substr.decode('utf-8').encode('gbk')
(2)為了在不裝python的機(jī)器上也能運(yùn)行我這個(gè)腳本,我使用py2exe對(duì)程序進(jìn)行了打包,但是發(fā)現(xiàn)程序的圖標(biāo)無法顯示出來,打包代碼如下:
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')]
網(wǎng)上說有把序號(hào)1換成0就能顯示(然而并沒有什么卵用),以及一些相關(guān)的辦法我都嘗試了,最終得到一個(gè)可行的辦法:http://blog.csdn.net/xugangjava/article/details/8049224
(3)為了擴(kuò)大搜索的范圍,例如使用百度新聞搜索、人民網(wǎng)檢索、搜狗搜索,我又進(jìn)行了一些嘗試。
百度新聞搜索:
#搜索的方式
res=urllib2.urlopen(("http://news.baidu.com/ns?"+'cl=2&rn=20&tn=news&'+urllib.urlencode({'word':eachtext})))
人民網(wǎng)檢索:
發(fā)現(xiàn)使用的是js,查看源碼也沒有什么作用,又不會(huì)模擬瀏覽器的行為(預(yù)計(jì)學(xué)習(xí)起來要花費(fèi)不少的時(shí)間,然而暫時(shí)沒有必要),作為爬蟲的菜鳥,只能放棄改為手動(dòng)抓取了。
搜狗搜索:
這個(gè)是會(huì)檢測爬蟲的,我被多次封ip,可以使用代理ip的方式來對(duì)付一下,只不過網(wǎng)上的代理ip資源很少。另外瀏覽器訪問并沒有被封,所以個(gè)人覺得其中一定有一些技巧,但是只能之后又時(shí)間再來研究了。
總結(jié):爬蟲這方面的資料還是有挺多的,一些諸如Scrapy的框架應(yīng)用得很廣泛。上面我只是簡單地應(yīng)用了,避免了繁雜的手動(dòng)搜索。 、
參考資料:
http://cuiqingcai.com/1052.html
http://www.cnblogs.com/fnng/p/3576154.html
總結(jié)
以上是生活随笔為你收集整理的使用python抓取百度搜索、百度新闻搜索的关键词个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计蒜客 —— 最好的草
- 下一篇: 行测-资料分析