以新版簡書網(wǎng)站為例,新網(wǎng)站很多地方采用了ajax(異步JavaScript和XML),大大提高了頁面加載的速度。
對于一些數(shù)據(jù)抓取來說漱逸,就增加了復(fù)雜度泪姨,ajax數(shù)據(jù)從源代碼里找不到游沿。如下圖,一篇文章頁面中的評論信息和哪些專題進行了收錄肮砾,都在源代碼中看不到诀黍。
一、抓包分析
使用抓包工具Fiddler 或 Chrome "檢查"進行分析仗处。文中使用的是Chrome 工具眯勾。Chrome -- "檢查" -- 切換到 “Network”,這時候刷新一下網(wǎng)頁婆誓。找到發(fā)送 收錄專題的請求(request)吃环。
注意:一個頁面通常會有幾十個請求(這個頁面有89個),包括網(wǎng)頁文檔(document), 腳本(script),圖片(jpeg),還有一種類型叫 xhl 就是 XMLHttpRequest洋幻, 我們要找的異步請求類型郁轻。比較一下名字,找到我們所要的請求。
點擊它好唯,就看到完整的URL了竭沫。
http://www.reibang.com/notes/8777855/included_collections?page=1
注意,這個URL放到地址欄訪問發(fā)現(xiàn)并不沒有返回我們所要的數(shù)據(jù)骑篙,而是一個404頁面蜕提。但看一下返回的Response,就是我們所需要的JSON數(shù)據(jù)靶端。
怎么辦谎势?把url改成.json
結(jié)尾,就可以在地址欄訪問看到數(shù)據(jù)了杨名。
http://www.reibang.com/notes/8777855/included_collections.json
這里就完成了第一步它浅,最關(guān)鍵的問題是如何獲取url里的這個id 8777855
,如果我們能找到這個id镣煮,就可以構(gòu)造一個url獲得json數(shù)據(jù)姐霍。
二、構(gòu)造目標(biāo)地址
方法:查看網(wǎng)頁源代碼典唇。剛剛不是說了镊折,源代碼里沒有我們所需要的數(shù)據(jù)嗎?查什么呢介衔,搜這個數(shù)字id 8777855
恨胚,看一下,果然有炎咖,它在一些<meta>
標(biāo)簽里赃泡,作為 content
值的一部分。
那就好辦了乘盼。解析meta
標(biāo)簽升熊,拿到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.reibang.com/notes/%s/included_collections.json'%id
yield Request(collection_url,callback=self.parse_json)
OK绸栅, 這樣就構(gòu)造好了一個目標(biāo)url级野。
三、解析json數(shù)據(jù)
這一步就比較簡單粹胯,引入json包蓖柔,進行解析。當(dāng)然做這步時风纠,需要先發(fā)送一個請求况鸣。
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爬蟲。