您的位置 首页 > 数码极客

‘如何用ajax获取本地数据’如何使用ajax从服务器获取数据!

ajax

1 ajax的定义

关于ajax的详细介绍请读者自行百度或者参考中的“ajax”一节。

简单的来说,ajax请求返回的是一串组织好的数据。浏览器会在符合条件(js脚本)的情况下发送一系列符合条件的链接,来向服务器请求更新一组数据。服务器发送数据后,浏览器直接在当前页面改写DOM,达到不跳转链接进行更新的目的。

2 为什么要爬取ajax请求

很多网站利用ajax对页面进行美化处理,同时也能节省服务器的带宽。

有时候我们需要在资讯网站上爬取较多信息,而这些信息正常情况下需要用户不断在浏览器界面做出动作(大多数情况下这个动作是下拉滚动条)才能加载。如果使用selenium等无界面浏览器爬取则太耗时间,使用常规爬虫库则无法对爬取下来的html页面做出动作(也就是激活js)。所以我们需要绕过动作,直接对ajax请求进行爬取,达到快速准确获取数据的目的(事实上,ajax请求返回的数据一般都十分易读,因为没有html的干扰,但也不排除存在直接返回一段html的网站,比如百度贴吧)。

通过ajax请求绕过浏览器操作

本节我们以微博为例。

1 获取ajax链接

我们可以用两种方式获取ajax链接:第一种是分析原页面的script文件找到发送ajax请求的代码;第二种是直接通过工具截取网页发送的ajax请求url,分析其规律并仿写。

其中,分析script脚本是十分不推荐采取的方法,因为网站开发者通常会将js脚本写成十分不友好的形式(请想象一堆var abcdefg出现在你面前,js甚至不用声明变量类型)。但在穷途末路或者爬取者本身有兴趣的情况下也不是不能一试。

第二种方法中的工具可以用浏览器自带的开发者工具(F12),当然想用Fiddler等也不是不可以,重要的是结果不是过程。在待爬取页面按下F12键打开开发者工具,然后点击标签“Network”,将浏览的类别调整到“XHR”(XMLHTTPRequest,这是ajax专有的数据格式):

不断下拉滚动条,会发现XHR区域多了很多内容。观察可以得知它们是一系列GET请求,且其请求参数为ajwvr、category、page、lefnav、cursor、rnd。变动的参数为:page,其每次请求+1,推测为请求页数;rnd,可知其为请求发出的时间戳。

2 解析ajax返回的json数据

json全称JavaScript Object Notation,是一种数据格式。大多数情况下,你可以将json数据看做字典。

浏览器向服务器发送ajax请求后,服务器会返回一组json数据,浏览器根据此json更新页面。在绕过浏览器直接发送ajax请求时,服务器返回的json数据自然也由我们自行解析。

在已经拿到ajax请求的浏览器开发者工具下,双击ajax请求连接,在展开的窗口中选择Response,可以看到微博服务器端返回的json数据:

其具体的json返回形式如下,其中data为其返回的html文本:

{"code":"100000","msg":"","data":" <!--\u699c\u5355\u680f\u4f4d\u7f6e-->\n <div…(略)"}

可知我们需要的数据在data键内,其为html文本段。

实例:使用request爬取微博首页的下拉滚动条更新内容

import requests import time import datetime page=2 #分析得知ajax请求的page从2开始(因为page1在打开页面的时候就已经加载到文档里) lefnav=0 category=0 ajwvr=6 cursor="" #其余的参数,其意义可以忽略 url="https://weibo.com/a/aj/transform/loadingmoreunlogin?" #通过分析之前浏览器发出的ajax请求,可得知微博使用的时间戳为毫秒级时间戳 def getrnd(): return round()*1000) def geturl(): global page #我们要修改page,就要声明为全局变量 page=page+1 return url+"ajwvr="+str(ajwvr)+"&category="+str(category)+"&page"+str(page-1)+"&cursor="+cursor+"&_rnd="+str(getrnd()) response=reque(geturl()) prin)

当然,此处的ajax请求采取了GET的方式,但也有采取POST方式并且要求携带cookie的ajax请求。对于这种情况可以采用设置POST字典的方式。在真正的情况中也会有很多猜不出ajax请求参数的情况,这就需要读者因地制宜随机应变了。但ajax请求的精髓已经被我们讲解过了,无论有多少分支,都不过万变不离其宗耳。

扩展

是我的一家之见,若有疏漏还请一笑而过。

其实除了ajax,网页上几乎所有的页面都可以通过找到url->分析参数->伪装请求的方式来爬取。比如说搜索框的操作可以通过向搜索框跳转的链接发送请求来模拟,按钮按下可以通过向按钮绑定的链接发送请求来模拟。这是因为互联网的本质是数据与地址的组合,无论它们有多么华丽,终究也不过是一堆数据。发送请求的主动权在我们手上,只要分析手头的数据,可以说没有什么请求是伪装不了的(当然,我是指你本人使用浏览器可以做出的请求)。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何用ajax获取本地数据,如何使用ajax从服务器获取数据,如何用ajax获取数据库数据,ajax获取后端数据,ajax获取数据库数据,ajax获取json数”边界阅读