pyspider的使用方法-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線(xiàn)動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!

創(chuàng)新互聯(lián)建站自2013年起,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元景縣做網(wǎng)站,已為上家服務(wù),為景縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):028-86922220

小編給大家分享一下pyspider的使用方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學(xué)習(xí),希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學(xué)習(xí)方法吧!

pyspider 的基本使用

本節(jié)用一個(gè)實(shí)例來(lái)講解 pyspider 的基本用法。

1. 本節(jié)目標(biāo)

我們要爬取的目標(biāo)是去哪兒網(wǎng)的旅游攻略,鏈接為 http://travel.qunar.com/travelbook/list.htm,我們要將所有攻略的作者、標(biāo)題、出發(fā)日期、人均費(fèi)用、攻略正文等保存下來(lái),存儲(chǔ)到 MongoDB 中。

2. 準(zhǔn)備工作

請(qǐng)確保已經(jīng)安裝好了 pyspider 和 PhantomJS,安裝好了 MongoDB 并正常運(yùn)行服務(wù),還需要安裝 PyMongo 庫(kù),具體安裝可以參考第 1 章的說(shuō)明。

3. 啟動(dòng) pyspider

執(zhí)行如下命令啟動(dòng) pyspider:

pyspider all

運(yùn)行效果如圖 12-2 所示。

pyspider的使用方法

圖 12-2 運(yùn)行結(jié)果

這樣可以啟動(dòng) pyspider 的所有組件,包括 PhantomJS、ResultWorker、Processer、Fetcher、Scheduler、WebUI,這些都是 pyspider 運(yùn)行必備的組件。最后一行輸出提示 WebUI 運(yùn)行在 5000 端口上??梢源蜷_(kāi)瀏覽器,輸入鏈接 http://localhost:5000,這時(shí)我們會(huì)看到頁(yè)面,如圖 12-3 所示。

pyspider的使用方法

圖 12-3 WebUI 頁(yè)面

此頁(yè)面便是 pyspider 的 WebUI,我們可以用它來(lái)管理項(xiàng)目、編寫(xiě)代碼、在線(xiàn)調(diào)試、監(jiān)控任務(wù)等。

4. 創(chuàng)建項(xiàng)目

新建一個(gè)項(xiàng)目,點(diǎn)擊右邊的 Create 按鈕,在彈出的浮窗里輸入項(xiàng)目的名稱(chēng)和爬取的鏈接,再點(diǎn)擊 Create 按鈕,這樣就成功創(chuàng)建了一個(gè)項(xiàng)目,如圖 12-4 所示。

pyspider的使用方法

圖 12-4 創(chuàng)建項(xiàng)目

接下來(lái)會(huì)看到 pyspider 的項(xiàng)目編輯和調(diào)試頁(yè)面,如圖 12-5 所示。

pyspider的使用方法

圖 12-5 調(diào)試頁(yè)面

左側(cè)就是代碼的調(diào)試頁(yè)面,點(diǎn)擊左側(cè)右上角的 run 單步調(diào)試爬蟲(chóng)程序,在左側(cè)下半部分可以預(yù)覽當(dāng)前的爬取頁(yè)面。右側(cè)是代碼編輯頁(yè)面,我們可以直接編輯代碼和保存代碼,不需要借助于 IDE。

注意右側(cè),pyspider 已經(jīng)幫我們生成了一段代碼,代碼如下所示:

from pyspider.libs.base_handler import *
class Handler(BaseHandler):
    crawl_config = { }
    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('http://travel.qunar.com/travelbook/list.htm', callback=self.index_page)
    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('a[href^="http"]').items():
            self.crawl(each.attr.href, callback=self.detail_page)
    @config(priority=2)
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),}

這里的 Handler 就是 pyspider 爬蟲(chóng)的主類(lèi),我們可以在此處定義爬取、解析、存儲(chǔ)的邏輯。整個(gè)爬蟲(chóng)的功能只需要一個(gè) Handler 即可完成。

接下來(lái)我們可以看到一個(gè) crawl_config 屬性。我們可以將本項(xiàng)目的所有爬取配置統(tǒng)一定義到這里,如定義 Headers、設(shè)置代理等,配置之后全局生效。

然后,on_start() 方法是爬取入口,初始的爬取請(qǐng)求會(huì)在這里產(chǎn)生,該方法通過(guò)調(diào)用 crawl() 方法即可新建一個(gè)爬取請(qǐng)求,第一個(gè)參數(shù)是爬取的 URL,這里自動(dòng)替換成我們所定義的 URL。crawl() 方法還有一個(gè)參數(shù) callback,它指定了這個(gè)頁(yè)面爬取成功后用哪個(gè)方法進(jìn)行解析,代碼中指定為 index_page() 方法,即如果這個(gè) URL 對(duì)應(yīng)的頁(yè)面爬取成功了,那 Response 將交給 index_page() 方法解析。

