如何爬取通过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地图坐标转换
Feb 08 Python
python opencv之SURF算法示例
Feb 24 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
谈谈Python中的while循环语句
Mar 10 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
python实现ip地址的包含关系判断
Feb 07 Python
python opencv角点检测连线功能的实现代码
Nov 24 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 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
PHP4中session登录页面的应用
2008/07/25 PHP
精通php的十大要点(上)
2009/02/04 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
Mac下安装vue
2018/04/11 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
python 用下标截取字符串的实例
2018/12/25 Python
Python OS模块实例详解
2019/04/15 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
String和StringBuffer的区别
2015/08/13 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
大学生志愿者感言
2014/01/15 职场文书
欢送退休感言
2014/02/08 职场文书
心理学专业求职信
2014/06/16 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
大学生暑假实习总结
2015/07/13 职场文书
毕业酒会致辞
2015/07/29 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL