分析ajax爬取果壳网

一、确定要爬取的网页

        首先选择要爬取的网页,我要爬取的是果壳网,url为:https://www.guokr.com/scientific/

爬取每篇文章的标题、名字、作者、发布时间等信息

  


二、分析网页

      我们每次往下拉的时候都会有源源不断的文章出来,而我们在分析该网页的时候新文章的HTML也是我们往下拉的时候出现的,那么恭喜你了,这个网站的数据放在ajax中了,听到这里就有人觉得麻烦了,以前爬取的数据都是固定的,requests请求后就可以直接分析了,其实ajax并不难,我们只要找到ajax的地址和其中的参数即可,为什么这么说呢?因为每次往下拉的时候,ajax每次会都有固定文章出现,这其中肯定有相对应的参数来控制的,我们只要分析这个ajax的url就好了,把其固定不变的截取下来,而改变的参数则我们来传参

       下面这个文件就是我们要找的ajax地址了,点击进去看下


       看下我们的headers,分析我们请求的url,然后得出结论

固定的是    https://www.guokr.com/apis/minisite/article.json? 

有三个参数,分别是retrieve_type、limit、offset,经过多次对比,发现就是offset一直再改变,所以前面两个参数写死,后面的根据参数来改变,开始的时候有18篇文章,而每次ajax会加载出20篇,所以就可以得到offset的值了



三、 分析出每篇文章的url

我们看到每个ajax中都放了20条数据,数据都在result的东西里面


点开这个result,在最下面找到了我们要的url,这里需要记住最重要的一点,得到的ajax的格式都是json格式的



四、分析每篇文件的url,找到需要的数据的位置

随便点开一篇文章,根据分析,发现所有的数据都放在这个div中,只需得到这个div,然后进一步分析得到里面的数据



五、代码

import requests
from bs4 import BeautifulSoup

# 得到每个offset值
def off_set():
    offset = 18
    # 先取99个ajax,
    for i in range(1,100):
        if i == 1:
            parse_url(offset)
        else:
            offset = limit + offset
            parse_url(offset)

# 将得到的offset传入
def parse_url(offset):
    # 带参传递
    data = {
        'retrieve_type':'by_subject',
        'limit':'20',
        'offset':offset
    }
    # 请求这个ajax地址
    response = requests.get(start_ajax,params=data,headers=headers)
    # 得到的数据是个json格式,所以用requests自带的json函数来解析它
    ajax_data=response.json()
    # 解析得到每篇文章的url,因为ajax是个字典格式,而其中result的值却是个列表,所以要用[0]取出
    lst=ajax_data['result']
    for i in lst:
        url = i['url']
        print(url)
        parse(url)

def parse(url):
    html = requests.get(url,headers=headers)
    html = html.text
    soup = BeautifulSoup(html,'lxml')
    data = soup.find_all('div',class_='content-th')
    for i in data:
        title = i.find_all('a')[0].text
        name = i.find_all('h1')[0].text.split()[0]
        zuoze = i.find_all('div','content-th-info')[0].find_all('a')[0].text
        time = i.find_all('div','content-th-info')[0].find_all('meta')[0]['content']
        print('{}\t\t{}\t\t{}\t\t{}'.format(title,name,zuoze,time))

if __name__ == '__main__':
    start_ajax = 'https://www.guokr.com/apis/minisite/article.json?'
    headers = {
        'User-Agent': 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)', }
    # 每个offset都是以18为基数,每次叠加20
    limit = 20
    off_set()

运行结果:


就这样得到了我们要的结果,当然你要其它数据可以自己写,我只想告诉你们如何去解析ajax文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值