在這篇文章中,我們不會寫過于復雜的爬蟲腳本,但是,某些網頁的片段使用了AJAX技術,或者需要URL之外更多的HTTP參數,
AJAX是異步JavaScript和XML的縮寫。AJAX是使用現有的標準去更新網頁的一部分。AJAX的一個常見用法是加載JSON數據并在客戶端呈現為HTML。
您可能會現pyspider或wget提取的HTML中缺少元素。當您在瀏覽器中打開它時,在頁面加載(可能不是)“加載”動畫或單詞之后會出現一些元素。例如,我們想從http://www.twitch.tv/directory/game/Dota 2中刪除Dota 2的所有頻道
但是你可能在頁面中找不到任何內容。
由于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']]
這是一個關于抽搐的在線演示以及使用PhantomJS的一項措施,將在下一級討論:http://demo.pyspider.org/debug/tutorial_twitch
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
您可以使用我們在上一節(jié)中使用的Chrome開發(fā)者工具 - 網絡面板獲取此信息:
在大多數情況下,您需要的最后一件事是從網絡面板復制正確的URL +方法+標題+正文。
self.crawl支持cURL命令作為發(fā)出HTTP請求的參數。它將解析命令中的參數并將其用作fetch參數。
通過Copy as cURL請求,您可以獲得cURL命令并粘貼以self.crawl(command)輕松進行爬網。
HTTP定義了指示要對所標識的資源執(zhí)行的期望動作的方法。兩種常用的方法是:GET和POST。GET是當您打開URL時,請求指定資源的內容。POST用于向服務器提交數據。
TODO:需要這里的例子。
HTTP標頭是請求的參數列表。在抓取時需要注意的一些標題:
一個用戶代理字符串告訴服務器的應用程序類型,操作系統(tǒng)或軟件版本誰發(fā)送HTTP請求。
pyspider的默認用戶代理字符串是: pyspider/VERSION (+http://pyspider.org/)
Referer是上一個網頁的地址,從該網頁上跟隨了當前請求頁面的鏈接。某些網站在圖像資源中使用此功能來防止深層鏈接。
TODO:需要這里的例子。
HTTP Cookie是HTTP標頭中的一個字段,用于跟蹤哪個用戶發(fā)出請求。通常用于用戶登錄并防止未經授權的請求。
您可以使用self.crawl(cookies={"key": value})像API這樣的dict來設置cookie。
TODO:需要這里的例子。
更多建議: