爬虫—Ajax请求的确定

有时候在抓取页面的时候,我们得到的结果和浏览器中看到的的结果是不一样的。在浏览器中可以正常看到的界面,使用requests不能够正确的得到。这是因为requests得到的是原始的html文档,而浏览器的页面则是经过JavaScript处理后生成的数据,这些数据的来源很多,其中有一种是使用Ajax技术加载的。还有另外两种是经过JavaScript和特定算法生成的。以及包含在html文档中的。

对于Ajax方式的数据加载方式,它是一种异步加载的方式,原始页面最初的时候不会包含某些数据。而是在加载完成后,向接口请求新的数据,然后呈现在网页上面。

从发展趋势来看,AJax加载的页面现在是越来越多,因为这样做可以做到前后端分离,减轻服务器的压力。我们直接抓取原始页面是不能得到我们想要的结果的。

1.什么是Ajax

Ajax,全称是异步的JavaScript和xml,不是一门专门的编程语言,而是利用JavaScript在保证页面不被整体刷新的情况下与服务器交换数据并且更新部分网页显示的技术。例如在逛淘宝的时候,我们可以发现在网页下滑时可以看到最新的内容,这个加载的过程就是Ajax加载的过程。发送Ajax请求到网页更新的过程中,简单来说可以分为3步:发送请求,解析内容、渲染页面。

2.Ajax解析方法

2.1查看Ajax请求

