Python编程—Ajax数据爬取(一)

简介: Python编程—Ajax数据爬取(一)

Python编程—Ajax数据爬取
在浏览器中可以看到正常显示的页面数据,而使用requests得到的结果中并没有这些数据。这是因为requests获取的都是原始HTML文档,而浏览器中的页面是JavaScript处理数据后生成的结果,这些数据有多种来源:可能是通过Ajax加载的,可能是包含在HTML文档中的,也可能是经过JavaScript和特定算法计算后生成的。

对第一种来源,数据加载是一种异步加载方式,原始页面最初不会包含某些数据,当原始页面加载完后,会再向服务器请求某个接口获取数据,然后数据才会经过处理从而呈现在网页上,这其实是发送了一个Ajax请求。使得web开发做到前后端分离,减小服务器直接渲染页面带来的压力。

所以遇到这样的页面,直接利用requests等库来抓取原始HTML文档,是无法获取有效数据的。这时需要分析网页后台接口发送的Ajax请求。如果可用requests模拟Ajax请求,就可以成功抓取网页数据了。

5.1 什么是Ajax
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它基于 HTML、CSS、JavaScript、XML 和 XMLHttpRequest 等标准。

首先,AJAX 的全称是 Asynchronous JavaScript and XML(异步的JavaScript和XML),它是一种用于创建更好更快以及交互性更强的Web应用程序的技术。使用 JavaScript 向服务器提出请求并处理响应而不阻塞用户的核心对象是 XMLHttpRequest。

其次,AJAX 的主要优点是可以在不刷新整个网页的情况下,对网页的某部分进行更新。这样可以提高网页的响应速度和用户体验,因为它避免了每次用户操作都需要等待整个页面重新加载的情况。

最后,AJAX 的应用场景非常广泛,包括但不限于表单提交、数据检索、实时消息更新等。通过使用 XMLHttpRequest 对象和回调函数,可以实现局部刷新,从而检测用户输入的用户名是否为"zhongfucheng"。

实例引入
微博主页https://m.weibo.cn/u/2830678474为例。

基本原理
简单分为3步——发送请求、解析内容、渲染网页。
发送请求
JavaScript可以实现页面的各种交互功能,Ajax也不例外,它也是由JavaScript实现的,实现代码如下:

var xmlhttp;
if (window.XMLHttpRequest) {
   
    xmlhttp = new XMLHttpRequest();
}else {
   //code for IE6、IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function () {
   
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
   
        document.getElementById("myDiv").innerHTML = xmlhttp.responsetext;
    }
}
xmlhttp.open('POST','/ajax/', true);
xmlhttp.send();

这是JavaScript对Ajax最底层的实现,实际上是先建一个XMLHttpRequest对象xmlhttp,然后调用onreadystatechange属性设置监听,最后调用open和send方法向某个链接(服务器)发送请求。这里的请求发送由JavaScript完成,不是Python实现。由于设置了监听,所以当服务器返回响应时,onreadystatechange对应的方法便会被触发,然后在这方法里面解析响应内容即可。

解析内容
服务器返回响应后,onreadystatechange属性对应的方法就触发了,此时利用xmlhttp的responseText属性便可得到响应内容。这类似于Python中利用requests向服务器发起请求,然后得到响应的过程。返回内容可能是HTML,可能是JSON,接下来只需在方法中用JavaScript进一步处理即可。如果是JSON的话,可以进行解析和转化。

渲染网页
JavaScript有改变网页内容的能力,因此解析完响应内容后,就可以调用JavaScript来基于解析完的内容对网页进行下一步处理了。例如,通过document.getElementById().innerHTML操作,可以更改某个元素内的源代码,这样网页显示的内容就改变了。这种操作也被称为DOM操作,即对网页文档进行操作,如更改、删除等。

上面“发送请求”部分,代码里的document.getElementById(”myDiv”).innerHTML=xmlhttp.responseText便是将ID为myDiv的节点内部的HTML代码更改为服务器返回的内容,这样myDiv元素内部便会呈现服务器返回的新数据,对应的网页内容看上去就更新了。

5.2 Ajax分析方法
分析案例
用Chrome浏览器打开微博链接https://m.weibo.cn/u/2830678474,然后在页面中单击鼠标右键,从弹出的快捷菜单中选择“检查”选项,此时便会弹出开发者工具,如图所示:

image.png
image.png

Ajax尤其特殊请求类型叫做xhr,可以发现一个名称以getIndex开头的请求,其Type就为xhr,意味着这就是一个Ajax请求。用鼠标单击这个请求,可以查看其详细信息。其中Request Headers中有一个信息为X-Rrequested-With:XMLHttpRequest,这就标记了此请求是Ajax请求,如图所示:

image.png

随后单击一下Preview, 就能看到响应内容,如图所示,内容是JSON格式的,这里Chrome为我们自动做了解析,单击左箭头即可展开和收起相应内容。
image.png

经过观察可以发现,这里的返回结果是我的个人信息,如昵称、简介、头像等,这也是渲染个人主页使用的数据。JavaScript接收到这些数据之后,再执行相应的渲染方法,整个页面就渲染出来。
image.png

也可以切换到Response选项卡,从中观察真实的返回数据,如图所示:

image.png

接下来,切回第一个请求,观察一下它的Response是什么,如图所示:

image.png

原始的链接https://m.weibo.cn/u/2830678474返回的结果,其代码只有不到50行,结构也非常简单,只是执行了一些JavaScript语句。所以说,微博页面呈现给我们的真实数据并不是最原始的页面返回的,而是执行JavaScript后再次向后台发送Ajax请求,浏览器拿到服务器返回到数据后进一步渲染得到的。

