pyspider AJAX和HTTP

2023-02-16 17:49 更新
在上一章節(jié),我們討論了怎么去解析連接和信息從HTML文檔中。可是,網站內容越來越復雜通過使用某些技術,比如說:AJAX。你可能發(fā)現網頁看起來不一樣,當它在瀏覽器的時候。你想要的信息沒有在HTML網頁當中。

在這篇文章中,我們不會寫過于復雜的爬蟲腳本,但是,某些網頁的片段使用了AJAX技術,或者需要URL之外更多的HTTP參數,

AJAX

AJAX是異步JavaScript和XML的縮寫。AJAX是使用現有的標準去更新網頁的一部分。AJAX的一個常見用法是加載JSON數據并在客戶端呈現為HTML。

您可能會現pyspider或wget提取的HTML中缺少元素。當您在瀏覽器中打開它時,在頁面加載(可能不是)“加載”動畫或單詞之后會出現一些元素。例如,我們想從http://www.twitch.tv/directory/game/Dota 2中刪除Dota 2的所有頻道  ./twitch.png  但是你可能在頁面中找不到任何內容。

查找請求

由于AJAX數據是通過HTTP傳輸的,因此我們可以在Chrome開發(fā)者工具的幫助下找到真實的請求。

打開一個新標簽。使用Ctrl+ Shift+ I(或Mac上的Cmd+ Opt+ I)打開DevTools。切換到“網絡”面板。在此選項卡中打開URL http://www.twitch.tv/directory/game/Dota 2。在加載資源時,您可以找到所請求資源的表。 

AJAX使用XMLHttpRequest對象來發(fā)送和檢索通??s寫為“XHR”的數據。使用過濾器(漏斗圖標)過濾掉XHR請求。使用預覽瀏覽每個請求:

要確定哪一個是密鑰請求,您可以使用過濾器來減少請求數,通過此路徑和參數猜測請求的使用情況,然后查看響應內容以進行確認。在這里我們找到了請求:http://api.twitch.tv/kraken/streams?limit = 20&offset = 0 &game = Dota +2 &roadcaster_language =&on_site = 1

現在,在新選項卡中打開URL,您將看到包含頻道列表的JSON數據。您可以使用擴展JSONView(對于Firfox)來獲得JSON的漂亮打印視圖。示例代碼正在嘗試提取每個頻道的名稱,當前標題和查看者。

class Handler(BaseHandler):
    @every(minutes=10)
    def on_start(self):
        self.crawl('http://api.twitch.tv/kraken/streams?limit=20&offset=0&game=Dota+2&broadcaster_language=&on_site=1', callback=self.index_page)

    @config(age=10*60)
    def index_page(self, response):
        return [{
                "name": x['channel']['display_name'],
                "viewers": x['viewers'],
                "status": x['channel'].get('status'),
             } for x in response.json['streams']]
  • 您可以使用response.json將內容轉換為python dict對象。
  • 由于頻道列表經常變化,我們每10分鐘更新一次并用于@config(age=10*60)設置年齡。否則,它將被忽略,因為調度程序認為它足夠新并且拒絕更新內容。

這是一個關于抽搐的在線演示以及使用PhantomJS的一項措施,將在下一級討論:http://demo.pyspider.org/debug/tutorial_twitch

HTTP

HTTP是交換或傳輸超文本的協議。我們在上一篇文章中使用過它,我們使用self.crawl了一個URL來獲取由HTTP傳輸的HTML內容。

當您有403 Forbidden或需要登錄時。您需要HTTP請求的正確參數。

http://example.com/的典型HTTP請求消息如下所示:

    GET / 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
  • 第一行包含HTTP方法,路徑和HTTP版本
  • key: value格式的幾行請求標題字段。
  • 如果有消息體(比如POST請求),則空行和消息體將附加到請求消息的末尾。

您可以使用我們在上一節(jié)中使用的Chrome開發(fā)者工具 - 網絡面板獲取此信息:

 在大多數情況下,您需要的最后一件事是從網絡面板復制正確的URL +方法+標題+正文。

cURL命令

self.crawl支持cURL命令作為發(fā)出HTTP請求的參數。它將解析命令中的參數并將其用作fetch參數。

通過Copy as cURL請求,您可以獲得cURL命令并粘貼以self.crawl(command)輕松進行爬網。

HTTP方法

HTTP定義了指示要對所標識的資源執(zhí)行的期望動作的方法。兩種常用的方法是:GET和POST。GET是當您打開URL時,請求指定資源的內容。POST用于向服務器提交數據。

TODO:需要這里的例子。

HTTP標頭

HTTP標頭是請求的參數列表。在抓取時需要注意的一些標題:

用戶代理

一個用戶代理字符串告訴服務器的應用程序類型,操作系統(tǒng)或軟件版本誰發(fā)送HTTP請求。

pyspider的默認用戶代理字符串是: pyspider/VERSION (+http://pyspider.org/)

引薦

Referer是上一個網頁的地址,從該網頁上跟隨了當前請求頁面的鏈接。某些網站在圖像資源中使用此功能來防止深層鏈接。

TODO:需要這里的例子。

HTTP Cookie

HTTP Cookie是HTTP標頭中的一個字段,用于跟蹤哪個用戶發(fā)出請求。通常用于用戶登錄并防止未經授權的請求。

您可以使用self.crawl(cookies={"key": value})像API這樣的dict來設置cookie。

TODO:需要這里的例子。



以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號