ajax抓取网页内容(新版简书网站为例的评论信息和哪些专题进行了收录)
优采云 发布时间: 2021-11-09 11:05ajax抓取网页内容(新版简书网站为例的评论信息和哪些专题进行了收录)
以新版短书网站为例,新版网站在很多地方使用了ajax(异步JavaScript和XML),大大提高了页面加载速度。
对于一些数据的抓取,增加了复杂度,在源码中找不到ajax数据。如下图所示,文章页面中的评论信息以及哪些话题已经被收录在源码中是看不到的。
一、 抓包分析
使用抓包工具 Fiddler 或 Chrome“检查”进行分析。本文使用 Chrome 工具。Chrome——“检查”——切换到“网络”,然后刷新网页。找到发送主题收录的请求。
注意:一个页面通常有几十个请求(这个页面有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,看看,确实如此,是在一些标签中,作为内容值的一部分。
那么它会更容易。解析元标记并获取 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爬虫。