如何爬取通过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自定义装饰器原理与用法实例分析
Jul 16 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
python中退出多层循环的方法
Nov 27 Python
PyCharm配置mongo插件的方法
Nov 30 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Python操作redis和mongoDB的方法
Dec 19 Python
Python列表list操作相关知识小结
Jan 29 Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 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中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
apache php模块整合操作指南
2012/11/16 PHP
php字符串操作常见问题小结
2016/10/11 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
用javascript操作xml
2006/11/04 Javascript
js异或加解密效果代码
2008/06/25 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
初识Javascript小结
2015/07/16 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
python 从远程服务器下载日志文件的程序
2013/02/10 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
python实现3D地图可视化
2020/03/25 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
仓管员岗位职责范文
2013/11/08 职场文书
化学教学随笔感言
2014/02/19 职场文书
大学新生军训感言
2014/02/25 职场文书
天网工程实施方案
2014/03/26 职场文书
经典祝酒词大全
2015/08/12 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书