如何爬取通过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网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
python修改txt文件中的某一项方法
Dec 29 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
python函数的万能参数传参详解
Jul 26 Python
python命令 -u参数用法解析
Oct 24 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
Dec 03 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
Python如何把不同类型数据的json序列化
Apr 30 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
js cookies实现简单统计访问次数
2009/11/24 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
python判断字符串是否纯数字的方法
2014/11/19 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
python自定义函数def的应用详解
2020/06/03 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
茶叶生产计划书
2014/01/10 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
财务人员个人工作总结
2015/02/27 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
党员干部学习心得体会
2016/01/23 职场文书
Java异常处理try catch的基本用法
2021/12/06 Java/Android