溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

pyspider的使用方法

發(fā)布時(shí)間:2020-08-03 09:31:33 來源:億速云 閱讀:159 作者:清晨 欄目:編程語言

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

pyspider 的基本使用

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

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

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

2. 準(zhǔn)備工作

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

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 端口上??梢源蜷_瀏覽器,輸入鏈接 http://localhost:5000,這時(shí)我們會(huì)看到頁面,如圖 12-3 所示。

pyspider的使用方法

圖 12-3 WebUI 頁面

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

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

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

pyspider的使用方法

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

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

pyspider的使用方法

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

左側(cè)就是代碼的調(diào)試頁面,點(diǎn)擊左側(cè)右上角的 run 單步調(diào)試爬蟲程序,在左側(cè)下半部分可以預(yù)覽當(dāng)前的爬取頁面。右側(cè)是代碼編輯頁面,我們可以直接編輯代碼和保存代碼,不需要借助于 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ǔ)的邏輯。整個(gè)爬蟲的功能只需要一個(gè) Handler 即可完成。

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

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

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

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

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

5. 爬取首頁

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

pyspider的使用方法

圖 12-6 操作示例

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

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

pyspider的使用方法

圖 12-7 操作示例

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

pyspider的使用方法

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

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

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

pyspider的使用方法

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

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

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

pyspider的使用方法

圖 12-10 頁面源碼

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

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

接下來需要另外一個(gè)工具。首先切換到 Web 頁面,找到攻略的標(biāo)題,點(diǎn)擊下方的 enable css selector helper,點(diǎn)擊標(biāo)題。這時(shí)候我們看到標(biāo)題外多了一個(gè)紅框,上方出現(xiàn)了一個(gè) CSS 選擇器,這就是當(dāng)前標(biāo)題對應(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è),也就是說現(xiàn)在我們提取的只有當(dāng)前頁面的 10 個(gè)攻略,如圖 12-13 所示。

pyspider的使用方法

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

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

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

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

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

pyspider的使用方法

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

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

6. 爬取詳情頁

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

pyspider的使用方法

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

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

pyspider的使用方法

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

pyspider的使用方法

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

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

pyspider的使用方法

圖 12-18 源代碼

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

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

我們將 index_page() 中生成抓取詳情頁的請求方法添加一個(gè)參數(shù) fetch_type,改寫的 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)

接下來,我們來試試它的抓取效果。

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

pyspider的使用方法

圖 12-19 爬取詳情

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

pyspider的使用方法

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

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

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

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
    }

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

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

pyspider的使用方法

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

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

7. 啟動(dòng)爬蟲

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

pyspider的使用方法

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

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

pyspider的使用方法

圖 12-23 爬取情況

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

pyspider的使用方法

圖 12-24 最近請求

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

pyspider的使用方法

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

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

以上是pyspider的使用方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI