成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

pyspider 爬蟲教程(二):AJAX 和 HTTP

ingood / 2588人閱讀

摘要:在上一篇教程中,我們使用抓取豆瓣電影的內(nèi)容,并使用選擇器解析了一些內(nèi)容。挨個(gè)查看每個(gè)請(qǐng)求,通過(guò)訪問路徑和預(yù)覽,找到包含信息的請(qǐng)求在豆瓣這個(gè)例子中,請(qǐng)求并不多,可以挨個(gè)查看來(lái)確認(rèn)。腳本中還有一個(gè)使用渲染的提取版本,將會(huì)在下一篇教程中介紹。

在上一篇教程中,我們使用 self.crawl API 抓取豆瓣電影的 HTML 內(nèi)容,并使用 CSS 選擇器解析了一些內(nèi)容。不過(guò),現(xiàn)在的網(wǎng)站通過(guò)使用 AJAX 等技術(shù),在你與服務(wù)器交互的同時(shí),不用重新加載整個(gè)頁(yè)面。但是,這些交互手段,讓抓取變得稍微難了一些:你會(huì)發(fā)現(xiàn),這些網(wǎng)頁(yè)在抓回來(lái)后,和瀏覽器中的并不相同。你需要的信息并不在返回 HTML 代碼中。

在這一篇教程中,我們會(huì)討論這些技術(shù) 和 抓取他們的方法。(英文版:AJAX-and-more-HTTP)

AJAX

AJAX 是 Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)的縮寫。AJAX 通過(guò)使用原有的 web 標(biāo)準(zhǔn)組件,實(shí)現(xiàn)了在不重新加載整個(gè)頁(yè)面的情況下,與服務(wù)器進(jìn)行數(shù)據(jù)交互。例如在新浪微博中,你可以展開一條微博的評(píng)論,而不需要重新加載,或者打開一個(gè)新的頁(yè)面。但是這些內(nèi)容并不是一開始就在頁(yè)面中的(這樣頁(yè)面就太大了),而是在你點(diǎn)擊的時(shí)候被加載進(jìn)來(lái)的。這就導(dǎo)致了你抓取這個(gè)頁(yè)面的時(shí)候,并不能獲得這些評(píng)論信息(因?yàn)槟銢]有『展開』)。

AJAX 的一種常見用法是使用 AJAX 加載 JSON 數(shù)據(jù),然后在瀏覽器端渲染。如果能直接抓取到 JSON 數(shù)據(jù),會(huì)比 HTML 更容易解析。

當(dāng)一個(gè)網(wǎng)站使用了 AJAX 的時(shí)候,除了用 pyspider 抓取到的頁(yè)面和瀏覽器看到的不同以外。你在瀏覽器中打開這樣的頁(yè)面,或者點(diǎn)擊『展開』的時(shí)候,常常會(huì)看到『加載中』或者類似的圖標(biāo)/動(dòng)畫。例如,當(dāng)你嘗試抓?。篽ttp://movie.douban.com/explore

你會(huì)發(fā)現(xiàn)電影是『載入中...』

找到真實(shí)的請(qǐng)求

由于 AJAX 實(shí)際上也是通過(guò) HTTP 傳輸數(shù)據(jù)的,所以我們可以通過(guò) Chrome Developer Tools 找到真實(shí)的請(qǐng)求,直接發(fā)起真實(shí)請(qǐng)求的抓取就可以獲得數(shù)據(jù)了。

打開一個(gè)新窗口

Ctrl+Shift+I (在 Mac 上請(qǐng)按 Cmd+Opt+I) 打開開發(fā)者工具。

切換到網(wǎng)絡(luò)( Netwotk 面板)

在窗口中打開 http://movie.douban.com/explore

在頁(yè)面加載的過(guò)程中,你會(huì)在面板中看到所有的資源請(qǐng)求。

AJAX 一般是通過(guò) XMLHttpRequest 對(duì)象接口發(fā)送請(qǐng)求的,XMLHttpRequest 一般被縮寫為 XHR。點(diǎn)擊網(wǎng)絡(luò)面板上漏斗形的過(guò)濾按鈕,過(guò)濾出 XHR 請(qǐng)求。挨個(gè)查看每個(gè)請(qǐng)求,通過(guò)訪問路徑和預(yù)覽,找到包含信息的請(qǐng)求:http://movie.douban.com/j/searchX61Xsubjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

