爬虫入门(四) ajax网页的爬取

来源:互联网 发布:cheat engine源码 编辑:程序博客网 时间:2024/06/03 21:31

ajax网页的爬取

看完1,2,3的教程其实呢一些简单结构的网站基本都能爬取了,然而在现在网页页面资源越来越丰富的趋势下,每次一刷新就把整个网页给你重新加载已经是out的做法了,而你可能也会忍受不了它的加载速度,所以Ajax技术就诞生了,这是一种异步加载的技术,换而言之就是你看到的只是加载了一部分的页面,典型的就是如果壳网http://www.guokr.com/scientific/,你一直往下拉,页面就会显示更多的内容给你,而不是一次性的全加载进来

可我们的爬虫可不能帮你”手动向下拉”,那怎么办呢?这时候就要通过抓包来分析异步加载的网页的特征了

我们就以上面的果壳网为例子,这里我用的是火狐浏览器来抓包

环境 ubuntu 16.04 python3.6.1

我们套路一下,打开页面,打开检查元素开发者选项,然后刷新一下,在网络监视器里选择XHR(XMLHttpRequest),我们可以看到一个请求就来了,我们再往下拉,等到第二个页面加载,第二个请求就来了

1

我们点开两个请求看看参数

2

聪明的你一定发现规律了,可以看到offset参数相差了20,我们继续刷新下一个页面看看

果然下一个页面就是58,那么其实就相当于我们拿到这个页面的入口了

可是数据在哪里呢?

我们再到处翻翻看到响应这里,返回的是一个JSON文件,然后看看result,似乎是一个列表

3

点开一波

4

惊喜的发现我们想要的数据全都在这里了,那么就可以开始我们的爬取了

解析JSON文件我们有Python自带的JSON库,功能已经很齐全了,直接json.loads()一下就出来了,而且格式优美,还不用我们整理了~

这里我就直接存在数据库里了

#coding:utf-8import requestsimport jsonfrom pymongo import MongoClientimport pymongourl = 'http://www.guokr.com/scientific/'client = MongoClient()guoke = client['guoke']guokeData = guoke['guokeData']def dealData(url):    web_data = requests.get(url)    datas = json.loads(web_data.text)    print(datas.keys())    for data in datas['result']:        guokeData.insert_one(data)def run():    urls = ['http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset={}&_=1493885477869'.format(str(i)) for i in range(18,100,20) ]    for url in urls:        print(url)        dealData(url)if __name__ == '__main__':    run()

最后感谢这位博主的指导~http://www.jianshu.com/p/6002ef3434fd

0 0
原创粉丝点击