在這個教程,我們將會從IMDb上采集電影和電視信息
一個在線的完整模型代碼在: http://demo.pyspider.org/debug/tutorial_imdb .
你應(yīng)該安裝了pyspider。你可以參考快速入門文檔,或者在demo.pyspider.org.測試你的代碼。 在采集之前,一些基礎(chǔ)的知識你應(yīng)該知道的。
采集網(wǎng)頁信息就是:
我們想要獲得IMDb的電影,第一件事就是找到一個列表。一個好的列表可能如下:
通過查看IMDb主頁,我發(fā)現(xiàn)了這個列表:
http://www.imdb.com/search/title?count=100&title_type=feature,tv_series,tv_movie&ref_=nv_ch_mm_1
修改抓取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)
```
點擊綠色的run按鈕,你就會有一個紅點在緊跟,點擊緊跟的儀表盤,點擊綠色的繼續(xù)按鈕:
在索引頁,我們需要摘取兩條信息:
正如你所看到的,樣本處理程序已經(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)
CSS 選擇器
CSS 選擇器是一種被CSS用來選擇需要改變樣式HTML元素的模式。在文檔中,包含信息的元素可能有不同樣式,用CSS選擇器去選擇我想要的元素是合適的。更多的選擇器信息你可以在一下當(dāng)中找到:
你可以使用reqponse.doc創(chuàng)建的CSS選擇器,它來自PyQuery,你可以找到更完全的資料。
pyspider 提供了一個工具叫做CSS選擇器助手,它可以簡化生成一個選擇路徑通過你點擊元素。啟用CSS選擇器通過點擊按鈕在web儀表盤上。 元素會高亮,當(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ā)工具。
你不需要寫過多的父級元素在選擇器路徑上。只需要能夠區(qū)分元素就可以了??墒沁@個是需要經(jīng)驗在采集和web開發(fā)中,去知道哪一個元素是更重要的,可以用來做定位器。你可以嘗試測試CSS選擇器在JavaScript的控制臺中使用$$比如$$('[itemprop="director"] span')
這個只是簡單的例子,你會發(fā)現(xiàn)更多的問題當(dāng)你爬取IMDb的時候。
更多建議: