Scrapy爬蟲框架教程(四)-- 抓取AJAX非同步載入網頁
個人博客地址:woodenrobot.me
Scrapy爬蟲框架教程(一)-- Scrapy入門
Scrapy爬蟲框架教程(二)-- 爬取豆瓣電影TOP250Scrapy爬蟲框架教程(三)-- 調試(Debugging)Spiders
前言
前一段時間工作太忙一直沒有時間繼續更新這個教程,最近離職了趁著這段時間充裕趕緊多寫點東西。之前我們已經簡單了解了對普通網頁的抓取,今天我就給大家講一講怎麼去抓取採用Ajax非同步加的網站。
工具和環境
- 語言:python 2.7
- IDE: Pycharm
- 瀏覽器:Chrome
- 爬蟲框架:Scrapy 1.3.3
什麼是AJAX?
AJAX即「Asynchronous Javascript And XML」(非同步JavaScript和XML),是指一種創建互動式網頁應用的網頁開發技術。
AJAX = 非同步 JavaScript和XML(標準通用標記語言的子集)。
AJAX 是一種用於創建快速動態網頁的技術。
通過在後台與伺服器進行少量數據交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。
兩個Chrome插件
Toggle JavaScript
這個插件可以幫助我們快速直觀地檢測網頁里哪些信息是通過AJAX非同步載入而來的,具體怎麼用,下面會詳細講解。
chrome商店下載地址:https://chrome.google.com/webstore/detail/toggle-javascript/cidlcjdalomndpeagkjpnefhljffbnlo?utm_source=chrome-app-launcher-info-dialog(Ps:打不的小夥伴自行百度搜索國內提供chrome插件下載的網站離線安裝)JSON-handle
這個插件可以幫我們格式化Json串,從而讓我們以一個更友好的方式查看Json內的信息。 chrome商店下載地址:https://chrome.google.com/webstore/detail/json-handle/iahnhfdhidomcpggpaimmmahffihkfnj(Ps:打不的小夥伴自行百度搜索國內提供chrome插件下載的網站離線安裝)
分析過程
分析頁面是否採用AJAX
上次我們拿了豆瓣當做例子,剛好我發現了豆瓣有AJAX非同步載入的頁面,這次我們就不換了,還拿豆瓣做例子。(逃
首先我們打開豆瓣電影分類排行榜 - 動作片欄目。打開過後你有沒有發現什麼不一樣的地方呢?如果你的網速慢你會發現下面的電影信息是在網頁別的部分出現後才慢慢出現的,試著把界面往下滑會不斷有新的電影信息更新出來。遇到這種情況初步就可以認定這個頁面是採用AJAX非同步載入的,你也可以通過右鍵查看網頁源碼來鑒別。比如說你右鍵查看源碼ctrl+f搜索這個殺手不太冷這幾個字,你會發現源碼里沒有。上面的方法雖然能用,但是總感覺有點笨。還記得上面推薦的那個chrome插件Toggle JavaScript嗎?
安好這個插件它就會出現在chrome瀏覽器的右邊,試著輕輕點一下。
我的天吶!這麼神奇嗎?!剛才的電影信息都不見了!還記得AJAX的介紹嗎?AJAX = 非同步 JavaScript和XML。當我們點擊了插件就代表這個我們封禁了JavaScript,這個頁面里的JavaScript代碼無法執行,那麼通過AJAX非同步載入而來的信息當然就無法出現了。通過這種方法我們能快速精確地知道哪些信息是非同步載入而來的。
如何抓取AJAX非同步載入頁面
對於這種網頁我們一般會採用兩種方法:
- 通過抓包找到AJAX非同步載入的請求地址;
- 通過使用PhantomJS等無頭瀏覽器執行JS代碼後再對網頁進行抓取。
通常情況下我會採用第一種方法,因為使用無頭瀏覽器會大大降低抓取效率,而且第一種方法得到的數據格式往往以Json為主,非常乾淨。在這裡我只講解第一種方法,第二種方法作為爬蟲的終極武器我會在後續的教程中進行講解。
回到我們需要抓取的頁面,還記得我說過頁面的一個細節嗎,下拉更新。進入頁面後我們按F12打開chrome瀏覽器的開發者工具選擇Network,然後實現一次下拉更新。你會在Network里發現一個Response為Json格式的請求,仔細看看Json里的內容你會明白這些都是網頁上顯示的電影信息。右鍵該請求地址選擇Open Link in New Tab,如果你裝了JSON-handle插件你會以下面這種更友好的方式查看這個Json串。
接著再讓我們看一該請求的Header信息。
首先我們可以看出這是一個get請求,多看幾個下拉請求的地址後你會發現地中的start=xxx在不斷變化,每次增加20。所以我們只用更改這個參數就可以實現翻頁不斷獲取新數據(Ps:修改其他的參數也會有不同的效果,這裡就不一一細說了,留給大家慢慢地探索)。 spider代碼如下:
# -*- coding: utf-8 -*-n# @Time : 2017/4/9 14:32n# @Author : woodenrobotnnnimport renimport jsonnnnfrom scrapy import Requestnfrom scrapy.spiders import Spidernfrom scrapyspider.items import DoubanMovieItemnnnclass DoubanAJAXSpider(Spider):n name = douban_ajaxn headers = {n User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36,n }nn def start_requests(self):n url = https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20n yield Request(url, headers=self.headers)nn def parse(self, response):n datas = json.loads(response.body)n item = DoubanMovieItem()n if datas:n for data in datas:n item[ranking] = data[rank]n item[movie_name] = data[title]n item[score] = data[score]n item[score_num] = data[vote_count]n yield itemnn # 如果datas存在數據則對下一頁進行採集n page_num = re.search(rstart=(d+), response.url).group(1)n page_num = start= + str(int(page_num)+20)n next_url = re.sub(rstart=d+, page_num, response.url)n yield Request(next_url, headers=self.headers)n
在Scrapy工程文件的spiders里寫好爬蟲文件後在settings.py所在的目錄下打開終端運行以下代碼就能輸出相應的電影數據。
scrapy crawl douban_ajax -o douban_movie.csvn
代碼Github地址: https://github.com/Wooden-Robot/scrapy-tutorial/blob/master/scrapyspider/scrapyspider/spiders/douban_ajax_spider.py
結尾
整片文章主要以介紹思路為主,抓取的站點也只是做示範內容並不重要。授之以魚不如授之以漁,希望大家可以從這篇教程里學到解決問題的方法與思路。: )
推薦閱讀: