如何爬取通过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 02 Python
python根据给定文件返回文件名和扩展名的方法
Mar 27 Python
python实现爬取千万淘宝商品的方法
Jun 30 Python
Python 私有函数的实例详解
Sep 11 Python
python实现内存监控系统
Mar 07 Python
python使用folium库绘制地图点击框
Sep 21 Python
Django实现简单网页弹出警告代码
Nov 15 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
python dict如何定义
Sep 02 Python
Python pickle模块常用方法代码实例
Oct 10 Python
python破解同事的压缩包密码
Oct 14 Python
Python实现聚类K-means算法详解
Jul 15 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
Python模块学习 filecmp 文件比较
2012/08/27 Python
python实现的阳历转阴历(农历)算法
2014/04/25 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
后进生转化工作制度
2014/01/17 职场文书
公司前台辞职报告
2014/01/19 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
检讨书1000字
2014/10/11 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
妈妈别哭观后感
2015/06/08 职场文书
社区低保工作总结2015
2015/07/23 职场文书
五年级作文之学校的四季
2019/12/05 职场文书