<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] 雖然以前寫過 如何抓取WEB頁面 和 如何從 WEB 頁面中提取信息。但是感覺還是需要一篇 step by step 的教程,不然沒有一個總體的認識。不過,沒想到這個教程居然會變成一篇譯文,在這個爬蟲教程系列文章中,會以實際的例子,由淺入深討論爬取(抓取和解析)的一些關鍵問題。 在 教程一 中,我們將要爬取的網站是豆瓣電影:http://movie.douban.com/ 你可以在: http://demo.pyspider.org/debug/tutorial_douban_movie 獲得完整的代碼,和進行測試。 # 開始之前 由于教程是基于 pyspider 的,你可以安裝一個 pyspider(Quickstart,也可以直接使用 pyspider 的 demo 環境: http://demo.pyspider.org/。 你還應該至少對萬維網是什么有一個簡單的認識: * 萬維網是一個由許多互相鏈接的超文本頁面(以下簡稱網頁)組成的系統。 * 網頁使用網址(URL)定位,并鏈接彼此 * 網頁使用 HTTP 協議傳輸 * 網頁使用 HTML 描述外觀和語義 所以,爬網頁實際上就是: * 找到包含我們需要的信息的網址(URL)列表 * 通過 HTTP 協議把頁面下載回來 * 從頁面的 HTML 中解析出需要的信息 * 找到更多這個的 URL,回到 2 繼續 # 選取一個開始網址 既然我們要爬所有的電影,首先我們需要抓一個電影列表,一個好的列表應該: * 包含足夠多的電影的 URL * 通過翻頁,可以遍歷到所有的電影 * 一個按照更新時間排序的列表,可以更快抓到最新更新的電影 我們在 http://movie.douban.com/ 掃了一遍,發現并沒有一個列表能包含所有電影,只能退而求其次,通過抓取分類下的所有的標簽列表頁,來遍歷所有的電影: http://movie.douban.com/tag/ ## 創建一個項目 在 pyspider 的 dashboard 的右下角,點擊 "Create" 按鈕 ![document/2015-10-08/56161cfc6d2fb](https://box.kancloud.cn/document_2015-10-08_56161cfc6d2fb.png) 替換 `on_start` 函數的 `self.crawl` 的 URL: ~~~ @every(minutes=24 * 60) def on_start(self): self.crawl('http://movie.douban.com/tag/', callback=self.index_page) ~~~ > self.crawl 告訴 pyspider 抓取指定頁面,然后使用 callback 函數對結果進行解析。 > @every 修飾器,表示 on_start 每天會執行一次,這樣就能抓到最新的電影了。 點擊綠色的 `run` 執行,你會看到 `follows` 上面有一個紅色的 1,切換到 `follows` 面板,點擊綠色的播放按鈕: ![document/2015-10-08/56161d3a27db4](https://box.kancloud.cn/document_2015-10-08_56161d3a27db4.png) # Tag 列表頁 在 `tag` 列表頁 中,我們需要提取出所有的 電影列表頁 的 URL。你可能已經發現了,sample handler 已經提取了非常多大的 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 > @config(age=10 * 24 * 60 * 60) 在這表示我們認為 10 天內頁面有效,不會再次進行更新抓取 由于 pyspider 是純 Python 環境,你可以使用 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 頁面: ![document/2015-10-08/56161d94aa70a](https://box.kancloud.cn/document_2015-10-08_56161d94aa70a.png) 開啟后,鼠標放在元素上,會被黃色高亮,點擊后,所有擁有相同 CSS選擇器 表達式的元素會被高亮。表達式會被插入到 python 代碼當前光標位置。創建下面的代碼,將光標停留在單引號中間: ~~~ 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) ~~~ > 翻頁是一個到自己的 callback 回調 # 電影詳情頁 再次點擊 `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()], } ~~~ 注意,你會發現 `css selector helper` 并不是總是能提取到合適的 CSS選擇器 表達式。你可以在 `Chrome Dev Tools` 的幫助下,寫一個合適的表達式: ![document/2015-10-08/56161df067ca4](https://box.kancloud.cn/document_2015-10-08_56161df067ca4.png) 右鍵點擊需要提取的元素,點擊審查元素。你并不需要像自動生成的表達式那樣寫出所有的祖先節點,只要寫出那些能區分你不需要的元素的關鍵節點的屬性就可以了。不過這需要抓取和網頁前端的經驗。所以,學習抓取的最好方法就是學會這個頁面/網站是怎么寫的。 你也可以在 `Chrome Dev Tools` 的 `Javascript Console` 中,使用 `$$(a[rel="v:directedBy"])` 測試 `CSS Selector`。 # 開始抓取 1. 使用 `run` 單步調試你的代碼,對于用一個 `callback` 最好使用多個頁面類型進行測試。然后保存。 2. 回到 `Dashboard`,找到你的項目 3. 將 `status` 修改為 `DEBUG` 或 `RUNNING` 4. 按 `run` 按鈕 ![document/2015-10-08/56161e0ed33c6](https://box.kancloud.cn/document_2015-10-08_56161e0ed33c6.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看