要查看请求,需要借助浏览器的开发者工具。例如在360浏览其中打开头条网(https://www.toutiao.com/),按下F12进入开发者模式。如下图所示。

此时的Elements选项中出现的就是网页的源代码,不过这不是我们需要的内容。切换到Network选项,重新刷新网页,可以发现出现了非常多的请求,如下图所示。

2.2过滤Ajax请求

在这个页面中,Ajax拥有特殊的请求类型,叫做XHR。在此页面中选择过滤条件为XHR,此时在页面中显示的都是Ajax请求了。然后在头条的界面中不断滑动页面,在开发者工具中也会实时刷新一条条Ajax请求。

随便点开一条记录,都可以清楚的看到它自身的request 、Headers信息和response信息,此时如果想要模拟Ajax请求,只需要清楚url中各参数的含义就可以了。如下图所示,下图为Ajax请求某一页的信息。

3.Ajax结果提取

3.1 分析请求

打开Ajax的XHR过滤器,然后一直滑动页面加载新的内容,看到开发者工具中不断出现新的请求,选定其中一个请求,查看并且分析它的参数信息,如下图所示。

可以看到,这是一个get类型的请求,请求的真实url为:https://www.toutiao.com/api/pc/feed/?max_behot_time=1547874493&category=__all__&utm_source=toutiao&widen=1&tadrequire=false&as=A1256C54724D52E&cp=5C426D65D26EEE1&_signature=HULjgxAfQQThOwn.Q6we3x1C45。查看其他ajax请求的的真实url,找到这些url之间的规律,就可以批量的获取Ajax请求的数据了。查找规律的事情等以后更新的时候再说。

3.2使用Python爬取数据

import requests,json
url = ‘https://www.toutiao.com/api/pc/feed/?max_behot_time=1547854873&category=__all__&utm_source=toutiao&widen=1&tadrequire=true&as=A1E58C14928D583&cp=5C428D6558C39E1&_signature=HULjgxAfQQThOwn.Q6zGfx1C45‘
header = {‘user-agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘,
          ‘referer: https‘: ‘// www.toutiao.com /‘,
          }
r = requests.get(url,headers = header)
print(r.json())
‘‘‘
解析代码略
‘‘‘

原文地址:https://www.cnblogs.com/wl443587/p/10292150.html

时间: 2024-10-10 17:26:46

爬虫—Ajax请求的确定的相关文章

不使用回调函数的ajax请求实现(async和await简化回调函数嵌套)

在常规的服务器端程序设计中, 比如说爬虫程序, 发送http请求的过程会使整个执行过程阻塞,直到http请求响应完成代码才会继续执行, 以php为例子 $url = "http://www.google.com.hk"; $result = file_get_contents($url); echo $result; 当代码执行到第二行时,程序便陷入了等待,直到请求完成,程序才会继续往下跑将抓取到的html输出.这种做法的好处是代码简洁明了,运行流程清晰, 容易维护. 缺点就是程序的运

Ajax请求传递参数遇到的问题

想写个同类型的,代码未测. 什么是WebAPI?我的理解是WebAPI+JQuery(前端)基本上能完成Web MVC的功能,即:这么理解吧,WebAPI相当于Web MVC的后台部分. 接下来直接上例子吧,都是我在学习过程中遇到或者发现的一些问题.  一.创建WebAPI项目 (这个环节不是本章重点) 二.传递参数遇到的问题 后台实体类(Person): 1 namespace WebApi.Models 2 { 3 public class Person 4 { 5 6 public int

如何拦截或修改原生ajax请求

jQuery已经实现了各种 ajax 事件,如 beforeSend 等,但原生的 XMLHttpRequest 并没有这种事件.在没有用 jQuery的情况下,如果想修改 ajax 请求,得做一些特殊的处理.以下是我处理的方法: XMLHttpRequest.prototype._open = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url, async) {     // 

springMVC 解决ajax请求的406错误

直入主题-- 页面表单异步提交:$.post('<%=request.getContextPath()%>/web/register.html', $(form).serialize(), function(data){...}); java后台springMVC的controller接受请求: @RequestMapping("register") @ResponseBody public Map<String, String> register(HttpSe

JQuery ajax请求一直返回Error(parsererror)

项目中common.js中有一段ajax异常处理方法: $(document).ajaxComplete(function(event,xhr,options) { if (xhr.statusText=="parsererror") { top.location.href="/admin"; } }); 有一个异常页面的ajax请求如下: $.ajax({ type :"post", url :"XXXXXXXXXXXXXXXXXXX

ajax请求不能下载文件(转载)

最近在做文件下载,后台写了个控制层,直接走进去应该就可以下载文件,各种文件图片,excel等 但是起初老是下载失败,并且弹出下面的乱码: 前台请求代码: [html] view plain copy $('#fileexcel').unbind('click').bind('click',function(){ alert("我要下载了"); $.ajax({ type:'post', url:'media', data:null, async:true, success : func

论如何把JS踩在脚下 —— JQuery基础及Ajax请求详解

一.什么是JQuery? JQuery是一种JavaScript框架,是一堆大神搞出来的能够让前端程序猿敲更少代码.实现更多功能的工具(在此,跪谢各位JQuery开发大大们!!!).JQuery的使用给优化HTML文档操作.事件处理.动画设计和Ajax交互提供了巨大的便利.而且,其特有的链式语法也较与JS更为清晰. 二.JQuery入门 想要使用JQuery框架,就必须在html文档中导入JQuery插件,导入方式和日常导入外部JS文件的方式是相同的.但要注意,在同一html文档中插入多个外部J

Shiro Ajax请求没有权限返回JSON,没有登录返回JSON

本文基于Shiro权限注解方式来控制Controller方法是否能够访问. 例如使用到注解: @RequiresPermissions 来控制是否有对应权限才可以访问 @RequiresUser 来控制是否存在用户登录状态才可以访问 想了解Shiro是如何通过注解来控制权限的,可以查看源码 AopAllianceAnnotationsAuthorizingMethodInterceptor ,其构造方法中添加了几个对应的权限注解方法拦截器(这里不做详细阐述). 用户在请求使用这些注解方式控制的方

ajax请求

后端视图函数: def test_ajax(request): import json ret = {"status":True,"error":None,"data":None} #让请求永远返回一个字典形式 try: h = request.POST.get('hostname') i = request.POST.get('ip') p = request.POST.get('port') b = request.POST.get('b_i