关于python爬取异步ajax数据的一些见解
我们在利用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 = "<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></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数据的一些见解的更多相关文章
- 利用Python爬取朋友圈数据,爬到你开始怀疑人生
人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...
- Python爬取招聘网站数据,给学习、求职一点参考
1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大.因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于 ...
- python爬取股票最新数据并用excel绘制树状图
大家好,最近大A的白马股们简直 跌妈不认,作为重仓了抱团白马股基金的养鸡少年,每日那是一个以泪洗面啊. 不过从金融界最近一个交易日的大盘云图来看,其实很多中小股还是红色滴,绿的都是白马股们. 以下截图 ...
- 如何使用python爬取网页动态数据
我们在使用python爬取网页数据的时候,会遇到页面的数据是通过js脚本动态加载的情况,这时候我们就得模拟接口请求信息,根据接口返回结果来获取我们想要的数据. 以某电影网站为例:我们要获取到电影名称以 ...
- Python 爬取异步加载的数据
在我们的工作中,可能会遇到这样的情况:我们需要爬取的数据是通过ajax异步加载的,这样的话通过requests得到的只是一个静态页面,而我们需要的是ajax动态加载的数据! 那我们应该怎么办呢??? ...
- python爬取拉勾网职位数据
今天写的这篇文章是关于python爬虫简单的一个使用,选取的爬取对象是著名的招聘网站--拉钩网,由于和大家的职业息息相关,所以爬取拉钩的数据进行分析,对于职业规划和求职时的信息提供有很大的帮助. 完成 ...
- python 爬取网页简单数据---以及详细解释用法
一.准备工作(找到所需网站,获取请求头,并用到请求头) 找到所需爬取的网站(这里举拉勾网的一些静态数据的获取)----------- https://www.lagou.com/zhaopin/Pyt ...
- python爬取动态网页数据,详解
原理:动态网页,即用js代码实现动态加载数据,就是可以根据用户的行为,自动访问服务器请求数据,重点就是:请求数据,那么怎么用python获取这个数据了? 浏览器请求数据方式:浏览器向服务器的api(例 ...
- python爬取招聘网站数据
# -*- coding: utf-8 -*- # 爬虫分析 from bs4 import BeautifulSoup from lxml import etree from selenium im ...
随机推荐
- LaTeX常用符号(持续更新)
参考网址:https://qianwenma.cn/2018/05/17/mathjax-yu-fa-can-kao/# 基本运算 1.乘法$x\times y$ x\times y 2.乘法$x^{ ...
- 事务的特性ACID、隔离级别
1.事务特性ACID 1.1 事务的四大特性 1.原子性(Atomicity) 事务包装的一组sql,要么都执行成功,要么都失败.这些操作是不可分割的. 2.一致性(Consistency) 数据库的 ...
- 绕过PowerShell执行策略方法总结
默认情况下,PowerShell配置为阻止Windows系统上执行PowerShell脚本.对于渗透测试人员,系统管理员和开发人员而言,这可能是一个障碍,但并非必须如此. 什么是PowerShell执 ...
- 学习oracle的SQL语句 练习
--1.查询emp表,显示薪水大于2000,且工作类别是MANAGER的雇员信息 select * from emp where sal > 2000and job = 'MANAGER'; - ...
- 入门大数据---Spark_Streaming整合Kafka
一.版本说明 Spark 针对 Kafka 的不同版本,提供了两套整合方案:spark-streaming-kafka-0-8 和 spark-streaming-kafka-0-10,其主要区别如下 ...
- Validate日期校验
public class Validate { private static Regex RegNumber = new Regex("^[0-9]+$"); private st ...
- .NET Core 选项模式【Options】的使用
ASP.NET Core引入了Options模式,使用类来表示相关的设置组.简单的来说,就是用强类型的类来表达配置项,这带来了很多好处.利用了系统的依赖注入,并且还可以利用配置系统.它使我们可以采用依 ...
- Oracle 11g各种服务作用以及哪些需要开启
Windwos server 2012 R2上成功安装Oracle 11g后共有7个服务,如果全局数据库名为orcl,则Oracle服务分别为 Oracle ORCL VSSWriter Servic ...
- C#操作SharePoint文档库文档
using (Stream file = spFile.OpenBinaryStream()) { //其余代码 }
- 【Oracle】arraysize的研究(存在疑问)
arraysize的研究(存在疑问) SYS@proc> create table aaa (id1 int,id2 int,id3 int,id4 int); Table created. S ...