如何爬取通过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 相关文章推荐
python的re模块应用实例
Sep 26 Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
Python多层装饰器用法实例分析
Feb 09 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
python [:3] 实现提取数组中的数
Nov 27 Python
python实现PCA降维的示例详解
Feb 24 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 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 CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
JavaScript高级程序设计
2006/12/29 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
jQuery事件对象总结
2016/10/17 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
详解【python】str与json类型转换
2019/04/29 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
电子信息专业学生自荐信
2013/11/09 职场文书
欢迎家长标语
2014/10/08 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
2015党建工作简报
2015/07/21 职场文书
老舍《猫》教学反思
2016/02/17 职场文书
7个你应该知道的JS原生错误类型
2021/04/29 Javascript