pyspider 選擇器

2023-02-16 17:47 更新

Level 1: HTML and CSS Selector

在這個教程,我們將會從IMDb上采集電影和電視信息

一個在線的完整模型代碼在: http://demo.pyspider.org/debug/tutorial_imdb .

開始之前

你應(yīng)該安裝了pyspider。你可以參考快速入門文檔,或者在demo.pyspider.org.測試你的代碼。 在采集之前,一些基礎(chǔ)的知識你應(yīng)該知道的。

  • 萬維網(wǎng)是一個由超文本網(wǎng)頁組成的系統(tǒng)
  • 頁面是通過統(tǒng)一資源符URL在萬維網(wǎng)上定位的
  • 頁面是通過超文本傳輸協(xié)議HTTP傳輸協(xié)議傳輸?shù)?/li>
  • 網(wǎng)頁的構(gòu)成是使用超文本標(biāo)記語言HTML的

采集網(wǎng)頁信息就是:

  1. 找到所有包含我們想要的信息的網(wǎng)頁url
  2. 取得網(wǎng)頁通過HTTP協(xié)議
  3. 解析網(wǎng)頁的信息
  4. 找到更多的url我們想要的,再一次執(zhí)行第2個步驟

選擇一個開始的URL

我們想要獲得IMDb的電影,第一件事就是找到一個列表。一個好的列表可能如下:

  • 盡可能包含多的電影信息鏈接
  • 通過下一頁,你可以來回獲得所有的電影
  • 按更新時間排序的列表可以獲得最新的電影

通過查看IMDb主頁,我發(fā)現(xiàn)了這個列表: IMDb主頁圖片

http://www.imdb.com/search/title?count=100&title_type=feature,tv_series,tv_movie&ref_=nv_ch_mm_1

建立一個項目

你可以找到“Create”按鈕在主控制臺。點擊并且命名。 IMDb命名圖片

修改抓取crawl的url在on_start回調(diào)中:

```
@every(minutes=24 * 60)
def on_start(self):
    self.crawl('http://www.imdb.com/search/title?count=100&title_type=feature,tv_series,tv_movie&ref_=nv_ch_mm_1', callback=self.index_page)
```
  • self.crawl會取得頁面然后調(diào)用callback方法去解析響應(yīng)。
  • @every裝飾器表示,on_start將會每天運行 ,去確保不會錯過任何新的電影。

點擊綠色的run按鈕,你就會有一個紅點在緊跟,點擊緊跟的儀表盤,點擊綠色的繼續(xù)按鈕: IMDb緊跟圖片

索引頁

在索引頁,我們需要摘取兩條信息:

  • 鏈接到電影的鏈接像是http://www.imdb.com/title/tt0167260/
  • 鏈接到下一頁

找到電影

正如你所看到的,樣本處理程序已經(jīng)找到1900+條連接在頁面上。一個提取電影頁面的方式是使用正則表達(dá)式:

 import re
 ...
 def index_page(self, response):
     for each in response.doc('a[href^="http"]').items():
         if re.match("http://www.imdb.com/title/tt\d+/$", each.attr.href):
             self.crawl(each.attr.href, callback=self.detail_page)
  • callback 是 self.detail_page 在這里使用別的回調(diào)方法來解析。謹(jǐn)記,你可以使用強大的python或者你所熟悉的功能來解析信息。但是,使用CSS選擇器是推薦的。

下一頁

CSS 選擇器

CSS 選擇器是一種被CSS用來選擇需要改變樣式HTML元素的模式。在文檔中,包含信息的元素可能有不同樣式,用CSS選擇器去選擇我想要的元素是合適的。更多的選擇器信息你可以在一下當(dāng)中找到:

你可以使用reqponse.doc創(chuàng)建的CSS選擇器,它來自PyQuery,你可以找到更完全的資料。

CSS 選擇器助手

pyspider 提供了一個工具叫做CSS選擇器助手,它可以簡化生成一個選擇路徑通過你點擊元素。啟用CSS選擇器通過點擊按鈕在web儀表盤上。 css_selector_helper.png 元素會高亮,當(dāng)你的鼠標(biāo)在元素上面的時候。當(dāng)你點擊它,一個CSS路徑就會展示在工具欄上。你可以編輯它還有添加到你的源代碼。

點擊下一步"Next》"在頁面上然后添加選擇的路徑到你的代碼上:

```
def index_page(self, response):
        for each in response.doc('a[href^="http"]').items():
            if re.match("http://www.imdb.com/title/tt\d+/$", each.attr.href):
                self.crawl(each.attr.href, callback=self.detail_page)
        self.crawl(response.doc('#right a').attr.href, callback=self.index_page)
```

再一次點擊 run同時移動到下一頁,我們可以看到"《Prev" "Next》"有相同的選擇路徑。當(dāng)我們使用上述代碼的時候,會使用“Prev”而不是“Next”。一個解決方法是都選擇他們。

```
self.crawl([x.attr.href for x in response.doc('#right a').items()], callback=self.index_page)
```

解析信息

再次點擊run然后跳到詳情頁 添加你需要獲取的結(jié)果到字典中,使用CSS選擇器助手重復(fù)的獲取值:

def detail_page(self, response):
            return {
                "url": response.url,
                "title": response.doc('.header > [itemprop="name"]').text(),
                "rating": response.doc('.star-box-giga-star').text(),
                "director": [x.text() for x in response.doc('[itemprop="director"] span').items()],
            }

注意,CSS選擇器助手可能不總是工作。你可以手寫選擇器路徑使用Chrome的開發(fā)工具。 inspect_element.png

你不需要寫過多的父級元素在選擇器路徑上。只需要能夠區(qū)分元素就可以了??墒沁@個是需要經(jīng)驗在采集和web開發(fā)中,去知道哪一個元素是更重要的,可以用來做定位器。你可以嘗試測試CSS選擇器在JavaScript的控制臺中使用$$比如$$('[itemprop="director"] span')

運行

  1. 在你調(diào)試好代碼后,不要忘記保存它。
  2. 返回主儀表盤找到你的項目
  3. 改一下狀態(tài)status從DEBUG到RUNNING
  4. 按下run按鈕 index_page.png

注意

這個只是簡單的例子,你會發(fā)現(xiàn)更多的問題當(dāng)你爬取IMDb的時候。

  • 列表頁的引用url是為了跟蹤我們,最好移除它。
  • 對任何查詢,IMDb不會服務(wù)超過100000個結(jié)果,你需要找到更少結(jié)果的列表頁。比如這個
  • 你可能需要一個列表使用最新的時間排序,然后以更短的時間更新它。
  • 有一些元素是很難解析的,你可能需要通過xpath去解析它,或者python代碼。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號