在這篇文章中,我們不會寫過于復(fù)雜的爬蟲腳本,但是,某些網(wǎng)頁的片段使用了AJAX技術(shù),或者需要URL之外更多的HTTP參數(shù),
AJAX是異步JavaScript和XML的縮寫。AJAX是使用現(xiàn)有的標(biāo)準(zhǔn)去更新網(wǎng)頁的一部分。AJAX的一個常見用法是加載JSON數(shù)據(jù)并在客戶端呈現(xiàn)為HTML。
您可能會現(xiàn)pyspider或wget提取的HTML中缺少元素。當(dāng)您在瀏覽器中打開它時,在頁面加載(可能不是)“加載”動畫或單詞之后會出現(xiàn)一些元素。例如,我們想從http://www.twitch.tv/directory/game/Dota 2中刪除Dota 2的所有頻道
但是你可能在頁面中找不到任何內(nèi)容。
由于AJAX數(shù)據(jù)是通過HTTP傳輸?shù)?,因此我們可以在Chrome開發(fā)者工具的幫助下找到真實(shí)的請求。
打開一個新標(biāo)簽。使用Ctrl+ Shift+ I(或Mac上的Cmd+ Opt+ I)打開DevTools。切換到“網(wǎng)絡(luò)”面板。在此選項(xiàng)卡中打開URL http://www.twitch.tv/directory/game/Dota 2。在加載資源時,您可以找到所請求資源的表。
AJAX使用XMLHttpRequest對象來發(fā)送和檢索通??s寫為“XHR”的數(shù)據(jù)。使用過濾器(漏斗圖標(biāo))過濾掉XHR請求。使用預(yù)覽瀏覽每個請求:
要確定哪一個是密鑰請求,您可以使用過濾器來減少請求數(shù),通過此路徑和參數(shù)猜測請求的使用情況,然后查看響應(yīng)內(nèi)容以進(jìn)行確認(rèn)。在這里我們找到了請求:http://api.twitch.tv/kraken/streams?limit = 20&offset = 0 &game = Dota +2 &roadcaster_language =&on_site = 1
現(xiàn)在,在新選項(xiàng)卡中打開URL,您將看到包含頻道列表的JSON數(shù)據(jù)。您可以使用擴(kuò)展JSONView(對于Firfox)來獲得JSON的漂亮打印視圖。示例代碼正在嘗試提取每個頻道的名稱,當(dāng)前標(biāo)題和查看者。
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']]
這是一個關(guān)于抽搐的在線演示以及使用PhantomJS的一項(xiàng)措施,將在下一級討論:http://demo.pyspider.org/debug/tutorial_twitch
HTTP是交換或傳輸超文本的協(xié)議。我們在上一篇文章中使用過它,我們使用self.crawl了一個URL來獲取由HTTP傳輸?shù)腍TML內(nèi)容。
當(dāng)您有403 Forbidden或需要登錄時。您需要HTTP請求的正確參數(shù)。
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ā)者工具 - 網(wǎng)絡(luò)面板獲取此信息:
在大多數(shù)情況下,您需要的最后一件事是從網(wǎng)絡(luò)面板復(fù)制正確的URL +方法+標(biāo)題+正文。
self.crawl支持cURL命令作為發(fā)出HTTP請求的參數(shù)。它將解析命令中的參數(shù)并將其用作fetch參數(shù)。
通過Copy as cURL請求,您可以獲得cURL命令并粘貼以self.crawl(command)輕松進(jìn)行爬網(wǎng)。
HTTP定義了指示要對所標(biāo)識的資源執(zhí)行的期望動作的方法。兩種常用的方法是:GET和POST。GET是當(dāng)您打開URL時,請求指定資源的內(nèi)容。POST用于向服務(wù)器提交數(shù)據(jù)。
TODO:需要這里的例子。
HTTP標(biāo)頭是請求的參數(shù)列表。在抓取時需要注意的一些標(biāo)題:
一個用戶代理字符串告訴服務(wù)器的應(yīng)用程序類型,操作系統(tǒng)或軟件版本誰發(fā)送HTTP請求。
pyspider的默認(rèn)用戶代理字符串是: pyspider/VERSION (+http://pyspider.org/)
Referer是上一個網(wǎng)頁的地址,從該網(wǎng)頁上跟隨了當(dāng)前請求頁面的鏈接。某些網(wǎng)站在圖像資源中使用此功能來防止深層鏈接。
TODO:需要這里的例子。
HTTP Cookie是HTTP標(biāo)頭中的一個字段,用于跟蹤哪個用戶發(fā)出請求。通常用于用戶登錄并防止未經(jīng)授權(quán)的請求。
您可以使用self.crawl(cookies={"key": value})像API這樣的dict來設(shè)置cookie。
TODO:需要這里的例子。
更多建議: