以新版簡書網站為例,新網站很多地方采用了ajax(異步JavaScript和XML),大大提高了頁面加載的速度。
對于一些數據抓取來說,就增加了復雜度,ajax數據從源代碼里找不到。如下圖,一篇文章頁面中的評論信息和哪些專題進行了收錄,都在源代碼中看不到。
一、抓包分析
使用抓包工具Fiddler 或 Chrome "檢查"進行分析。文中使用的是Chrome 工具。Chrome -- "檢查" -- 切換到 “Network”,這時候刷新一下網頁。找到發送 收錄專題的請求(request)。
注意:一個頁面通常會有幾十個請求(這個頁面有89個),包括網頁文檔(document), 腳本(script),圖片(jpeg),還有一種類型叫 xhl 就是 XMLHttpRequest, 我們要找的異步請求類型。比較一下名字,找到我們所要的請求。
點擊它,就看到完整的URL了。
http://www.lxweimin.com/notes/8777855/included_collections?page=1
注意,這個URL放到地址欄訪問發現并不沒有返回我們所要的數據,而是一個404頁面。但看一下返回的Response,就是我們所需要的JSON數據。
怎么辦?把url改成.json
結尾,就可以在地址欄訪問看到數據了。
http://www.lxweimin.com/notes/8777855/included_collections.json
這里就完成了第一步,最關鍵的問題是如何獲取url里的這個id 8777855
,如果我們能找到這個id,就可以構造一個url獲得json數據。
二、構造目標地址
方法:查看網頁源代碼。剛剛不是說了,源代碼里沒有我們所需要的數據嗎?查什么呢,搜這個數字id 8777855
,看一下,果然有,它在一些<meta>
標簽里,作為 content
值的一部分。
那就好辦了。解析meta
標簽,拿到id。
def parse(self,response):
selector = Selector(response)
infos = selector.xpath("http://meta/@content").extract()
id = ''
for info in infos:
if (str(info).find('jianshu://notes/')) ==0 :
id = filter(str.isdigit,str(info))
break;
collection_url ='http://www.lxweimin.com/notes/%s/included_collections.json'%id
yield Request(collection_url,callback=self.parse_json)
OK, 這樣就構造好了一個目標url。
三、解析json數據
這一步就比較簡單,引入json包,進行解析。當然做這步時,需要先發送一個請求。
def parse_json(self,response):
data = json.loads(response.body)
collect = data['collections']
cols=''
if len(collect) >0 :
for cc in collect:
cols += cc['title']+';'
以上步驟的分析和解析json的方法也適用一般Python爬蟲。