如何爬取通过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接收多播数据的代码
Mar 01 Python
python万年历实现代码 含运行结果
May 20 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
BP神经网络原理及Python实现代码
Dec 18 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
python中count函数知识点浅析
Dec 17 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入门学习的几个不错的实例代码
2008/07/13 PHP
浅析PHP 按位与或 (^ 、&)
2013/06/21 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
js一组验证函数
2008/12/20 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
python检测远程udp端口是否打开的方法
2015/03/14 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
python多线程抽象编程模型详解
2019/03/20 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
执行Python程序时模块报错问题
2020/03/26 Python
python 带时区的日期格式化操作
2020/10/23 Python
公务员的自我鉴定
2013/10/26 职场文书
计算机应用专业推荐信
2013/11/13 职场文书
技术总监的工作职责
2013/11/13 职场文书
企业军训感言
2014/02/08 职场文书
大专生找工作自荐书
2014/06/10 职场文书
销售人才自我评价范文
2014/09/27 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
飞屋环游记观后感
2015/06/08 职场文书
Java 写一个简单的图书管理系统
2022/04/26 Java/Android