ajax中获取不到id_我的爬虫爬不到数据?

本文探讨了在使用Ajax过程中可能出现的数据获取问题,包括基本的Ajax原理、发送请求和解析内容的步骤。针对无法获取id的情况进行了分析,并提供了从HTML基础到Scrapy爬虫框架的全面知识。
摘要由CSDN通过智能技术生成
ace6ede70b25fe0d3ed9e39096c80c1f.png f26b4b124a8df0f3ece26870a4740448.png ef3fe54cd5e5b835c8dc9e90f2a7dab5.png

点击上方蓝字关注我们

当我们在用 requests 抓取页面的时候,得到的结果可能会和在浏览器中看到的不一样:在浏览器中正常显示的页面数据,使用 requests 却没有得到结果。 这是为什么呢?因为 requests 获取的都是原始 HTML 文档,而浏览器中的页面则是经过 JavaScript 数据处理后生成的结果。这些数据的来源有多种,可能是通过 Ajax 加载的,可能是包含在 HTML 文档中的,也可能是经过 JavaScript 和特定算法计算后生成的。 对于第 1 种情况,数据加载是一种异步加载方式,原始页面不会包含某些数据,只有在加载完后,才会向服务器请求某个接口获取数据,然后数据才被处理从而呈现到网页上,这个过程实际上就是向服务器接口发送了一个 Ajax 请求。

为什么需要Ajax

按照 Web 的发展趋势来看,这种形式的页面将会越来越多。网页的原始 HTML 文档不会包含任何数据,数据都是通过 Ajax 统一加载后再呈现出来的,这样在 Web 开发上可以做到前后端分离,并且降低服务器直接渲染页面带来的压力。 所以如果你遇到这样的页面,直接利用 requests 等库来抓取原始页面,是无法获取有效数据的。这时我们需要分析网页后台向接口发送的 Ajax 请求,如果可以用 requests 来模拟 Ajax 请求,就可以成功抓取了。

什么是 Ajax

Ajax,全称为 Asynchronous JavaScript and XML ,即异步的 JavaScript 和 XML。它不是一门编程语言,而是利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。 传统的网页,如果你想更新其内容,那么必须要刷新整个页面。有了 Ajax,便可以在页面不被全部刷新的情况下更新其内容。在这个过程中,页面实际上在后台与服务器进行了数据交互,获取到数据之后,再利用 JavaScript 改变网页,这样网页内容就会更新了。 浏览网页的时候,我们会发现很多网页都有下滑查看更多的选项。 我们切换到微博页面,发现下滑几个微博后,后面的内容不会直接显示,而是会出现一个加载动画,加载完成后下方才会继续出现新的微博内容,这个过程其实就是 Ajax 加载的过程,如图所示:

83259ea9403e4267dec53e501f68d7b7.png

我们注意到页面其实并没有整个刷新,这意味着页面的链接没有变化,但是网页中却多了新内容,也就是后面刷出来的新微博。这就是通过 Ajax 获取新数据并呈现的过程。 58e5081796307d683a296a59d1a9d7c4.png

基本原理

初步了解了 Ajax 之后,我们再来详细了解它的基本原理。发送 Ajax 请求到网页更新的过程可以简单分为以下 3 步: f53e6bc426848ab074858b707e585680.png

发送请求

解析内容

渲染网页

下面我们分别详细介绍一下这几个过程。 58e5081796307d683a296a59d1a9d7c4.png

发送请求

我们知道 JavaScript 可以实现页面的各种交互功能,Ajax 也不例外,它是由 JavaScript 实现的,实际上执行了如下代码:

df413a2ca7d30cb67e3e512538f4d01c.png

这是 JavaScript 对 Ajax 最底层的实现,这个过程实际上是新建了 XMLHttpRequest 对象,然后调用 onreadystatechange 属性设置监听,最后调用 open() 和 send() 方法向某个链接(也就是服务器)发送请求。 前面我们用 Python 实现请求发送之后,可以得到响应结果,但这里请求的发送由 JavaScript 来完成。由于设置了监听,所以当服务器返回响应时,onreadystatechange 对应的方法便会被触发,我们在这个方法里面解析响应内容即可。 58e5081796307d683a296a59d1a9d7c4.png

解析内容

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

渲染网页

JavaScript 有改变网页内容的能力,解析完响应内容之后,就可以调用 JavaScript 针对解析完的内容对网页进行下一步处理。比如,通过
document.getElementById().innerHTML
这样的操作,对某个元素内的源代码进行更改,这样网页显示的内容就改变了,这种对 Document 网页文档进行如更改、删除等操作也被称作 DOM 操作。 上例中
document.getElementById("myDiv").innerHTML=xmlhttp.responseText
这个操作便将 ID 为 myDiv 的节点内部的 HTML 代码更改为服务器返回的内容,这样 myDiv 元素内部便会呈现出服务器返回的新数据,网页的部分内容看上去就更新了。 可以看到,发送请求、解析内容和渲染网页这 3 个步骤其实都是由 JavaScript 完成的。 我们再回想微博的下拉刷新,这其实是 JavaScript 向服务器发送了一个 Ajax 请求,然后获取新的微博数据,将其解析,并将其渲染在网页中的过程。 因此,真实的数据其实都是通过一次次 Ajax 请求得到的,如果想要抓取这些数据,我们需要知道这些请求到底是怎么发送的,发往哪里,发了哪些参数。如果我们知道了这些,不就可以用 Python 模拟这个发送操作,获取到其中的结果了吗? 下期我们接着研究! 哦对了,给刚学习python爬虫的小伙伴准备了2021最新爬虫资料,来看一下

从最简答的html语法到进阶的scrap爬虫框架全都有,全给你!

2e0d5059319594c31a77be2977706944.png

a737e241fd4c7fa5f72a64ab31f6237a.png

d1a218626c9bb2701c0efefbdbcaadde.png

9e90b6d8114c24d72d94731be985b136.png

fe7fe833e67653adf0c92d79d45c0c97.png

417d23a0e7dad99b7ccfdd32add4d4e8.png

22f0d4fa52876360a02521074334af55.png

4aa5a09bc39b442f43d479bc861829b7.png

需要的话公众号回复‘ 爬虫教程 ’即可! 0afea0f551b5ae5cdd6ead32d9851197.png 18a59cc9-9e58-eb11-8da9-e4434bdf6706.svg

点个在看你最好看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值