摘要:但是感覺(jué)還是需要一篇的教程,不然沒(méi)有一個(gè)總體的認(rèn)識(shí)。修飾器,表示每天會(huì)執(zhí)行一次,這樣就能抓到最新的電影了。不過(guò)更推薦使用選擇器。既然前端程序員都使用選擇器為頁(yè)面上的不同元素設(shè)置樣式,我們也可以通過(guò)它定位需要的元素。
雖然以前寫過(guò) 如何抓取WEB頁(yè)面 和 如何從 WEB 頁(yè)面中提取信息。但是感覺(jué)還是需要一篇 step by step 的教程,不然沒(méi)有一個(gè)總體的認(rèn)識(shí)。不過(guò),沒(méi)想到這個(gè)教程居然會(huì)變成一篇譯文,在這個(gè)爬蟲教程系列文章中,會(huì)以實(shí)際的例子,由淺入深討論爬?。ㄗト『徒馕觯┑囊恍╆P(guān)鍵問(wèn)題。
在 教程一 中,我們將要爬取的網(wǎng)站是豆瓣電影:http://movie.douban.com/
你可以在: http://demo.pyspider.org/debug/tutorial_douban_movie 獲得完整的代碼,和進(jìn)行測(cè)試。
開始之前由于教程是基于 pyspider 的,你可以安裝一個(gè) pyspider(Quickstart,也可以直接使用 pyspider 的 demo 環(huán)境: http://demo.pyspider.org/。
你還應(yīng)該至少對(duì)萬(wàn)維網(wǎng)是什么有一個(gè)簡(jiǎn)單的認(rèn)識(shí):
萬(wàn)維網(wǎng)是一個(gè)由許多互相鏈接的超文本頁(yè)面(以下簡(jiǎn)稱網(wǎng)頁(yè))組成的系統(tǒng)。
網(wǎng)頁(yè)使用網(wǎng)址(URL)定位,并鏈接彼此
網(wǎng)頁(yè)使用 HTTP 協(xié)議傳輸
網(wǎng)頁(yè)使用 HTML 描述外觀和語(yǔ)義
所以,爬網(wǎng)頁(yè)實(shí)際上就是:
找到包含我們需要的信息的網(wǎng)址(URL)列表
通過(guò) HTTP 協(xié)議把頁(yè)面下載回來(lái)
從頁(yè)面的 HTML 中解析出需要的信息
找到更多這個(gè)的 URL,回到 2 繼續(xù)
選取一個(gè)開始網(wǎng)址既然我們要爬所有的電影,首先我們需要抓一個(gè)電影列表,一個(gè)好的列表應(yīng)該:
包含足夠多的電影的 URL
通過(guò)翻頁(yè),可以遍歷到所有的電影
一個(gè)按照更新時(shí)間排序的列表,可以更快抓到最新更新的電影
我們?cè)?http://movie.douban.com/ 掃了一遍,發(fā)現(xiàn)并沒(méi)有一個(gè)列表能包含所有電影,只能退而求其次,通過(guò)抓取分類下的所有的標(biāo)簽列表頁(yè),來(lái)遍歷所有的電影: http://movie.douban.com/tag/
創(chuàng)建一個(gè)項(xiàng)目在 pyspider 的 dashboard 的右下角,點(diǎn)擊 "Create" 按鈕
替換 on_start 函數(shù)的 self.crawl 的 URL:
python@every(minutes=24 * 60) def on_start(self): self.crawl("http://movie.douban.com/tag/", callback=self.index_page)
self.crawl 告訴 pyspider 抓取指定頁(yè)面,然后使用 callback 函數(shù)對(duì)結(jié)果進(jìn)行解析。
@every 修飾器,表示 on_start 每天會(huì)執(zhí)行一次,這樣就能抓到最新的電影了。
點(diǎn)擊綠色的 run 執(zhí)行,你會(huì)看到 follows 上面有一個(gè)紅色的 1,切換到 follows 面板,點(diǎn)擊綠色的播放按鈕:
Tag 列表頁(yè)在 tag 列表頁(yè) 中,我們需要提取出所有的 電影列表頁(yè) 的 URL。你可能已經(jīng)發(fā)現(xiàn)了,sample handler 已經(jīng)提取了非常多大的 URL,所有,一種可行的提取列表頁(yè) URL 的方法就是用正則從中過(guò)濾出來(lái):
pythonimport 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)
由于 電影列表頁(yè)和 tag列表頁(yè)長(zhǎng)的并不一樣,在這里新建了一個(gè) callback 為 self.list_page
@config(age=10 * 24 * 60 * 60) 在這表示我們認(rèn)為 10 天內(nèi)頁(yè)面有效,不會(huì)再次進(jìn)行更新抓取
由于 pyspider 是純 Python 環(huán)境,你可以使用 Python 強(qiáng)大的內(nèi)置庫(kù),或者你熟悉的第三方庫(kù)對(duì)頁(yè)面進(jìn)行解析。不過(guò)更推薦使用 CSS選擇器。
電影列表頁(yè)再次點(diǎn)擊 run 讓我們進(jìn)入一個(gè)電影列表頁(yè)(list_page)。在這個(gè)頁(yè)面中我們需要提取:
電影的鏈接,例如,http://movie.douban.com/subject/1292052/
下一頁(yè)的鏈接,用來(lái)翻頁(yè)
CSS選擇器CSS選擇器,顧名思義,是 CSS 用來(lái)定位需要設(shè)置樣式的元素 所使用的表達(dá)式。既然前端程序員都使用 CSS選擇器 為頁(yè)面上的不同元素設(shè)置樣式,我們也可以通過(guò)它定位需要的元素。你可以在 CSS 選擇器參考手冊(cè) 這里學(xué)習(xí)更多的 CSS選擇器 語(yǔ)法。
在 pyspider 中,內(nèi)置了 response.doc 的 PyQuery 對(duì)象,讓你可以使用類似 jQuery 的語(yǔ)法操作 DOM 元素。你可以在 PyQuery 的頁(yè)面上找到完整的文檔。
CSS Selector Helper在 pyspider 中,還內(nèi)置了一個(gè) CSS Selector Helper,當(dāng)你點(diǎn)擊頁(yè)面上的元素的時(shí)候,可以幫你生成它的 CSS選擇器 表達(dá)式。你可以點(diǎn)擊 Enable CSS selector helper 按鈕,然后切換到 web 頁(yè)面:
開啟后,鼠標(biāo)放在元素上,會(huì)被黃色高亮,點(diǎn)擊后,所有擁有相同 CSS選擇器 表達(dá)式的元素會(huì)被高亮。表達(dá)式會(huì)被插入到 python 代碼當(dāng)前光標(biāo)位置。創(chuàng)建下面的代碼,將光標(biāo)停留在單引號(hào)中間:
pythondef list_page(self, response): for each in response.doc("").items():
點(diǎn)擊一個(gè)電影的鏈接,CSS選擇器 表達(dá)式將會(huì)插入到你的代碼中,如此重復(fù),插入翻頁(yè)的鏈接:
pythondef 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) # 翻頁(yè) 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)
電影詳情頁(yè)翻頁(yè)是一個(gè)到自己的 callback 回調(diào)
再次點(diǎn)擊 run,follow 到詳情頁(yè)。使用 css selector helper 分別添加電影標(biāo)題,打分和導(dǎo)演:
pythondef 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(), "導(dǎo)演": [x.text() for x in response.doc("a[rel="v:directedBy"]").items()], }
注意,你會(huì)發(fā)現(xiàn) css selector helper 并不是總是能提取到合適的 CSS選擇器 表達(dá)式。你可以在 Chrome Dev Tools 的幫助下,寫一個(gè)合適的表達(dá)式:
右鍵點(diǎn)擊需要提取的元素,點(diǎn)擊審查元素。你并不需要像自動(dòng)生成的表達(dá)式那樣寫出所有的祖先節(jié)點(diǎn),只要寫出那些能區(qū)分你不需要的元素的關(guān)鍵節(jié)點(diǎn)的屬性就可以了。不過(guò)這需要抓取和網(wǎng)頁(yè)前端的經(jīng)驗(yàn)。所以,學(xué)習(xí)抓取的最好方法就是學(xué)會(huì)這個(gè)頁(yè)面/網(wǎng)站是怎么寫的。
你也可以在 Chrome Dev Tools 的 Javascript Console 中,使用 $$(a[rel="v:directedBy"]) 測(cè)試 CSS Selector。
開始抓取使用 run 單步調(diào)試你的代碼,對(duì)于用一個(gè) callback 最好使用多個(gè)頁(yè)面類型進(jìn)行測(cè)試。然后保存。
回到 Dashboard,找到你的項(xiàng)目
將 status 修改為 DEBUG 或 RUNNING
按 run 按鈕
原文:http://blog.binux.me/2015/01/pyspider-tutorial-level-1-html-and-css-selector/ (樣式比原文還好看,鬧哪樣啊)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37477.html
摘要:現(xiàn)在我們用一個(gè)實(shí)戰(zhàn)項(xiàng)目,來(lái)進(jìn)一步掌握框架的使用。此次的項(xiàng)目爬取的目標(biāo)是去哪兒網(wǎng),我要將所有攻略的作者標(biāo)題出發(fā)日期人均費(fèi)用攻略正文等保存下來(lái),存儲(chǔ)到中。代表當(dāng)前的爬取速率。 showImg(https://segmentfault.com/img/remote/1460000015563534); 閱讀文本大概需要 13 分鐘。 通過(guò)之前的文章介紹,你現(xiàn)在應(yīng)該對(duì) pyspider 有了一...
摘要:在上一篇教程中,我們使用抓取豆瓣電影的內(nèi)容,并使用選擇器解析了一些內(nèi)容。挨個(gè)查看每個(gè)請(qǐng)求,通過(guò)訪問(wèn)路徑和預(yù)覽,找到包含信息的請(qǐng)求在豆瓣這個(gè)例子中,請(qǐng)求并不多,可以挨個(gè)查看來(lái)確認(rèn)。腳本中還有一個(gè)使用渲染的提取版本,將會(huì)在下一篇教程中介紹。 在上一篇教程中,我們使用 self.crawl API 抓取豆瓣電影的 HTML 內(nèi)容,并使用 CSS 選擇器解析了一些內(nèi)容。不過(guò),現(xiàn)在的網(wǎng)站通過(guò)使用...
摘要:通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲,爬取對(duì)象從一些種子擴(kuò)充到整個(gè)。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會(huì)采取一定的爬取策略。介紹是一個(gè)國(guó)人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的。 爬蟲 簡(jiǎn)單的說(shuō)網(wǎng)絡(luò)爬蟲(Web crawler)也叫做網(wǎng)絡(luò)鏟(Web scraper)、網(wǎng)絡(luò)蜘蛛(Web spider),其行為一般是先爬到對(duì)應(yīng)的網(wǎng)頁(yè)上,再把需要的信息鏟下來(lái)。 分類 網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)技術(shù),...
摘要:通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲,爬取對(duì)象從一些種子擴(kuò)充到整個(gè)。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會(huì)采取一定的爬取策略。介紹是一個(gè)國(guó)人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的。 爬蟲 簡(jiǎn)單的說(shuō)網(wǎng)絡(luò)爬蟲(Web crawler)也叫做網(wǎng)絡(luò)鏟(Web scraper)、網(wǎng)絡(luò)蜘蛛(Web spider),其行為一般是先爬到對(duì)應(yīng)的網(wǎng)頁(yè)上,再把需要的信息鏟下來(lái)。 分類 網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)技術(shù),...
摘要:所以如果對(duì)爬蟲有一定基礎(chǔ),上手框架是一種好的選擇。缺少包,使用安裝即可缺少包,使用安裝即可上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)爬取相關(guān)庫(kù)的安裝的安裝下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)爬蟲框架的安裝 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---9、APP爬取相關(guān)庫(kù)的安裝:Appium的安裝下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---11、爬蟲框架的安裝:ScrapySplash、ScrapyRedis 我們直接...
閱讀 881·2021-11-15 11:37
閱讀 3618·2021-11-11 16:55
閱讀 3283·2021-11-11 11:01
閱讀 1008·2019-08-30 15:43
閱讀 2755·2019-08-30 14:12
閱讀 695·2019-08-30 12:58
閱讀 3397·2019-08-29 15:19
閱讀 2037·2019-08-29 13:59