摘要:在上一篇教程中,我們使用抓取豆瓣電影的內容,并使用選擇器解析了一些內容。挨個查看每個請求,通過訪問路徑和預覽,找到包含信息的請求在豆瓣這個例子中,請求并不多,可以挨個查看來確認。腳本中還有一個使用渲染的提取版本,將會在下一篇教程中介紹。
在上一篇教程中,我們使用 self.crawl API 抓取豆瓣電影的 HTML 內容,并使用 CSS 選擇器解析了一些內容。不過,現在的網站通過使用 AJAX 等技術,在你與服務器交互的同時,不用重新加載整個頁面。但是,這些交互手段,讓抓取變得稍微難了一些:你會發現,這些網頁在抓回來后,和瀏覽器中的并不相同。你需要的信息并不在返回 HTML 代碼中。
在這一篇教程中,我們會討論這些技術 和 抓取他們的方法。(英文版:AJAX-and-more-HTTP)
AJAXAJAX 是 Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)的縮寫。AJAX 通過使用原有的 web 標準組件,實現了在不重新加載整個頁面的情況下,與服務器進行數據交互。例如在新浪微博中,你可以展開一條微博的評論,而不需要重新加載,或者打開一個新的頁面。但是這些內容并不是一開始就在頁面中的(這樣頁面就太大了),而是在你點擊的時候被加載進來的。這就導致了你抓取這個頁面的時候,并不能獲得這些評論信息(因為你沒有『展開』)。
AJAX 的一種常見用法是使用 AJAX 加載 JSON 數據,然后在瀏覽器端渲染。如果能直接抓取到 JSON 數據,會比 HTML 更容易解析。
當一個網站使用了 AJAX 的時候,除了用 pyspider 抓取到的頁面和瀏覽器看到的不同以外。你在瀏覽器中打開這樣的頁面,或者點擊『展開』的時候,常常會看到『加載中』或者類似的圖標/動畫。例如,當你嘗試抓取:http://movie.douban.com/explore
你會發現電影是『載入中...』
找到真實的請求由于 AJAX 實際上也是通過 HTTP 傳輸數據的,所以我們可以通過 Chrome Developer Tools 找到真實的請求,直接發起真實請求的抓取就可以獲得數據了。
打開一個新窗口
按 Ctrl+Shift+I (在 Mac 上請按 Cmd+Opt+I) 打開開發者工具。
切換到網絡( Netwotk 面板)
在窗口中打開 http://movie.douban.com/explore
在頁面加載的過程中,你會在面板中看到所有的資源請求。
AJAX 一般是通過 XMLHttpRequest 對象接口發送請求的,XMLHttpRequest 一般被縮寫為 XHR。點擊網絡面板上漏斗形的過濾按鈕,過濾出 XHR 請求。挨個查看每個請求,通過訪問路徑和預覽,找到包含信息的請求:http://movie.douban.com/j/searchX61Xsubjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
在豆瓣這個例子中,XHR 請求并不多,可以挨個查看來確認。但在 XHR 請求較多的時候,可能需要結合觸發動作的時間,請求的路徑等信息幫助在大量的請求中找到包含信息的關鍵請求。這需要抓取或者前端的相關經驗。所以,有一個我一直在提的觀點,學習抓取的最好方法是:學會寫網站。
現在可以在新窗口中打開 http://movie.douban.com/j/searchX67Xsubjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0,你會看到包含電影數據的 JSON 原始數據。推薦安裝 JSONView(Firfox版)插件,這樣可以看到更好看的 JSON 格式,展開折疊列等功能。然后,我們根據 JSON 數據,編寫一個提取電影名和評分的腳本:
pythonclass Handler(BaseHandler): def on_start(self): self.crawl("http://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0", callback=self.json_parser) def json_parser(self, response): return [{ "title": x["title"], "rate": x["rate"], "url": x["url"] } for x in response.json["subjects"]]
你可以使用 response.json 將結果轉為一個 python 的 dict 對象
你可以在 http://demo.pyspider.org/debug/tutorial_douban_explore 獲得完整的代碼,并進行調試。腳本中還有一個使用 PhantomJS 渲染的提取版本,將會在下一篇教程中介紹。
HTTPHTTP 是用來傳輸網頁內容的協議。在前面的教程中,我們已經通過 self.crawl 接口提交了 URL 進行了抓取。這些抓取就是通過 HTTP 協議傳輸的。
在抓取過程中,你可能會遇到類似 403 Forbidden,或者需要登錄的情況,這時候你就需要正確的 HTTP 參數進行抓取了。
一個典型的 HTTP 請求包如下,這個請求是發往 http://example.com/ 的:
httpGET / HTTP/1.1 Host: example.com Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.45 Safari/537.36 Referer: http://en.wikipedia.org/wiki/Example.com Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 If-None-Match: "359670651" If-Modified-Since: Fri, 09 Aug 2013 23:54:35 GMT
請求的第一行包含 method, path 和 HTTP 協議的版本信息
余下的行被稱為 header,是以 key: value 的形式呈現的
如果是 POST 請求,在請求結尾可能還會有 body 內容
你可以通過前面用過的 Chrome Developer Tools 工具查看到這些信息:
在大多數時候,使用正確的 method, path, headers 和 body 總是能抓取到你需要的信息的。
HTTP MethodHTTP Method 告訴服務器對 URL 資源期望進行的操作。例如在打開一個 URL 的時候使用的是 GET 方式,而在提交數據的時候一般使用 POST。
TODO: need example here
HTTP HeadersHTTP Headers 是請求所帶的一個參數列表,你可以在 這里 找到完整的常用 Headers 列表。一些常用的需要注意的有:
User-AgentUA 是標識你使用的瀏覽器,或抓取程序的一段字符串。pyspider 使用的默認 UA 是 pyspider/VERSION (+http://pyspider.org/)。網站常用這個字符串來區分用戶的操作系統和瀏覽器,以及判斷對方是否是爬蟲。所以在抓取的時候,常常會對 UA 進行偽裝。
在 pyspider 中,你可以通過 self.crawl(URL, headers={"User-Agent": "pyspider"}),或者是 crawl_config = {"headers": {"User-Agent": "xxxx"}} 來指定腳本級別的 UA。詳細請查看 API 文檔。
RefererReferer 用于告訴服務器,你訪問的上一個網頁是什么。常常被用于防盜鏈,在抓取圖片的時候可能會用到。
X-Requested-With當使用 XHR 發送 AJAX 請求時會帶上的 Header,常被用于判斷是不是 AJAX 請求。例如在 北郵人論壇 中,你需要:
python def on_start(self): self.crawl("http://bbs.byr.cn/board/Python", headers={"X-Requested-With": "XMLHttpRequest"}, callback=self.index_page)
帶有 headers={"X-Requested-With": "XMLHttpRequest"} 才能抓取到內容。
HTTP Cookie雖然 Cookie 只是 HTTP Header 中的一個,但是因為非常重要,但是拿出來說一下。Cookie 被 HTTP 請求用來區分、追蹤用戶的身份,當你在一個網站登錄的時候,就是通過寫入 Cookie 字段來記錄登錄狀態的。
當遇到需要登錄的網站,你需要通過設置 Cookie 參數,來請求需要登錄的內容。Cookie 可以通過開發者工具的請求面板,或者是資源面板中獲得。在 pyspider 中,你也可以使用 response.cookies 獲得返回的 cookie,并使用 self.crawl(URL, cookie={"key": "value"}) 來設置請求的 Cookie 參數。
原文:http://blog.binux.me/2015/01/pyspider-tutorial-level-2-ajax-and-more-http/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37476.html
摘要:英文原文在上兩篇教程中,我們學習了怎么從中提取信息,也學習了怎么處理一些請求復雜的頁面。在使用之前,你需要安裝它安裝文檔。當你安裝了之后,在運行模式的時就會自動啟用了。使用當連上代理后,你就能通過在中添加的參數,開啟使用抓取。 英文原文:http://docs.pyspider.org/en/latest/tutorial/Render-with-PhantomJS/ 在上兩篇教程中...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:但是感覺還是需要一篇的教程,不然沒有一個總體的認識。修飾器,表示每天會執行一次,這樣就能抓到最新的電影了。不過更推薦使用選擇器。既然前端程序員都使用選擇器為頁面上的不同元素設置樣式,我們也可以通過它定位需要的元素。 雖然以前寫過 如何抓取WEB頁面 和 如何從 WEB 頁面中提取信息。但是感覺還是需要一篇 step by step 的教程,不然沒有一個總體的認識。不過,沒想到這個教程居...
摘要:所以如果對爬蟲有一定基礎,上手框架是一種好的選擇。缺少包,使用安裝即可缺少包,使用安裝即可上一篇文章網絡爬蟲實戰爬取相關庫的安裝的安裝下一篇文章網絡爬蟲實戰爬蟲框架的安裝 上一篇文章:Python3網絡爬蟲實戰---9、APP爬取相關庫的安裝:Appium的安裝下一篇文章:Python3網絡爬蟲實戰---11、爬蟲框架的安裝:ScrapySplash、ScrapyRedis 我們直接...
摘要:環境準備任務時間前置環境部署在開始部署前,我們需要做一些前置準備。此時輸入并回車,應該可以看到類似下面這樣的輸出,說明一切正常。完成后,可以通過快捷鍵或命令行鍵入來退出,進入下一步。 歡迎大家前往騰訊云+社區,獲取更多騰訊海量技術實踐干貨哦~ 本文由騰訊云實驗室發表于云+社區專欄 騰訊云提供了開發者實驗室教你搭建 PySpider 爬蟲服務,教程內容如下,用戶可以點擊開發者實驗室快速...
閱讀 3087·2021-11-24 09:38
閱讀 1338·2021-09-22 15:27
閱讀 2977·2021-09-10 10:51
閱讀 1512·2021-09-09 09:33
閱讀 925·2021-08-09 13:47
閱讀 2092·2019-08-30 13:05
閱讀 898·2019-08-29 15:15
閱讀 2431·2019-08-29 12:21