使用python抓取百度搜索、百度新闻搜索的关键词个数
由于實驗的要求,需要統計一系列的字符串通過百度搜索得到的關鍵詞個數,于是使用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('
')#去掉關鍵詞最后的換行符
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()+'
') #把匹配的內容寫入文件
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
總結
以上是生活随笔為你收集整理的使用python抓取百度搜索、百度新闻搜索的关键词个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计蒜客 —— 最好的草
- 下一篇: 行测-资料分析