我们在利用python进行爬取数据的时候,一定会遇到这样的情况,在浏览器中打开能开到所有数据,但是利用requests去爬取源码得到的却是没有数据的页面框架。

出现这样情况,是因为别人网页使用了ajax异步加载,你的requests得到的只是页面框架而已。

遇到这样的情况有几种方法可以解决:

  1、分析(f12)network中的响应,从而获得ajax的请求接口,在通过这些接口去获得数据。

  2、使用selenium这个网页自动化测试工具,去获得源码。因为这个工具是等到页面加载完成采取获取的整个页面的代码,所以理论上是可以获得页面完整数据的。

我自己测试过一个页面,也是获取了完整数据的。有需要的朋友可以去自己测试。

下面,我们针对第二种方法,做一个实验:本地新建一个json.html前端文件和json.php后端脚本。web服务器我们使用apache(集成环境xampp)。

json.php

<?php

    header('Access-Control-Allow-Origin:*'); //代表允许任何网址请求

    $arr = array(
'testarr' => array(
'name' => 'panchao',
'age' => 18,
'tel' => '15928838350',
'addr' => 'test'
)
); echo json_encode($arr); ?>

json.html

<div id='test'>
test
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
function easyAjax(requestUrl){
$.ajax({
url: requestUrl,
type: "GET",
dataType: "json",
success: function(msg){
var a = "<span>"+msg.testarr.name+"</span>";
//动态的向页面中加入html元素
$("#test").append(a);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
}); }
easyAjax("http://localhost:8080/json/json.php")
</script>

然后我们分别用python的request和selenium(webdriver.Chrome)来做实验。

request

import requests
r = requests.get("http://localhost:8080/json/json.html")
r.encoding = 'utf-8'
print(r.text)

selenium(webdriver.Chrome)至于selenium怎么使用我前面的文章中有提到

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(executable_path=(r'C:\Users\0923\AppData\Local\Google\Chrome\Application\chromedriver.exe'), options=chrome_options)
base_url = "http://localhost:8080/json/json.html"
driver.get(base_url)
print(driver.page_source)

我们来看结果:

第一种,利用python request请求的方法得到的页面数据为:

<div id='test'>
test
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
function easyAjax(requestUrl){
$.ajax({ url: requestUrl,
type: "GET",
//async : false,
dataType: "json", success: function(msg){ var a = "<span>"+msg.testarr.name+"</span>"; console.log(msg);
$("#test").append(a);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
}); }
easyAjax("http://localhost:8080/json/json.php")
</script>

第二种,利用selenium(webdriver.Chrome)方法得到的页面数据为:

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><div id="test">
test
<span>panchao</span></div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
function easyAjax(requestUrl){
$.ajax({ url: requestUrl,
type: "GET",
//async : false,
dataType: "json", success: function(msg){ var a = "&lt;span&gt;"+msg.testarr.name+"&lt;/span&gt;"; console.log(msg);
$("#test").append(a);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
}); }
easyAjax("http://localhost:8080/json/json.php")
</script></body></html>

我们可以看到以上两种结果,最主要的差异就是第二种方法(selenium(webdriver.Chrome))得到的web代码中包含了ajax异步加载的数据。

<div id="test">
test
<span>panchao</span></div>

而第一种方法(python request)得到的web代码中没有包含ajax异步加载的数据。

<div id='test'>
test
</div>

根据以上结论,证明利用selenium(webdriver.Chrome)来获取页面数据,是可以获取到javascript脚本加载的数据的。

不知道大家有没有注意到利用selenium(webdriver.Chrome)来获取页面数据的方法还自动的给我们不全了html的标签

希望可以帮助到有需要的人。

关于python爬取异步ajax数据的一些见解的更多相关文章

  1. 利用Python爬取朋友圈数据,爬到你开始怀疑人生

    人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...

  2. Python爬取招聘网站数据,给学习、求职一点参考

    1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大.因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于 ...

  3. python爬取股票最新数据并用excel绘制树状图

    大家好,最近大A的白马股们简直 跌妈不认,作为重仓了抱团白马股基金的养鸡少年,每日那是一个以泪洗面啊. 不过从金融界最近一个交易日的大盘云图来看,其实很多中小股还是红色滴,绿的都是白马股们. 以下截图 ...

  4. 如何使用python爬取网页动态数据

    我们在使用python爬取网页数据的时候,会遇到页面的数据是通过js脚本动态加载的情况,这时候我们就得模拟接口请求信息,根据接口返回结果来获取我们想要的数据. 以某电影网站为例:我们要获取到电影名称以 ...

  5. Python 爬取异步加载的数据

    在我们的工作中,可能会遇到这样的情况:我们需要爬取的数据是通过ajax异步加载的,这样的话通过requests得到的只是一个静态页面,而我们需要的是ajax动态加载的数据! 那我们应该怎么办呢??? ...

  6. python爬取拉勾网职位数据

    今天写的这篇文章是关于python爬虫简单的一个使用,选取的爬取对象是著名的招聘网站--拉钩网,由于和大家的职业息息相关,所以爬取拉钩的数据进行分析,对于职业规划和求职时的信息提供有很大的帮助. 完成 ...

  7. python 爬取网页简单数据---以及详细解释用法

    一.准备工作(找到所需网站,获取请求头,并用到请求头) 找到所需爬取的网站(这里举拉勾网的一些静态数据的获取)----------- https://www.lagou.com/zhaopin/Pyt ...

  8. python爬取动态网页数据,详解

    原理:动态网页,即用js代码实现动态加载数据,就是可以根据用户的行为,自动访问服务器请求数据,重点就是:请求数据,那么怎么用python获取这个数据了? 浏览器请求数据方式:浏览器向服务器的api(例 ...

  9. python爬取招聘网站数据

    # -*- coding: utf-8 -*- # 爬虫分析 from bs4 import BeautifulSoup from lxml import etree from selenium im ...

随机推荐

  1. C# 加密、解密PDF文档(基于Spire.Cloud.SDK for .NET)

    Spire.Cloud.SDK for .NET提供了接口PdfSecurityApi可用于加密.解密PDF文档.本文将通过C#代码演示具体加密及解密方法. 使用工具: Spire.Cloud.SDK ...

  2. 找到了两个联想的OEM XP镜像文件

    今天在收拾移动硬盘的时候发现了两个XP镜像 还都是联想的,一个有OOBE,另一个无OOBE,全传网盘里了,需要的自取 有个疑问 2020年还有多少家庭电脑和ATM机器还在用XP??? link:htt ...

  3. 本地代码提交到远程仓库(git)

    [准备环境] 我没有在Linux搭建gitlab私有云服务器,用的是开源的 gitee托管平台 1.在gitee注册账号 2.本地下载git客户端 [步骤] 1  本地新建1个文件夹  进入文件夹后 ...

  4. 【vue】axios二次封装,更好的管理api接口和使用

    在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧.而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios二次封装区别不 ...

  5. 基于领域驱动设计(DDD)超轻量级快速开发架构

    smartadmin.core.urf 这个项目是基于asp.net core 3.1(最新)基础上参照领域驱动设计(DDD)的理念,并参考目前最为了流行的abp架构开发的一套轻量级的快速开发web ...

  6. 并发编程,python的进程,与线程

    并发编程 操作系统发展史 基于单核研究 多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 切换+保存状态 例子:洗衣 烧水 做饭 切换 1.程序遇到IO操作系统会立刻剥夺走CP ...

  7. 在采用K8S之前您必须了解的5件事情

    作者简介 Christopher Tozzi,自2008年来以自由职业者的身份对Linux.虚拟化.容器.数据存储及其相关主题进行报道. 时至今日,Kubernetes已然成为风靡一时的容器编排调度工 ...

  8. 新版MySQL开始使用时遇到的问题(时区、权限):

    新版MySQL(本人Server version: 8.0.15)在刚开始使用时遇到的问题: 查看mysql安装版本:命令窗口 时区问题解决(The server time zone value 'Ö ...

  9. 【neo4j】文件管理路径、数据备份、创建新数据库、导入数据等操作记录

    neo4j一般的配置路径如下 一.备份数据 使用neo4j-admin命令. 首先,先找到数据的存储路径,然后关闭数据库. 关闭数据库的语句如下: #切换到/bin目录下 ./neo4j stop 然 ...

  10. Python实用笔记 (22)面向对象编程——实例属性和类属性

    由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(se ...