如何爬取通过ajax加载数据的网站


Posted in Python onAugust 15, 2019

目前很多网站都使用ajax技术动态加载数据,和常规的网站不一样,数据时动态加载的,如果我们使用常规的方法爬取网页,得到的只是一堆html代码,没有任何的数据。

请看下面的代码:

url = 'https://www.toutiao.com/search/?keyword=美女'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"}

response = requests.get(url,headers=headers)
print(response.text)

上面的代码是爬取今日头条的一个网页,并打印出get方法返回的文本内容如下图所示,值现在一堆网页代码,并没有相关的头条新闻信息

如何爬取通过ajax加载数据的网站

内容过多,只截取部分内容,有兴趣的朋友可以执行上面的代码看下效果。

对于使用ajax动态加载数据的网页要怎么爬取呢?我们先看下近日头条是如何使用ajax加载数据的。通过chrome的开发者工具来看数据加载过程。

首先打开chrome浏览器,打开开发者工具,点击Network选项,点击XHR选项,然后输入网址:https://www.toutiao.com/search/?keyword=美女  ,点击Preview选项卡,就会看到通过ajax请求返回的数据,Name那一栏就是ajax请求,当鼠标向下滑动时,就会出现多条ajax请求:

如何爬取通过ajax加载数据的网站

通过上图我们知道ajax请求返回的是json数据,我们继续分析ajax请求返回的json数据,点击data展开数据,接着点击0展开数据,发现有个title字段,内容刚好和网页的第一条数据匹配,可知这就是我们要爬取的数据。如下所示:

如何爬取通过ajax加载数据的网站

鼠标向下滚动到网页底部时就会触发一次ajax请求,下面是三次ajax请求:

https://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis
https://www.toutiao.com/search_content/?offset=20&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis
https://www.toutiao.com/search_content/?offset=40&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis

观察每个ajax请求,发现每个ajax请求都有offset,format,keyword,autoload,count,cur_tab,from,pd参数,除了offset参数有变化之外,其他的都不变化。每次ajax请求offset的参数变化规律是0,20,40,60…,可以推测offset是偏移量,count参数是一次ajax请求返回数据的条数。

为了防止爬虫被封,每次请求时要把请求时都要传递请求头信息,请求头信息中包含了浏览器的信息,如果请求没有浏览器信息,就认为是网络爬虫,直接拒绝访问。request header信息如下:

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0",
"referer": "https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3",
'x-requested-with': 'XMLHttpRequest'
}

完整代码如下:

import requests
from urllib.parse import urlencode

def parse_ajax_web(offset):
  url = 'https://www.toutiao.com/search_content/?'
  #请求头信息
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0",
    "referer": "https://www.toutiao.com/search/",
    'x-requested-with': 'XMLHttpRequest'
  }
  #每个ajax请求要传递的参数
  parm = {
    'offset': offset,
    'format': 'json',
    'keyword': '美女',
    'autoload': 'true',
    'count': 20,
    'cur_tab': 1,
    'from': 'search_tab',
    'pd': 'synthesis'
  }
  #构造ajax请求url
  ajax_url = url + urlencode(parm)
  #调用ajax请求
  response = requests.get(ajax_url, headers=headers)
  #ajax请求返回的是json数据,通过调用json()方法得到json数据
  json = response.json()
  data = json.get('data')
  for item in data:
    if item.get('title') is not None:
      print(item.get('title'))

def main():
  #调用ajax的次数,这里调用5次。
  for offset in (range(0,5)):
    parse_ajax_web(offset*20)

if __name__ == '__main__':
  main()

上面是爬取通过ajax请求加载数据网站的例子,如果想要其他的数据,可以动手自己写,这里只是搭了一个架子,各位可以尝试将数据写入到excel或者数据库中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
安装dbus-python的简要教程
May 05 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 Python
Python ldap实现登录实例代码
Sep 30 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python中实现最小二乘法思路及实现代码
Jan 04 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
Python的高阶函数用法实例分析
Apr 11 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
django 获取字段最大值,最新的记录操作
Aug 09 Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 Python
Python K最近邻从原理到实现的方法
Aug 15 #Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 #Python
浅谈Python 敏感词过滤的实现
Aug 15 #Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 #Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 #Python
Python依赖包整体迁移方法详解
Aug 15 #Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 #Python
You might like
PHP编码规范-php coding standard
2007/03/16 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
php命令行写shell实例详解
2018/07/19 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
pytorch 常用线性函数详解
2020/01/15 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
python可迭代对象去重实例
2020/05/15 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
Shell编程面试题
2016/05/29 面试题
入党申请人的自我鉴定
2013/12/01 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
上班上网检讨书
2014/01/29 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
如何写新闻稿
2015/07/18 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
基于Go Int转string几种方式性能测试
2021/04/28 Golang
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang
Python加密技术之RSA加密解密的实现
2022/04/08 Python
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技