如何爬取通过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实现简单截取中文字符串的方法
Jun 15 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
python编写微信远程控制电脑的程序
Jan 05 Python
python批量读取txt文件为DataFrame的方法
Apr 03 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
python print出共轭复数的方法详解
Jun 25 Python
pandas DataFrame的修改方法(值、列、索引)
Aug 02 Python
tensorflow mnist 数据加载实现并画图效果
Feb 05 Python
python实现翻译word表格小程序
Feb 27 Python
python代码中怎么换行
Jun 17 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 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
thinkphp的静态缓存用法分析
2014/11/29 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
ArrayList类(增强版)
2007/04/04 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python实现将内容分行输出
2015/11/05 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python 实现字符串下标的输出功能
2020/02/13 Python
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
国际贸易专业求职信
2014/06/04 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS