99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

pyspider 選擇器

2023-02-16 17:47 更新

Level 1: HTML and CSS Selector

在這個(gè)教程,我們將會(huì)從IMDb上采集電影和電視信息

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

開(kāi)始之前

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

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

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

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

選擇一個(gè)開(kāi)始的URL

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

  • 盡可能包含多的電影信息鏈接
  • 通過(guò)下一頁(yè),你可以來(lái)回獲得所有的電影
  • 按更新時(shí)間排序的列表可以獲得最新的電影

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

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

建立一個(gè)項(xiàng)目

你可以找到“Create”按鈕在主控制臺(tái)。點(diǎn)擊并且命名。 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會(huì)取得頁(yè)面然后調(diào)用callback方法去解析響應(yīng)。
  • @every裝飾器表示,on_start將會(huì)每天運(yùn)行 ,去確保不會(huì)錯(cuò)過(guò)任何新的電影。

點(diǎn)擊綠色的run按鈕,你就會(huì)有一個(gè)紅點(diǎn)在緊跟,點(diǎn)擊緊跟的儀表盤(pán),點(diǎn)擊綠色的繼續(xù)按鈕: IMDb緊跟圖片

索引頁(yè)

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

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

找到電影

正如你所看到的,樣本處理程序已經(jīng)找到1900+條連接在頁(yè)面上。一個(gè)提取電影頁(yè)面的方式是使用正則表達(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)方法來(lái)解析。謹(jǐn)記,你可以使用強(qiáng)大的python或者你所熟悉的功能來(lái)解析信息。但是,使用CSS選擇器是推薦的。

下一頁(yè)

CSS 選擇器

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

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

CSS 選擇器助手

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

點(diǎn)擊下一步"Next》"在頁(yè)面上然后添加選擇的路徑到你的代碼上:

```
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)
```

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

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

解析信息

再次點(diǎn)擊run然后跳到詳情頁(yè) 添加你需要獲取的結(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選擇器助手可能不總是工作。你可以手寫(xiě)選擇器路徑使用Chrome的開(kāi)發(fā)工具。 inspect_element.png

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

運(yùn)行

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

注意

這個(gè)只是簡(jiǎn)單的例子,你會(huì)發(fā)現(xiàn)更多的問(wèn)題當(dāng)你爬取IMDb的時(shí)候。

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)