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

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-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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值