index_page() 方法恰好接收這個(gè) Response 參數(shù),Response 對(duì)接了 pyquery。我們直接調(diào)用 doc() 方法傳入相應(yīng)的 CSS 選擇器,就可以像 pyquery 一樣解析此頁(yè)面,代碼中默認(rèn)是 a[href^=”http”],也就是說(shuō)該方法解析了頁(yè)面的所有鏈接,然后將鏈接遍歷,再次調(diào)用了 crawl() 方法生成了新的爬取請(qǐng)求,同時(shí)再指定了 callback 為 detail_page,意思是說(shuō)這些頁(yè)面爬取成功了就調(diào)用 detail_page() 方法解析。這里,index_page() 實(shí)現(xiàn)了兩個(gè)功能,一是將爬取的結(jié)果進(jìn)行解析,二是生成新的爬取請(qǐng)求。

detail_page() 同樣接收 Response 作為參數(shù)。detail_page() 抓取的就是詳情頁(yè)的信息,就不會(huì)生成新的請(qǐng)求,只對(duì) Response 對(duì)象做解析,解析之后將結(jié)果以字典的形式返回。當(dāng)然我們也可以進(jìn)行后續(xù)處理,如將結(jié)果保存到數(shù)據(jù)庫(kù)。

接下來(lái),我們改寫(xiě)一下代碼來(lái)實(shí)現(xiàn)攻略的爬取吧。

5. 爬取首頁(yè)

點(diǎn)擊左欄右上角的 run 按鈕,即可看到頁(yè)面下方 follows 便會(huì)出現(xiàn)一個(gè)標(biāo)注,其中包含數(shù)字 1,這代表有新的爬取請(qǐng)求產(chǎn)生,如圖 12-6 所示。

pyspider的使用方法

圖 12-6 操作示例

左欄左上角會(huì)出現(xiàn)當(dāng)前 run 的配置文件,這里有一個(gè) callback 為 on_start,這說(shuō)明點(diǎn)擊 run 之后實(shí)際是執(zhí)行了 on_start() 方法。在 on_start() 方法中,我們利用 crawl() 方法生成一個(gè)爬取請(qǐng)求,那下方 follows 部分的數(shù)字 1 就代表了這一個(gè)爬取請(qǐng)求。

點(diǎn)擊下方的 follows 按鈕,即可看到生成的爬取請(qǐng)求的鏈接。每個(gè)鏈接的右側(cè)還有一個(gè)箭頭按鈕,如圖 12-7 所示。

pyspider的使用方法

圖 12-7 操作示例

點(diǎn)擊該箭頭,我們就可以對(duì)此鏈接進(jìn)行爬取,也就是爬取攻略的首頁(yè)內(nèi)容,如圖 12-8 所示。

pyspider的使用方法

圖 12-8 爬取結(jié)果

上方的 callback 已經(jīng)變成了 index_page,這就代表當(dāng)前運(yùn)行了 index_page() 方法。index_page() 接收到的 response 參數(shù)就是剛才生成的第一個(gè)爬取請(qǐng)求的 Response 對(duì)象。index_page() 方法通過(guò)調(diào)用 doc() 方法,傳入提取所有 a 節(jié)點(diǎn)的 CSS 選擇器,然后獲取 a 節(jié)點(diǎn)的屬性 href,這樣實(shí)際上就是獲取了第一個(gè)爬取頁(yè)面中的所有鏈接。然后在 index_page() 方法里遍歷了所有鏈接,同時(shí)調(diào)用 crawl() 方法,就把這一個(gè)個(gè)的鏈接構(gòu)造成新的爬取請(qǐng)求了。所以最下方 follows 按鈕部分有 217 的數(shù)字標(biāo)記,這代表新生成了 217 個(gè)爬取請(qǐng)求,同時(shí)這些請(qǐng)求的 URL 都呈現(xiàn)在當(dāng)前頁(yè)面了。

再點(diǎn)擊下方的 web 按鈕,即可預(yù)覽當(dāng)前爬取結(jié)果的頁(yè)面,如圖 12-9 所示。

pyspider的使用方法

圖 12-9 預(yù)覽頁(yè)面

當(dāng)前看到的頁(yè)面結(jié)果和瀏覽器看到的幾乎是完全一致的,在這里我們可以方便地查看頁(yè)面請(qǐng)求的結(jié)果。

點(diǎn)擊 html 按鈕即可查看當(dāng)前頁(yè)面的源代碼,如圖 12-10 所示。

pyspider的使用方法

