ajax抓取网页内容(Ajax数据抓取序言(1)|安全:GET传输效率)
优采云 发布时间: 2022-02-01 04:12ajax抓取网页内容(Ajax数据抓取序言(1)|安全:GET传输效率)
Ajax 数据抓取序言
通过前面章节的学习,我们了解了爬虫的工作原理以及一些基础库的使用。有时在使用 requests 库或 urllib 库抓取页面时,您得到的结果可能与您在浏览器中看到的不一样。这是因为某些浏览器页面是通过 JavaScript 处理数据的结果。
这些数据的来源很多,可能是通过 Ajax 加载的,也可能是收录在 HTML 文档中的,也可能是经过 JavaScript 和特殊算法生成的。
对于第一种情况,它是一种异步加载方法。最初的页面不会收录一些数据。原创页面加载完成后,通过JS向服务器发送一个或多个请求获取数据,并将数据呈现在网页上。,这实际上是发送一个 Ajax 请求。
阿贾克斯基础
(1)发送请求
我们知道JavaScript可以实现页面的各种交互功能。Ajax 也不例外,它的底层也是用 JavaScript 实现的。要使用 Ajax 技术,您需要创建一个 XMLHttpRequest 对象。
为网页中某些事件的响应绑定异步操作:通过上面创建的xmlhttp对象传输请求和携带数据。在发出请求之前,首先要定义请求对象的方法,提交给服务器处理的文件,携带什么数据,判断是否异步。
其中,和普通的request请求提交数据一样,这里也有两种方法:GET和POST。在实际使用中,您可以根据自己的需要选择:
1.传输方式:GET通过地址栏传输,POST通过消息传输。
2.传输长度:GET参数有长度限制(受URL长度限制),而POST没有限制。
3.传输效率:对于GET方式,浏览器会将HTTP头和数据一起发送,服务器响应200(返回数据);对于 POST,浏览器先发送 header,服务器响应 100(继续),然后浏览器发送数据,服务器响应 200。所以 GET 比 POST 快。
4.安全:GET传输的数据会显示在地址栏,不安全。(不能用于传输密码等私人信息)。
(2)解析请求
服务器收到请求后,会将附加的参数数据作为输入传递给处理请求的文件,然后文件根据传入的数据进行响应,最后返回结果并通过响应对象发送出去。客户端根据xmlhttp对象获取响应的内容,返回的响应内容可能是HTML或者JSON。接下来,您只需要在方法中使用 JavaScript 进行进一步处理。
(3)渲染页面
JavaScript具有改变网页内容的能力,所以通过Ajax请求得到返回数据后,通过解析,可以调用JavaScript获取指定网页的DOM对象,进行更新、修改等数据处理.
Ajax 有其特殊的请求类型,称为 xhr。
使用Python模拟Ajax请求数据
分析请求
让我们分析一下请求并使用浏览器打开 URL:。
(1)按F12进入开发者工具,选择【网络】选项卡,在条件搜索框中输入“PEK”点击【搜索】按钮,可以看到【网络】下有很多项] 选项卡条目。
(2)然后点击【类型】进行过滤,找到名为“airportCode”的请求点击。
(3)点击后可以看到[header]下面有很多关于请求的详细信息。通过观察发现请求链接RequestURL是"",请求方法Request方法是“POST”,继续拖动滚动条到From Data最下方,可以看到有key和page两个参数,key是输入PEK要查询的三字代码,page是页数。
分析响应结果
选择【预览】选项卡,会出现JSON格式的内容,可以看到有3条信息,一条是code,代表响应状态码是失败还是成功;另一个是data,data就是我们要的内容,里面收录了北京机场的相关信息;三是消息,提示信息。
代码
POST 方法
import requests
import json
url="https://data.variflight.com/analytics/Codeapi/airportCode"
data={
'key':'PEK',
'page': 0
}
res=requests.request("post",url,data=data)
text=res.text
con=json.loads(text)
print(con["data"])
获取方法
import requests
import json
url="https://data.variflight.com/analytics/Codeapi/airportCode"
data="key=PEK&page=0"
res=requests.request("get",url+'?'+data)
text=res.text
con=json.loads(text)
print(con["data"])
请注意,对该请求使用 GET 方法将返回错误,因为 Ajax 请求是使用 POST 方法发出的。