作者:李波2602884584 | 来源:互联网 | 2023-05-17 16:27
ajax网页的爬取看完1,2,3的教程其实呢一些简单结构的网站基本都能爬取了,然而在现在网页页面资源越来越丰富的趋势下,每次一刷新就把整个网页给你重新加载已经是out的做法了,而你可能也会
ajax网页的爬取
看完1,2,3的教程其实呢一些简单结构的网站基本都能爬取了,然而在现在网页页面资源越来越丰富的趋势下,每次一刷新就把整个网页给你重新加载已经是out的做法了,而你可能也会忍受不了它的加载速度,所以Ajax技术就诞生了,这是一种异步加载的技术,换而言之就是你看到的只是加载了一部分的页面,典型的就是如果壳网http://www.guokr.com/scientific/,你一直往下拉,页面就会显示更多的内容给你,而不是一次性的全加载进来
可我们的爬虫可不能帮你”手动向下拉”,那怎么办呢?这时候就要通过抓包来分析异步加载的网页的特征了
我们就以上面的果壳网为例子,这里我用的是火狐浏览器来抓包
环境 ubuntu 16.04 python3.6.1
我们套路一下,打开页面,打开检查元素开发者选项,然后刷新一下,在网络监视器里选择XHR(XMLHttpRequest),我们可以看到一个请求就来了,我们再往下拉,等到第二个页面加载,第二个请求就来了
我们点开两个请求看看参数
聪明的你一定发现规律了,可以看到offset参数相差了20,我们继续刷新下一个页面看看
果然下一个页面就是58,那么其实就相当于我们拿到这个页面的入口了
可是数据在哪里呢?
我们再到处翻翻看到响应这里,返回的是一个JSON文件,然后看看result,似乎是一个列表
点开一波
惊喜的发现我们想要的数据全都在这里了,那么就可以开始我们的爬取了
解析JSON文件我们有Python自带的JSON库,功能已经很齐全了,直接json.loads()一下就出来了,而且格式优美,还不用我们整理了~
这里我就直接存在数据库里了
#coding:utf-8
import requests
import json
from pymongo import MongoClient
import pymongo
url = '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