掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
雖然以前寫過 如何抓取WEB頁面 和 如何從 WEB 頁面中提取信息。但是感覺還是需要一篇 step by step 的教程,不然沒有一個總體的認識。不過,沒想到這個教程居然會變成一篇譯文,在這個爬蟲教程系列文章中,會以實際的例子,由淺入深討論爬取(抓取和解析)的一些關鍵問題。

二道網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、自適應網(wǎng)站建設等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)。
在 教程一 中,我們將要爬取的網(wǎng)站是豆瓣電影:http://movie.douban.com/
你可以在: http://demo.pyspider.org/debug/tutorial_douban_movie 獲得完整的代碼,和進行測試。
開始之前
由于教程是基于 pyspider 的,你可以安裝一個 pyspider(Quickstart,也可以直接使用 pyspider 的 demo 環(huán)境: http://demo.pyspider.org/。
你還應該至少對萬維網(wǎng)是什么有一個簡單的認識:
所以,爬網(wǎng)頁實際上就是:
選取一個開始網(wǎng)址
既然我們要爬所有的電影,首先我們需要抓一個電影列表,一個好的列表應該:
我們在 http://movie.douban.com/ 掃了一遍,發(fā)現(xiàn)并沒有一個列表能包含所有電影,只能退而求其次,通過抓取分類下的所有的標簽列表頁,來遍歷所有的電影: http://movie.douban.com/tag/
創(chuàng)建一個項目
在 pyspider 的 dashboard 的右下角,點擊 “Create” 按鈕
替換 on_start 函數(shù)的 self.crawl 的 URL:
- @every(minutes=24 * 60)
- def on_start(self):
- self.crawl('http://movie.douban.com/tag/', callback=self.index_page)
點擊綠色的 run 執(zhí)行,你會看到 follows 上面有一個紅色的 1,切換到 follows 面板,點擊綠色的播放按鈕:
Tag 列表頁
在 tag 列表頁 中,我們需要提取出所有的 電影列表頁 的 URL。你可能已經(jīng)發(fā)現(xiàn)了,sample handler 已經(jīng)提取了非常多大的 URL,所有,一種可行的提取列表頁 URL 的方法就是用正則從中過濾出來:
- import re
- ...
- @config(age=10 * 24 * 60 * 60)
- def index_page(self, response):
- for each in response.doc('a[href^="http"]').items():
- if re.match("http://movie.douban.com/tag/\w+", each.attr.href, re.U):
- self.crawl(each.attr.href, callback=self.list_page)
由于 電影列表頁和 tag列表頁長的并不一樣,在這里新建了一個 callback 為 self.list_page
電影列表頁
再次點擊 run 讓我們進入一個電影列表頁(list_page)。在這個頁面中我們需要提?。?/p>
CSS選擇器
CSS選擇器,顧名思義,是 CSS 用來定位需要設置樣式的元素 所使用的表達式。既然前端程序員都使用 CSS選擇器 為頁面上的不同元素設置樣式,我們也可以通過它定位需要的元素。你可以在 CSS 選擇器參考手冊 這里學習更多的 CSS選擇器 語法。
在 pyspider 中,內(nèi)置了 response.doc 的 PyQuery 對象,讓你可以使用類似 jQuery 的語法操作 DOM 元素。你可以在 PyQuery 的頁面上找到完整的文檔。
CSS Selector Helper
在 pyspider 中,還內(nèi)置了一個 CSS Selector Helper,當你點擊頁面上的元素的時候,可以幫你生成它的 CSS選擇器 表達式。你可以點擊 Enable CSS selector helper 按鈕,然后切換到 web 頁面:
開啟后,鼠標放在元素上,會被黃色高亮,點擊后,所有擁有相同 CSS選擇器 表達式的元素會被高亮。表達式會被插入到 python 代碼當前光標位置。創(chuàng)建下面的代碼,將光標停留在單引號中間:
- def list_page(self, response):
- for each in response.doc('').items():
點擊一個電影的鏈接,CSS選擇器 表達式將會插入到你的代碼中,如此重復,插入翻頁的鏈接:
- def list_page(self, response):
- for each in response.doc('HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV>TABLE TR.item>TD>DIV.pl2>A').items():
- self.crawl(each.attr.href, callback=self.detail_page)
- # 翻頁
- for each in response.doc('HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.paginator>A').items():
- self.crawl(each.attr.href, callback=self.list_page)
電影詳情頁
再次點擊 run,follow 到詳情頁。使用 css selector helper 分別添加電影標題,打分和導演:
- def detail_page(self, response):
- return {
- "url": response.url,
- "title": response.doc('HTML>BODY>DIV#wrapper>DIV#content>H1>SPAN').text(),
- "rating": response.doc('HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.indent.clearfix>DIV.subjectwrap.clearfix>DIV#interest_sectl>DIV.rating_wrap.clearbox>P.rating_self.clearfix>STRONG.ll.rating_num').text(),
- "導演": [x.text() for x in response.doc('a[rel="v:directedBy"]').items()],
- }
注意,你會發(fā)現(xiàn) css selector helper 并不是總是能提取到合適的 CSS選擇器 表達式。你可以在 Chrome Dev Tools 的幫助下,寫一個合適的表達式:
右鍵點擊需要提取的元素,點擊審查元素。你并不需要像自動生成的表達式那樣寫出所有的祖先節(jié)點,只要寫出那些能區(qū)分你不需要的元素的關鍵節(jié)點的屬性就可以了。不過這需要抓取和網(wǎng)頁前端的經(jīng)驗。所以,學習抓取的最好方法就是學會這個頁面/網(wǎng)站是怎么寫的。
你也可以在 Chrome Dev Tools 的 Javascript Console 中,使用 $$(a[rel="v:directedBy"]) 測試 CSS Selector。
開始抓取

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流