1.过滤请求
利用Chrome开发者工具的筛选功能能够筛选出所有Ajax请求。在请求的上方有一层筛选栏,直接单击XHR,之后下方显示的所有请求便都是Ajax请求了,如图所示:

image.png

接下来只需要用程序模拟这些Ajax请求,就可以轻松提取我们所需的信息。

5.3 Ajax分析与爬取实战
准备工作

  1. 安装好Python3(最低为3.6版本),并成功运行Python3程序。
  2. 了解Python HTTP请求库requests的基本用法。
  3. 了解Ajax基础知识和分析Ajax的基本方法。

爬取目标
示例网站链接:https://spa1.scrape.center/,该示例网站的数据请求是通过Ajax完成的,页面的内容是通过JavaScript渲染出来的,页面如图所示。

image.png

单击每部电影进入对应的详情页,这些页面的结构也是完全一样的,如下图所示的是《迁徙的鸟》的详情页。

image.png

完成目标如下:

  1. 分析页面数据的加载逻辑
  2. 用requests实现Ajax数据的爬取
  3. 将每部电影的数据分别保存到MongoDB数据库

初步探索
先尝试用requests直接提取页面,看看结果。实现代码如下:

import requests

url = '<https://spa1.scrape.center/>'
html = requests.get(url).text
print(html)

运行结果如下:
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge">
<meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>Scrape | Movie</title>
<link href=/css/chunk-700f70e1.1126d090.css rel=prefetch><link href=/css/chunk-d1db5eda.0ff76b36.css rel=prefetch>
<link href=/js/chunk-700f70e1.0548e2b4.js rel=prefetch><link href=/js/chunk-d1db5eda.b564504d.js rel=prefetch>
<link href=/css/app.ea9d802a.css rel=preload as=style><link href=/js/app.17b3aaa5.js rel=preload as=script>
<link href=/js/chunk-vendors.683ca77c.js rel=preload as=script><link href=/css/app.ea9d802a.css rel=stylesheet>
</head><body><noscript><strong>We're sorry but portal doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript><div id=app></div><script src=/js/chunk-vendors.683ca77c.js></script><script src=/js/app.17b3aaa5.js></script>
</body></html>

可以看到,爬取结果只有这么一点HTML内容,在HTML中只能看到源码引用的一些JavaScript和CSS文件,没有观察到任何电影数据信息。这说明浏览器执行了HTML中引用的JavaScript文件,通过调用一些数据加载和页面渲染方法,才最终呈现页面显示的结果。JavaScript在后台调用Ajax数据接口,得到数据之后,再对数据进行解析并渲染呈现出来。所以直接爬取Ajax接口,再获取数据就好了。

接下文 Python编程—Ajax数据爬取(二)https://developer.aliyun.com/article/1620693

相关文章
|
2月前
|
JSON 算法 API
1688商品详情API实战:Python调用全流程与数据解析技巧
本文介绍了1688电商平台的商品详情API接口,助力电商从业者高效获取商品信息。接口可返回商品基础属性、价格体系、库存状态、图片描述及商家详情等多维度数据,支持全球化语言设置。通过Python示例代码展示了如何调用该接口,帮助用户快速上手,适用于选品分析、市场研究等场景。
|
3月前
|
数据采集 NoSQL 关系型数据库
Python爬虫去重策略:增量爬取与历史数据比对
Python爬虫去重策略:增量爬取与历史数据比对
|
2月前
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
427 58
|
2月前
|
人工智能 数据可视化 Python
在Python中对数据点进行标签化
本文介绍了如何在Python中使用Matplotlib和Seaborn对数据点进行标签化,提升数据可视化的信息量与可读性。通过散点图示例,展示了添加数据点标签的具体方法。标签化在标识数据点、分类数据可视化及趋势分析中具有重要作用。文章强调了根据需求选择合适工具,并保持图表清晰美观的重要性。
62 15
|
1月前
|
数据采集 Web App开发 JavaScript
Python爬虫解析动态网页:从渲染到数据提取
Python爬虫解析动态网页:从渲染到数据提取
|
2月前
|
供应链 API 开发者
1688 商品数据接口终极指南:Python 开发者如何高效获取标题 / 价格 / 销量数据(附调试工具推荐)
1688商品列表API是阿里巴巴开放平台提供的服务,允许开发者通过API获取1688平台的商品信息(标题、价格、销量等)。适用于电商选品、比价工具、供应链管理等场景。使用时需构造请求URL,携带参数(如q、start_price、end_price等),发送HTTP请求并解析返回的JSON/XML数据。示例代码展示了如何用Python调用该API获取商品列表。
134 18
|
2月前
|
数据采集 安全 BI
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
84 11
|
3月前
|
数据采集 存储 缓存
Python爬虫与代理IP:高效抓取数据的实战指南
在数据驱动的时代,网络爬虫是获取信息的重要工具。本文详解如何用Python结合代理IP抓取数据:从基础概念(爬虫原理与代理作用)到环境搭建(核心库与代理选择),再到实战步骤(单线程、多线程及Scrapy框架应用)。同时探讨反爬策略、数据处理与存储,并强调伦理与法律边界。最后分享性能优化技巧,助您高效抓取公开数据,实现技术与伦理的平衡。
142 4
|
3月前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。

热门文章

最新文章

推荐镜像

更多