圖 12-10 頁(yè)面源碼

如果需要分析代碼的結(jié)構(gòu),我們可以直接參考頁(yè)面源碼。

我們剛才在 index_page() 方法中提取了所有的鏈接并生成了新的爬取請(qǐng)求。但是很明顯要爬取的肯定不是所有鏈接,只需要攻略詳情的頁(yè)面鏈接就夠了,所以我們要修改一下當(dāng)前 index_page() 里提取鏈接時(shí)的 CSS 選擇器。

接下來(lái)需要另外一個(gè)工具。首先切換到 Web 頁(yè)面,找到攻略的標(biāo)題,點(diǎn)擊下方的 enable css selector helper,點(diǎn)擊標(biāo)題。這時(shí)候我們看到標(biāo)題外多了一個(gè)紅框,上方出現(xiàn)了一個(gè) CSS 選擇器,這就是當(dāng)前標(biāo)題對(duì)應(yīng)的 CSS 選擇器,如圖 12-11 所示。

pyspider的使用方法

圖 12-11 CSS 工具

在右側(cè)代碼選中要更改的區(qū)域,點(diǎn)擊左欄的右箭頭,此時(shí)在上方出現(xiàn)的標(biāo)題的 CSS 選擇器就會(huì)被替換到右側(cè)代碼中,如圖 12-12 所示。

pyspider的使用方法

圖 12-12 操作結(jié)果

這樣就成功完成了 CSS 選擇器的替換,非常便捷。

重新點(diǎn)擊左欄右上角的 run 按鈕,即可重新執(zhí)行 index_page() 方法。此時(shí)的 follows 就變成了 10 個(gè),也就是說(shuō)現(xiàn)在我們提取的只有當(dāng)前頁(yè)面的 10 個(gè)攻略,如圖 12-13 所示。

pyspider的使用方法

圖 12-13 運(yùn)行結(jié)果

我們現(xiàn)在抓取的只是第一頁(yè)的內(nèi)容,還需要抓取后續(xù)頁(yè)面,所以還需要一個(gè)爬取鏈接,即爬取下一頁(yè)的攻略列表頁(yè)面。我們?cè)倮?crawl() 方法添加下一頁(yè)的爬取請(qǐng)求,在 index_page() 方法里面添加如下代碼,然后點(diǎn)擊 save 保存:

next = response.doc('.next').attr.href
self.crawl(next, callback=self.index_page)

利用 CSS 選擇器選中下一頁(yè)的鏈接,獲取它的 href 屬性,也就獲取了頁(yè)面的 URL。然后將該 URL 傳給 crawl() 方法,同時(shí)指定回調(diào)函數(shù),注意這里回調(diào)函數(shù)仍然指定為 index_page() 方法,因?yàn)橄乱豁?yè)的結(jié)構(gòu)與此頁(yè)相同。

重新點(diǎn)擊 run 按鈕,這時(shí)就可以看到 11 個(gè)爬取請(qǐng)求。follows 按鈕上會(huì)顯示 11,這就代表我們成功添加了下一頁(yè)的爬取請(qǐng)求,如圖 12-14 所示。

pyspider的使用方法

圖 12-14 運(yùn)行結(jié)果

現(xiàn)在,索引列表頁(yè)的解析過(guò)程我們就完成了。

6. 爬取詳情頁(yè)

任意選取一個(gè)詳情頁(yè)進(jìn)入,點(diǎn)擊前 10 個(gè)爬取請(qǐng)求中的任意一個(gè)的右箭頭,執(zhí)行詳情頁(yè)的爬取,如圖 12-15 所示。

pyspider的使用方法

圖 12-15 運(yùn)行結(jié)果

切換到 Web 頁(yè)面預(yù)覽效果,頁(yè)面下拉之后,頭圖正文中的一些圖片一直顯示加載中,如圖 12-16 和圖 12-17 所示。

pyspider的使用方法

圖 12-16 預(yù)覽結(jié)果

pyspider的使用方法

圖 12-17 預(yù)覽結(jié)果

查看源代碼,我們沒(méi)有看到 img 節(jié)點(diǎn),如圖 12-18 所示。

pyspider的使用方法

圖 12-18 源代碼

出現(xiàn)此現(xiàn)象的原因是 pyspider 默認(rèn)發(fā)送 HTTP 請(qǐng)求,請(qǐng)求的 HTML 文檔本身就不包含 img 節(jié)點(diǎn)。但是在瀏覽器中我們看到了圖片,這是因?yàn)檫@張圖片是后期經(jīng)過(guò) JavaScript 出現(xiàn)的。那么,我們?cè)撊绾潍@取呢?

幸運(yùn)的是,pyspider 內(nèi)部對(duì)接了 PhantomJS,那么我們只需要修改一個(gè)參數(shù)即可。

