以新版简书网站为例,新网站很多地方采用了ajax(异步JavaScript和XML),大大提高了页面加载的速度。
对于一些数据抓取来说,就增加了复杂度,ajax数据从源代码里找不到。如下图,一篇文章页面中的评论信息和哪些专题进行了收录,都在源代码中看不到。
一、抓包分析
使用抓包工具Fiddler 或 Chrome "检查"进行分析。文中使用的是Chrome 工具。Chrome -- "检查" -- 切换到 “Network”,这时候刷新一下网页。找到发送 收录专题的请求(request)。
注意:一个页面通常会有几十个请求(这个页面有89个),包括网页文档(document), 脚本(script),图片(jpeg),还有一种类型叫 xhl 就是 XMLHttpRequest, 我们要找的异步请求类型。比较一下名字,找到我们所要的请求。
点击它,就看到完整的URL了。
http://www.jianshu.com/notes/8777855/included_collections?page=1
注意,这个URL放到地址栏访问发现并不没有返回我们所要的数据,而是一个404页面。但看一下返回的Response,就是我们所需要的JSON数据。
怎么办?把url改成.json
结尾,就可以在地址栏访问看到数据了。
http://www.jianshu.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("//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.jianshu.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爬虫。