在豆瓣這個(gè)例子中,XHR 請(qǐng)求并不多,可以挨個(gè)查看來(lái)確認(rèn)。但在 XHR 請(qǐng)求較多的時(shí)候,可能需要結(jié)合觸發(fā)動(dòng)作的時(shí)間,請(qǐng)求的路徑等信息幫助在大量的請(qǐng)求中找到包含信息的關(guān)鍵請(qǐng)求。這需要抓取或者前端的相關(guān)經(jīng)驗(yàn)。所以,有一個(gè)我一直在提的觀點(diǎn),學(xué)習(xí)抓取的最好方法是:學(xué)會(huì)寫網(wǎng)站。

現(xiàn)在可以在新窗口中打開 http://movie.douban.com/j/searchX67Xsubjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0,你會(huì)看到包含電影數(shù)據(jù)的 JSON 原始數(shù)據(jù)。推薦安裝 JSONView(Firfox版)插件,這樣可以看到更好看的 JSON 格式,展開折疊列等功能。然后,我們根據(jù) JSON 數(shù)據(jù),編寫一個(gè)提取電影名和評(píng)分的腳本:

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 將結(jié)果轉(zhuǎn)為一個(gè) python 的 dict 對(duì)象

你可以在 http://demo.pyspider.org/debug/tutorial_douban_explore 獲得完整的代碼,并進(jìn)行調(diào)試。腳本中還有一個(gè)使用 PhantomJS 渲染的提取版本,將會(huì)在下一篇教程中介紹。

HTTP

HTTP 是用來(lái)傳輸網(wǎng)頁(yè)內(nèi)容的協(xié)議。在前面的教程中,我們已經(jīng)通過(guò) self.crawl 接口提交了 URL 進(jìn)行了抓取。這些抓取就是通過(guò) HTTP 協(xié)議傳輸?shù)摹?/p>

在抓取過(guò)程中,你可能會(huì)遇到類似 403 Forbidden,或者需要登錄的情況,這時(shí)候你就需要正確的 HTTP 參數(shù)進(jìn)行抓取了。

一個(gè)典型的 HTTP 請(qǐng)求包如下,這個(gè)請(qǐng)求是發(fā)往 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
  

請(qǐng)求的第一行包含 method, path 和 HTTP 協(xié)議的版本信息

余下的行被稱為 header,是以 key: value 的形式呈現(xiàn)的

如果是 POST 請(qǐng)求,在請(qǐng)求結(jié)尾可能還會(huì)有 body 內(nèi)容

你可以通過(guò)前面用過(guò)的 Chrome Developer Tools 工具查看到這些信息:

在大多數(shù)時(shí)候,使用正確的 method, path, headersbody 總是能抓取到你需要的信息的。

HTTP Method

HTTP Method 告訴服務(wù)器對(duì) URL 資源期望進(jìn)行的操作。例如在打開一個(gè) URL 的時(shí)候使用的是 GET 方式,而在提交數(shù)據(jù)的時(shí)候一般使用 POST。

TODO: need example here

HTTP Headers

HTTP Headers 是請(qǐng)求所帶的一個(gè)參數(shù)列表,你可以在 這里 找到完整的常用 Headers 列表。一些常用的需要注意的有:

User-Agent

UA 是標(biāo)識(shí)你使用的瀏覽器,或抓取程序的一段字符串。pyspider 使用的默認(rèn) UA 是 pyspider/VERSION (+http://pyspider.org/)。網(wǎng)站常用這個(gè)字符串來(lái)區(qū)分用戶的操作系統(tǒng)和瀏覽器,以及判斷對(duì)方是否是爬蟲。所以在抓取的時(shí)候,常常會(huì)對(duì) UA 進(jìn)行偽裝。

在 pyspider 中,你可以通過(guò) self.crawl(URL, headers={"User-Agent": "pyspider"}),或者是 crawl_config = {"headers": {"User-Agent": "xxxx"}} 來(lái)指定腳本級(jí)別的 UA。詳細(xì)請(qǐng)查看 API 文檔。

Referer

Referer 用于告訴服務(wù)器,你訪問的上一個(gè)網(wǎng)頁(yè)是什么。常常被用于防盜鏈,在抓取圖片的時(shí)候可能會(huì)用到。

X-Requested-With

當(dāng)使用 XHR 發(fā)送 AJAX 請(qǐng)求時(shí)會(huì)帶上的 Header,常被用于判斷是不是 AJAX 請(qǐng)求。例如在 北郵人論壇 中,你需要:

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"} 才能抓取到內(nèi)容。

HTTP Cookie

雖然 Cookie 只是 HTTP Header 中的一個(gè),但是因?yàn)榉浅V匾?,但是拿出?lái)說(shuō)一下。Cookie 被 HTTP 請(qǐng)求用來(lái)區(qū)分、追蹤用戶的身份,當(dāng)你在一個(gè)網(wǎng)站登錄的時(shí)候,就是通過(guò)寫入 Cookie 字段來(lái)記錄登錄狀態(tài)的。

