如何爬取通过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中threading超线程用法实例分析
May 16 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
python如何实现内容写在图片上
Mar 23 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
python ddt数据驱动最简实例代码
Feb 22 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
python openssl模块安装及用法
Dec 06 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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之第三天
2006/10/09 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
python utc datetime转换为时间戳的方法
2019/01/15 Python
python内存动态分配过程详解
2019/07/15 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
python实现超级马里奥
2020/03/18 Python
什么是Python变量作用域
2020/06/03 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
摄影专业毕业生求职信
2014/03/13 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
幼师求职信
2014/06/23 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
Django中celery的使用项目实例
2022/07/07 Python