如何爬取通过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实现从ftp服务器下载文件的方法
Apr 30 Python
在Python中处理日期和时间的基本知识点整理汇总
May 22 Python
Django rest framework基本介绍与代码示例
Jan 26 Python
Python拼接字符串的7种方法总结
Nov 01 Python
python opencv实现证件照换底功能
Aug 19 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
Python reques接口测试框架实现代码
Jul 28 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
pytorch 中autograd.grad()函数的用法说明
May 12 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
Zend的Registry机制的使用说明
2013/05/02 PHP
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
用JavaScript显示随机图像或引用
2009/04/21 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
jQuery实现评论模块
2020/08/19 jQuery
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
Django内容增加富文本功能的实例
2017/10/17 Python
pycharm安装和首次使用教程
2018/08/27 Python
python生成n个元素的全组合方法
2018/11/13 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
Python实现12306火车票抢票系统
2019/07/04 Python
django实现用户注册实例讲解
2019/10/30 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
村委会贫困证明
2014/01/14 职场文书
小学端午节活动方案
2014/03/13 职场文书
党员公开承诺书范文
2014/03/25 职场文书
社区活动总结范文
2015/05/07 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
OpenCV实现反阈值二值化
2021/11/17 Java/Android