當(dāng)遇到需要登錄的網(wǎng)站,你需要通過(guò)設(shè)置 Cookie 參數(shù),來(lái)請(qǐng)求需要登錄的內(nèi)容。Cookie 可以通過(guò)開發(fā)者工具的請(qǐng)求面板,或者是資源面板中獲得。在 pyspider 中,你也可以使用 response.cookies 獲得返回的 cookie,并使用 self.crawl(URL, cookie={"key": "value"}) 來(lái)設(shè)置請(qǐng)求的 Cookie 參數(shù)。


原文:http://blog.binux.me/2015/01/pyspider-tutorial-level-2-ajax-and-more-http/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37476.html

相關(guān)文章

  • pyspider 爬蟲教程(三):使用 PhantomJS 渲染帶 JS 的頁(yè)面

    摘要:英文原文在上兩篇教程中,我們學(xué)習(xí)了怎么從中提取信息,也學(xué)習(xí)了怎么處理一些請(qǐng)求復(fù)雜的頁(yè)面。在使用之前,你需要安裝它安裝文檔。當(dāng)你安裝了之后,在運(yùn)行模式的時(shí)就會(huì)自動(dòng)啟用了。使用當(dāng)連上代理后,你就能通過(guò)在中添加的參數(shù),開啟使用抓取。 英文原文:http://docs.pyspider.org/en/latest/tutorial/Render-with-PhantomJS/ 在上兩篇教程中...

    zhongmeizhi 評(píng)論0 收藏0
  • 零基礎(chǔ)如何學(xué)爬蟲技術(shù)

    摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來(lái)源于某博主:htt...

    KunMinX 評(píng)論0 收藏0
  • pyspider 爬蟲教程(一):HTML CSS 選擇器

    摘要:但是感覺還是需要一篇的教程,不然沒有一個(gè)總體的認(rèn)識(shí)。修飾器,表示每天會(huì)執(zhí)行一次,這樣就能抓到最新的電影了。不過(guò)更推薦使用選擇器。既然前端程序員都使用選擇器為頁(yè)面上的不同元素設(shè)置樣式,我們也可以通過(guò)它定位需要的元素。 雖然以前寫過(guò) 如何抓取WEB頁(yè)面 和 如何從 WEB 頁(yè)面中提取信息。但是感覺還是需要一篇 step by step 的教程,不然沒有一個(gè)總體的認(rèn)識(shí)。不過(guò),沒想到這個(gè)教程居...

    ShevaKuilin 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---10、爬蟲框架的安裝:PySpider、Scrapy

    摘要:所以如果對(duì)爬蟲有一定基礎(chǔ),上手框架是一種好的選擇。缺少包,使用安裝即可缺少包,使用安裝即可上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)爬取相關(guān)庫(kù)的安裝的安裝下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)爬蟲框架的安裝 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---9、APP爬取相關(guān)庫(kù)的安裝:Appium的安裝下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---11、爬蟲框架的安裝:ScrapySplash、ScrapyRedis 我們直接...

    張憲坤 評(píng)論0 收藏0
  • 學(xué)會(huì)了這項(xiàng)技能,你就能獲得任何想要的信息!

    摘要:環(huán)境準(zhǔn)備任務(wù)時(shí)間前置環(huán)境部署在開始部署前,我們需要做一些前置準(zhǔn)備。此時(shí)輸入并回車,應(yīng)該可以看到類似下面這樣的輸出,說(shuō)明一切正常。完成后,可以通過(guò)快捷鍵或命令行鍵入來(lái)退出,進(jìn)入下一步。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 本文由騰訊云實(shí)驗(yàn)室發(fā)表于云+社區(qū)專欄 騰訊云提供了開發(fā)者實(shí)驗(yàn)室教你搭建 PySpider 爬蟲服務(wù),教程內(nèi)容如下,用戶可以點(diǎn)擊開發(fā)者實(shí)驗(yàn)室快速...

    chenatu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<