我們將 index_page() 中生成抓取詳情頁(yè)的請(qǐng)求方法添加一個(gè)參數(shù) fetch_type,改寫(xiě)的 index_page() 變?yōu)槿缦聝?nèi)容:

def index_page(self, response):
    for each in response.doc('li> .tit > a').items():
        self.crawl(each.attr.href, callback=self.detail_page, fetch_type='js')
    next = response.doc('.next').attr.href
    self.crawl(next, callback=self.index_page)

接下來(lái),我們來(lái)試試它的抓取效果。

點(diǎn)擊左欄上方的左箭頭返回,重新調(diào)用 index_page() 方法生成新的爬取詳情頁(yè)的 Request,如圖 12-19 所示。

pyspider的使用方法

圖 12-19 爬取詳情

再點(diǎn)擊新生成的詳情頁(yè) Request 的爬取按鈕,這時(shí)我們便可以看到頁(yè)面變成了這樣子,如圖 12-20 所示。

pyspider的使用方法

圖 12-20 運(yùn)行結(jié)果

圖片被成功渲染出來(lái),這就是啟用了 PhantomJS 渲染后的結(jié)果。只需要添加一個(gè) fetch_type 參數(shù)即可,這非常方便。

最后就是將詳情頁(yè)中需要的信息提取出來(lái),提取過(guò)程不再贅述。最終 detail_page() 方法改寫(xiě)如下所示:

def detail_page(self, response):
    return {
        'url': response.url,
        'title': response.doc('#booktitle').text(),
        'date': response.doc('.when .data').text(),
        'day': response.doc('.howlong .data').text(),
        'who': response.doc('.who .data').text(),
        'text': response.doc('#b_panel_schedule').text(),
        'image': response.doc('.cover_img').attr.src
    }

我們分別提取了頁(yè)面的鏈接、標(biāo)題、出行日期、出行天數(shù)、人物、攻略正文、頭圖信息,將這些信息構(gòu)造成一個(gè)字典。

重新運(yùn)行,即可發(fā)現(xiàn)輸出結(jié)果如圖 12-21 所示。

pyspider的使用方法

圖 12-21 輸出結(jié)果

左欄中輸出了最終構(gòu)造的字典信息,這就是一篇攻略的抓取結(jié)果。

7. 啟動(dòng)爬蟲(chóng)

返回爬蟲(chóng)的主頁(yè)面,將爬蟲(chóng)的 status 設(shè)置成 DEBUG 或 RUNNING,點(diǎn)擊右側(cè)的 Run 按鈕即可開(kāi)始爬取,如圖 12-22 所示。

pyspider的使用方法

圖 12-22 啟動(dòng)爬蟲(chóng)

在最左側(cè)我們可以定義項(xiàng)目的分組,以方便管理。rate/burst 代表當(dāng)前的爬取速率,rate 代表 1 秒發(fā)出多少個(gè)請(qǐng)求,burst 相當(dāng)于流量控制中的令牌桶算法的令牌數(shù),rate 和 burst 設(shè)置的越大,爬取速率越快,當(dāng)然速率需要考慮本機(jī)性能和爬取過(guò)快被封的問(wèn)題。process 中的 5m、1h、1d 指的是最近 5 分、1 小時(shí)、1 天內(nèi)的請(qǐng)求情況,all 代表所有的請(qǐng)求情況。請(qǐng)求由不同顏色表示,藍(lán)色的代表等待被執(zhí)行的請(qǐng)求,綠色的代表成功的請(qǐng)求,黃色的代表請(qǐng)求失敗后等待重試的請(qǐng)求,紅色的代表失敗次數(shù)過(guò)多而被忽略的請(qǐng)求,這樣可以直觀知道爬取的進(jìn)度和請(qǐng)求情況,如圖 12-23 所示。

pyspider的使用方法

圖 12-23 爬取情況

點(diǎn)擊 Active Tasks,即可查看最近請(qǐng)求的詳細(xì)狀況,如圖 12-24 所示。

pyspider的使用方法

圖 12-24 最近請(qǐng)求

點(diǎn)擊 Results,即可查看所有的爬取結(jié)果,如圖 12-25 所示。

pyspider的使用方法

圖 12-25 爬取結(jié)果

點(diǎn)擊右上角的按鈕,即可獲取數(shù)據(jù)的 JSON、CSV 格式。

以上是pyspider的使用方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

網(wǎng)頁(yè)名稱(chēng):pyspider的使用方法-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article4/hecoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、自適應(yīng)網(wǎng)站、品牌網(wǎng)站建設(shè)企業(yè)建站、靜態(tài)網(wǎng)站、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)