ajax抓取网页内容(Ajax数据抓取序言(1)|安全:GET传输效率)

优采云 发布时间: 2022-02-01 04:12

  ajax抓取网页内容(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 方法发出的。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线