日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

使用python抓取百度搜索、百度新闻搜索的关键词个数

發(fā)布時(shí)間:2024/6/21 综合教程 45 生活家
生活随笔 收集整理的這篇文章主要介紹了 使用python抓取百度搜索、百度新闻搜索的关键词个数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由于實(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。