日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pyspider 爬虫教程

發(fā)布時間:2023/12/29 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pyspider 爬虫教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

pyspider 爬蟲教程(一):HTML 和 CSS 選擇器

雖然以前寫過?如何抓取WEB頁面?和?如何從 WEB 頁面中提取信息。但是感覺還是需要一篇 step by step 的教程,不然沒有一個總體的認識。不過,沒想到這個教程居然會變成一篇譯文,在這個爬蟲教程系列文章中,會以實際的例子,由淺入深討論爬取(抓取和解析)的一些關鍵問題。

在 教程一 中,我們將要爬取的網站是豆瓣電影:http://movie.douban.com/

你可以在:?http://demo.pyspider.org/debug/tutorial_douban_movie?獲得完整的代碼,和進行測試。

開始之前

由于教程是基于 pyspider 的,你可以安裝一個 pyspider(Quickstart,也可以直接使用 pyspider 的 demo 環(huán)境:http://demo.pyspider.org/。

你還應該至少對萬維網是什么有一個簡單的認識:

  • 萬維網是一個由許多互相鏈接的超文本頁面(以下簡稱網頁)組成的系統(tǒng)。
  • 網頁使用網址(URL)定位,并鏈接彼此
  • 網頁使用?HTTP?協(xié)議傳輸
  • 網頁使用?HTML?描述外觀和語義

所以,爬網頁實際上就是:

  • 找到包含我們需要的信息的網址(URL)列表
  • 通過 HTTP 協(xié)議把頁面下載回來
  • 從頁面的 HTML 中解析出需要的信息
  • 找到更多這個的 URL,回到 2 繼續(xù)
  • 選取一個開始網址

    既然我們要爬所有的電影,首先我們需要抓一個電影列表,一個好的列表應該:

    • 包含足夠多的電影的 URL
    • 通過翻頁,可以遍歷到所有的電影
    • 一個按照更新時間排序的列表,可以更快抓到最新更新的電影

    我們在?http://movie.douban.com/?掃了一遍,發(fā)現(xiàn)并沒有一個列表能包含所有電影,只能退而求其次,通過抓取分類下的所有的標簽列表頁,來遍歷所有的電影:?http://movie.douban.com/tag/

    創(chuàng)建一個項目

    在 pyspider 的 dashboard 的右下角,點擊 “Create” 按鈕

    替換?on_start?函數(shù)的?self.crawl?的 URL:

    123 @every(minutes=24 * 60)def on_start(self):self.crawl('http://movie.douban.com/tag/', callback=self.index_page)
    • self.crawl?告訴 pyspider 抓取指定頁面,然后使用?callback?函數(shù)對結果進行解析。
    • @every) 修飾器,表示?on_start?每天會執(zhí)行一次,這樣就能抓到最新的電影了。

    點擊綠色的?run?執(zhí)行,你會看到?follows?上面有一個紅色的 1,切換到?follows?面板,點擊綠色的播放按鈕:

    Tag 列表頁

    在?tag 列表頁?中,我們需要提取出所有的 電影列表頁 的 URL。你可能已經發(fā)現(xiàn)了,sample handler 已經提取了非常多大的 URL,所有,一種可行的提取列表頁 URL 的方法就是用正則從中過濾出來:

    12345678 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
    • @config(age=10 * 24 * 60 * 60)?在這表示我們認為 10 天內頁面有效,不會再次進行更新抓取

    由于 pyspider 是純 Python 環(huán)境,你可以使用 Python 強大的內置庫,或者你熟悉的第三方庫對頁面進行解析。不過更推薦使用 CSS選擇器。

    電影列表頁

    再次點擊?run?讓我們進入一個電影列表頁(list_page)。在這個頁面中我們需要提取:

    • 電影的鏈接,例如,http://movie.douban.com/subject/1292052/
    • 下一頁的鏈接,用來翻頁

    CSS選擇器

    CSS選擇器,顧名思義,是?CSS?用來定位需要設置樣式的元素 所使用的表達式。既然前端程序員都使用 CSS選擇器 為頁面上的不同元素設置樣式,我們也可以通過它定位需要的元素。你可以在?CSS 選擇器參考手冊?這里學習更多的 CSS選擇器 語法。

    在 pyspider 中,內置了?response.doc?的?PyQuery?對象,讓你可以使用類似 jQuery 的語法操作 DOM 元素。你可以在?PyQuery的頁面上找到完整的文檔。

    CSS Selector Helper

    在 pyspider 中,還內置了一個?CSS Selector Helper,當你點擊頁面上的元素的時候,可以幫你生成它的 CSS選擇器 表達式。你可以點擊?Enable CSS selector helper?按鈕,然后切換到?web?頁面:

    開啟后,鼠標放在元素上,會被黃色高亮,點擊后,所有擁有相同 CSS選擇器 表達式的元素會被高亮。表達式會被插入到 python 代碼當前光標位置。創(chuàng)建下面的代碼,將光標停留在單引號中間:

    12 def list_page(self, response): for each in response.doc('').items():

    點擊一個電影的鏈接,CSS選擇器 表達式將會插入到你的代碼中,如此重復,插入翻頁的鏈接:

    123456 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)
    • 翻頁是一個到自己的?callback?回調

    電影詳情頁

    再次點擊?run,follow 到詳情頁。使用?css selector helper?分別添加電影標題,打分和導演:

    1234567 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é)點的屬性就可以了。不過這需要抓取和網頁前端的經驗。所以,學習抓取的最好方法就是學會這個頁面/網站是怎么寫的。

    你也可以在 Chrome Dev Tools 的 Javascript Console 中,使用?$$(a[rel="v:directedBy"])?測試 CSS Selector。

    開始抓取

  • 使用?run?單步調試你的代碼,對于用一個?callback?最好使用多個頁面類型進行測試。然后保存。
  • 回到 Dashboard,找到你的項目
  • 將?status?修改為?DEBUG?或?RUNNING
  • 按?run?按鈕
  • 總結

    以上是生活随笔為你收集整理的pyspider 爬虫教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。