当前位置: 首页 > news >正文

Ajax数据爬取

有时我们用requests 抓取页面得到的结果,可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档,而浏览器中的页面是JavaScript 处理数据后生成的结果,这些数据有多种来源:可能是通过 Ajax 加载的,可能是包含在 HTML文档中的,也可能是经过 JavaScript 和特定算法计算后生成的。

对于第一种来源,数据加载是一种异步加载方式,原始页面最初不会包含某些数据,当原始页面加载完后,会再向服务器请求某个接口获取数据,然后数据才会经过处理从而呈现在网页上,这其实是发送了一个 Ajax 请求。

按照 Web 的发展趋势来看,这种形式的页面越来越多。甚至网页的原始 HTML 文档不会包含任何数据,数据都是通过 Ajax 统一加载后呈现出来的,这样使得 Web 开发可以做到前后端分离,减小服务器直接渲染页面带来的压力。

所以如果遇到这样的页面,直接利用requests等库来抓取原始 HTML文档,是无法获取有效数据的,这时需要分析网页后台向接口发送的 Aiax 请求。如果可以用 requests 模拟 Aiax 请求,就可以成功抓取页面数据了。

所以,本章我们的主要目的是了解什么是 Ajax,以及如何分析和抓取 Ajax 请求。

什么是Ajax

Ajax,全称为 Asynchronous JavaScript and XML,即异步的 JavaScript 和 XML。它不是一门编程语言,而是利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页内容的技术。

对于传统的网页,如果想更新其内容,就必须刷新整个页面,但有了Aiax,可以在页面不被全部刷新的情况下更新。这个过程实际上是页面在后台与服务器进行了数据交互,获取数据之后,再利用JavaScript 改变网页,这样网页内容就会更新了。

可以到 W3School上体验几个实例感受一下:https://www.w3school.com.cn/js/js_ajax_http_send.asp

  1. 实例引入

浏览网页的时候,我们会发现很多网页都有“下滑查看更多”的选项。拿微博来说,可以登录https://m.weibo.cn/为例,一直下滑,可以发现下滑几条微博之后,再向下就没有了,转而会出现一个加载的动画,不一会儿下方就继续出现了新的微博内容,这个过程其实就是 Ajax 加载的过程,如下图所示。

在这里插入图片描述
能够看出,页面其实并没有整个刷新这意味着页面的链接没有变化,但是网页中却多了新内容,也就是后面刷出来的新微博。这就是通过 Ajax 获取新数据并呈现的过程。

  1. 基本原理

初步了解了 Ajax之后,我们接下来详细了解它的基本原理。从发送 Aiax 请求到网页更新的这个过程可以简单分为以下3步–发送请求、解析内容、渲染网页。下面分别详细介绍一下这几个过程。

  • 发送请求

我们知道JavaScript可以实现页面的各种交互功能,Ajax也不例外,它也是由JavaScript实现的,实现代码如下:

var xmlhttp;if(window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();
}else{//code for IE6、 IE5xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange-function(){if(xmlhttp.readyState==4&&xmlhttp.status==200{document.getElementById("myDiv").innerHTML=xmlhttp.responseText;}
}
xmlhttp.open("POST","/ajax/",true);
xmlhttp.send();

这是 JavaScript 对 Ajax 最底层的实现,实际上就是先新建一个 XMLHttpRequest 对象 xmlhttp,然后调用 onreadvstatechange属性设置监听,最后调用 open和 send方法向某个链接(也就是服务器)发送请求。前面用 Python 实现请求发送之后,可以得到响应结果,但这里的请求发送由 JavaScript 完成。由于设置了监听,所以当服务器返回响应时,onreadystatechange 对应的方法便会被触发,然后在这个方法里面解析响应内容即可。

  • 解析内容

服务器返回响应之后,onreadystatechange 属性对应的方法就被触发了,此时利用 xmlhttp 的responseText属性便可得到响应内容。这类似于Python 中利用requests 向服务器发起请求,然后得到响应的过程。返回内容可能是 HTML,可能是 JSON,接下来只需要在方法中用 JavaScript 进一步处理即可。如果是 JSON 的话,可以进行解析和转化。

  • 渲染网页

JavaScript有改变网页内容的能力,因此解析完响应内容之后,就可以调用JavaScript 来基于解析完的内容对网页进行下一步处理了。例如,通过 document.getElementBvId().innerHTML操作,可以更改某个元素内的源代码,这样网页显示的内容就改变了。这种操作也被称作 DOM 操作,即对网页文档进行操作,如更改、删除等。

上面“发送请求”部分,代码里的 document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText便是将 ID 为 myDiv 的节点内部的 HTML 代码更改为了服务器返回的内容,这样 myDiv 元素内部便会呈现服务器返回的新数据,对应的网页内容看上去就更新了。

我们观察到,网页更新的3个步骤其实都是由 JavaScript 完成的,它完成了整个请求、解析和渲染的过程。

再回想微博的下拉刷新,其实就是 JavaScript 向服务器发送了一个 Ajax 请求,然后获取新的微博数据,对其做解析,并渲染在网页中。

因此我们知道,真实的网页数据其实是一次次向服务器发送 Ajax 请求得到的,要想抓取这些数据,需要知道 Ajax 请求到底是怎么发送的、发往哪里、发了哪些参数。我们知道这些以后,不就可以用 Python 模拟发送操作,并获取返回数据了吗?

Ajax分析方法

这里还以之前的微博为例,我们知道下拉刷新的网页内容由 Aiax 加载而得,而且页面的链接没有发生变化,那么应该到哪里去查看这些Ajax请求呢?

  1. 分析案例
    此处还需要借助浏览器的开发者工具,下面以Chrome浏览器为例来介绍。

首先,用 Chrome 浏览器打开微博链接 https://m.weibo.cn可以登录自己的微博,然后在页面中单击鼠标右键,从弹出的快捷菜单中选择“检查”选项,此时便会弹出开发者工具,如下图所示。

在这里插入图片描述
前面也提到过,这里展示的就是页面加载过程中,浏览器与服务器之间发送请求和接收响应的所有记录。

事实上,Ajax有其特殊的请求类型,叫作xhr。在下图中,我们可以发现一个名称以 getindex 开头的请求,其 Type 就为 xhr,意味着这就是一个 Ajax 请求。用鼠标单击这个请求,可以查看其详细信息。
在这里插入图片描述

从上图的右侧可以观察这个 Ajax 请求的 Request Headers、URL和 Response Headers 等信息。其中 Request Headers 中有一个信息为 X-Requested-With:XMLHttpRequest,这就标记了此请求是 Ajax 请求,如下图所示。
在这里插入图片描述
随后单击一下 Preview,就能看到响应的内容,如下图所示。这些内容是 JSON 格式的,这里Chrome为我们自动做了解析,单击左侧箭头即可展开和收起相应内容。
在这里插入图片描述
JavaScript接收到这些数据之后,再执行相应的渲染方法,整个页面就渲染出来了。

另外,也可以切换到 Response 选项卡,从中观察真实的返回数据,如下图所示:
在这里插入图片描述
接下来,切回第一个请求,观察一下它的 Response 是什么,如下图所示。

在这里插入图片描述

这是最原始的链接返回的结果,其代码只有不到 50 行,结构也非常简单,只是执行了一些 JavaScript 语句。

所以说,微博页面呈现给我们的真实数据并不是最原始的页面返回的,而是执行JavaScript 后再次向后台发送 Ajax请求,浏览器拿到服务器返回的数据后进一步渲染得到的。

  1. 过滤请求

利用 Chrome 开发者工具的筛选功能能够筛选出所有 Ajax请求。在请求的上方有一层筛选栏,直接单击 XHR,之后下方显示的所有请求便都是 Ajax 请求了,如下图所示。

在这里插入图片描述
接下来,不断向上滑动微博页面,可以看到页面底部有一条条新的微博被刷出,开发者工具下方也出现了一个个新的 Ajax 请求,这样我们就可以捕获所有的 Ajax 请求了。

随意点开其中一个条目,都可以清楚地看到其Request URL、Request Headers、Response Headers、Response Body 等内容,此时想要模拟 Ajax 请求的发送和数据的提取就非常简单了。

下图展示的内容便是我的某一页微博的列表信息

在这里插入图片描述

到现在为止,我们已经可以得到 Aiax 请求的详细信息了,接下来只需要用程序模拟这些 Ajax 请求,就可以轻松提取我们所需的信息。

Ajax分析与爬虫实战

本节我们会结合一个实际的案例,来看一下 Ajax 分析和爬取页面的具体实现。

  1. 准备工作

开始分析之前,需要做好如下准备工作。

  • 安装好 Python 3(最低为 3.6 版本 ),并成功运行 Python 3 程序。
    -了解 Python HTTP 请求库 requests 的基本用法。
  • 了解 Ajax 基础知识和分析 Ajax 的基本方法。

以上内容在前面的博客中均有讲解,如尚未准备好,建议先熟悉一下这些内容。

  1. 爬取目标

本节我们以一个示例网站来试验一下 Ajax的爬取,其链接为:https://spa1.scrape.center/,该示例网站的数据请求是通过 Ajax完成的,页面的内容是通过JavaScript 渲染出来的,页面如下图所示。
在这里插入图片描述

此时我们需要爬取的数据,包括电影的名称、封面、类别、上映日期、评分剧情简介等信息。
本节我们需要完成的目标如下

  • 分析页面数据的加载逻辑。
  • 用 requests 实现 Ajax 数据的爬取。
  • 将每部电影的数据分别保存到 MongoDB 数据库。
    由于本节主要讲解 Ajax,所以数据存储和加速部分就不再展开详细实现了,主要是讲解 Ajax 分析和爬取的实现。
    好,现在就开始吧。
  1. 初步探索

我们先尝试用之前的 requests 直接提取页面,看看会得到怎样的结果。用最简单的代码实现一下requests 获取网站首页源码的过程,代码如下:

import requestsurl = 'https://spa1.scrape.center/'
html = requests.get(url).text
print(html)

运行结果如下:

<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible 
content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1">
<link rel=icon href=/favicon.ico><title>Scrape | Movie</title><link href=/css/chunk-
700f70e1.1126d090.css rel=prefetch><link href=/css/chunk-d1db5eda.0ff76b36.cssrel=prefetch><link href=/js/chunk-700f70e1.0548e2b4.js rel=prefetch><linkhref=/js/chunk-d1db5eda.b564504d.js rel=prefetch><link href=/css/app.ea9d802a.cssrel=preload as=style><link href=/js/app.17b3aaa5.js rel=preload as=script><linkhref=/js/chunk-vendors.683ca77c.js rel=preload as=script><linkhref=/css/app.ea9d802a.css rel=stylesheet></head><body><noscript><strong>We'resorry but portal doesn't work properly without JavaScript enabled. Please enableit to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.683ca77c.js></script><script src=/js/app.17b3aaa5.js></script></body></html>

可以看到,爬取结果就只有这么一点HTML内容,而我们在浏览器中打开这个网站,却能看到如下图所示的页面。
在这里插入图片描述
在 HTML中,我们只能看到源码引用的一些JavaScript和CSS 文件,并没有观察到任何电影数据信息。

遇到这样的情况,说明我们看到的整个页面都是JavaScript渲染得到的,浏览器执行了HTML中引用的 JavaScript 文件,JavaScript 通过调用一些数据加载和页面渲染方法,才最终呈现了上图展示的结果。这些电影数据一般是通过 Aiax加载的,JavaScript在后台调用 Aiax数据接口,得到数据之后,再对数据进行解析并渲染呈现出来,得到最终的页面。所以要想爬取这个页面,直接爬取 Ajax 接口,再获取数据就好了

上面我们已经了解了 Ajax 分析的基本方法,下面一起分析一下 Ajax 接口的逻辑并实现数据爬取吧。

  1. 爬取列表页

首先分析列表页的 Ajax 接口逻辑,打开浏览器开发者工具,切换到Network面板,勾选 PreserveLog 并切换到 XHR 选项卡,如下图所示。
在这里插入图片描述

接着重新刷新页面,再单击第2页、第3页、第4页的按钮,这时可以观察到不仅页面上的数据发生了变化,开发者工具下方也监听到了几个 Ajax 请求,如下图所示。
在这里插入图片描述

我们切换了4页,每次翻页也出现了对应的 Aiax 请求。可以点击査看其请求详情,观察请求 URL、参数和响应内容是怎样的,如下图所示。

在这里插入图片描述
这里我点开了最后一个结果,观察到其Ajax接口的请求 URL为 https://spa1.scrape.center/api/movie?limit=10&ofset=40,这里有两个参数:一个是limit,这里是10;一个是 offset,这里是 40。

观察多个 Ajax 接口的参数,我们可以总结出这么一个规律:limit 一直为10,正好对应每页 10条数据;offset 在依次变大,页数每加1,offset 就加10,因此其代表页面的数据偏移量。例如第2页的 offset 为 10 就代表跳过 10 条数据,返回从 11 条数据开始的内容,再加上 limit 的限制,最终页面呈现的就是第 11条至第 20 条数据。

接着我们再观察一下响应内容,切换到Preview 选项卡,结果如下图所示。

在这里插入图片描述
可以看到,结果就是一些 JSON 数据,其中有一个 results 字段,是一个列表,列表中每一个元素都是一个字典。观察一下字典的内容,里面正好可以看到对应电影数据的字段,如 name、alias、cover、categories。对比一下浏览器页面中的真实数据,会发现各项内容完全一致,而且这些数据已经非常结构化了,完全就是我们想要爬取的数据,真的是得来全不费工夫。

这样的话,我们只需要构造出所有页面的 Ajax接口,就可以轻松获取所有列表页的数据了先定义一些准备工作,导人一些所需的库并定义一些配置,代码如下:

import requests
import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s-%(levelname)s:%(message)s')
INDEX_URl = 'https://spa1.scrape.center/api/movie/?limit={limit}&offset-{offset}'

这里我们引人了 requests 和 logging 库,并定义了 logging 的基本配置。接着定义了 INDEX URL,这里把 limit 和 offset 预留出来变成占位符,可以动态传人参数构造一个完整的列表页 URL。

下面我们实现一下详情页的爬取。还是和原来一样,我们先定义一个通用的爬取方法,其代码如下:

def scrape_api(url):logging.info('scraping %s...', url)try:response = requests.get(url)if response.status_code == 200:return response.json()logging.error('get invalid status code %s while scraping %s', response.status_code, url)except requests.RequestException:logging.error('error occurred while scraping %s', url, exc_info=True)

这里我们定义了一个 scrape api方法,和之前不同的是,这个方法专门用来处理 JSON接口。最后的 response 调用的是 json 方法,它可以解析响应内容并将其转化成 JSON 字符串。

接着在这个基础之上,定义一个爬取列表页的方法,其代码如下:

def scrape_index(page):url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))return scrape_api(url)

这里我们定义了一个 scrape index方法,它接收一个参数 page,该参数代表列表页的页码。scrape_index方法中,先构造了一个url,通过字符串的 format方法,传入 limit 和 offset 的值。这里 limit 就直接使用了全局变量 LIMIT 的值;offset 则是动态计算的,计算方法是页码数减一再乘以 limit,例如第1页的 offset 就是0,第2页的 offset 就是 10,以此类推。构造好 url后,直接调用 scrape_api 方法并返回结果即可。

这样我们就完成了列表页的爬取,每次发送 Ajax请求都会得到 10部电影的数据信息。

由于这时爬取到的数据已经是 JSON 类型了,所以无须像之前那样去解析 HTML 代码来提取数爬到的数据已经是我们想要的结构化数据,因此解析这一步可以直接省略啦。

到此为止,我们能成功爬取列表页并提取电影列表信息了。

  1. 爬取详情页

虽然我们已经可以拿到每一页的电影数据,但是这些数据实际上还缺少一些我们想要的信息,如剧情简介等信息,所以需要进一步进入详情页来获取这些内容。

单击任意一部电影,如《教父》,进入其详情页,可以发现此时的页面 URL已经变成了 https://spa1scrape.center/detail/40,页面也成功展示了《教父》详情页的信息,如下图所示。
在这里插入图片描述
另外,我们也可以观察到开发者工具中又出现了一个 Ajax请求,其 URL为 https://spa1.scrape.
center/api/movie/40/,通过 Preview 选项卡也能看到 Ajax 请求对应的响应信息,如下图所示。
在这里插入图片描述
稍加观察就可以发现,Ajax 请求的 URL后面有一个参数是可变的,这个参数是电影的id,这里是 40,对应《教父》这部电影。

如果我们想要获取 id为 50的电影,只需要把 URL最后的参数改成 50 即可,即 https://spa1.scrape.
center/api/movie/50/,请求这个新的 URL便能获取 id 为 50 的电影对应的数据了。

同样,响应结果也是结构化的JSON 数据,其字段也非常规整,我们直接爬取即可。

现在,详情页的数据提取逻辑分析完了,怎么和列表页关联起来呢?电影 id从哪里来呢?我们回过头看看列表页的接口返回数据,如下图所示。

在这里插入图片描述
可以看到,列表页原本的返回数据中就带有id这个字段,所以只需要拿列表页结果中的 id 来构造详情页的 Aiax 请求的 URL 就好了。

接着,我们就先定义一个详情页的爬取逻辑,代码如下:

DETAIL_URL = 'https://spa1.scrape.center/api/movie/{id}'def scrape_detail(id):url = DETAIL_URL.format(id=id)return scrape_api(url)

这里定义了一个 scrape_detail方法,它接收一个参数 id。这里的实现也非常简单,先根据定义好的 DETAIL_URL 加 id 构造一个真实的详情页 Ajax 请求的 URL,再直接调用 scrape_api 方法传人这个 url即可。

最后,我们定义一个总的调用方法,对以上方法串联调用,代码如下:

def main():for page in range(1, TOTAL_PAGE + 1):index_data = scrape_index(page)for item in index_data.get('results'):id = item.get('id')detail_data = scrape_detail(id)logging.info('detail data %s', detail_data)if __name__ == '__main__':main()

我们定义了一个 main 方法,该方法首先遍历获取页码 page,然后把 page 当作参数传递给scrape_index方法,得到列表页的数据。接着遍历每个列表页的每个结果,获取每部电影的 id。之后把 id 当作参数传递给 scrape_detail方法来爬取每部电影的详情数据,并将此数据赋值为detail_data,最后输出 detail_data 即可。

运行结果如下:
在这里插入图片描述
由于内容较多,这里省略了部分内容。

可以看到,整个爬取工作已经完成了,这里会依次爬取每一个列表页的 Ajax 接口,然后依次爬取每部电影的详情页 Ajax 接口,并打印出每部电影的 Ajax 接口响应数据,而且都是 JSON 格式。至此,所有电影的详情数据,我们都爬取到啦。

全部代码

import requests
import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s-%(levelname)s:%(message)s')
INDEX_URL = 'https://spa1.scrape.center/api/movie/?limit={limit}&offset-{offset}'def scrape_api(url):logging.info('scraping %s...', url)try:response = requests.get(url)if response.status_code == 200:return response.json()logging.error('get invalid status code %s while scraping %s', response.status_code, url)except requests.RequestException:logging.error('error occurred while scraping %s', url, exc_info=True)LIMIT = 10def scrape_index(page):url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))return scrape_api(url)DETAIL_URL = 'https://spa1.scrape.center/api/movie/{id}'def scrape_detail(id):url = DETAIL_URL.format(id=id)return scrape_api(url)TOTAL_PAGE = 10def main():for page in range(1, TOTAL_PAGE + 1):index_data = scrape_index(page)for item in index_data.get('results'):id = item.get('id')detail_data = scrape_detail(id)logging.info('detail data %s', detail_data)if __name__ == '__main__':main()

相关文章:

Ajax数据爬取

有时我们用requests 抓取页面得到的结果&#xff0c;可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档&#xff0c;而浏览器中的页面是JavaScript 处理…...

MVCC实现原理以及解决脏读、不可重复读、幻读问题

MVCC实现原理以及解决脏读、不可重复读、幻读问题 MVCC是什么&#xff1f;有什么作用&#xff1f;MVCC的实现原理行隐藏的字段undo log日志版本链Read View MVCC在RC下避免脏读MVCC在RC造成不可重复读、丢失修改MVCC在RR下解决不可重复读问题RR下仍然存在幻读的问题 MVCC是什么…...

PilotGo

title: 解锁 PilotGo&#xff1a;智能化运维的得力助手 date: ‘2024-12-29’ category: blog tags: PilotGo运维管理智能化工具技术应用 sig: ops archives: ‘2024-12’ author:way_back summary: PilotGo 作为一款创新的运维管理工具&#xff0c;凭借其智能化的特性和丰富的…...

【后端】LNMP环境搭建

长期更新各种好文&#xff0c;建议关注收藏&#xff01; 本文近期更新完毕。 LNMPlinuxnginxmysqlphp 需要的资源 linux服务器 web服务软件nginx 对应的语言编译器代码文件 数据库mysql安装 tar.gz包或者命令行安装 进入root&#xff1a; sodu 或su mkdir path/{server,soft}…...

vue 本地自测iframe通讯

使用 postMessage API 来实现跨窗口&#xff08;跨域&#xff09;的消息传递。postMessage 允许你安全地发送消息到其他窗口&#xff0c;包括嵌套的 iframe&#xff0c;而不需要担心同源策略的问题。 发送消息&#xff08;父应用&#xff09; 1. 父应用&#xff1a;发送消息给…...

【人工智能】基于Python和OpenCV实现实时人脸识别系统:从基础到应用

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能和计算机视觉的快速发展,人脸识别技术已广泛应用于监控、安全、社交媒体、金融和医疗等领域。本文将介绍如何利用Python和Ope…...

vue2使用pdfjs-dist和jsPDF生成pdf文件

vue2使用pdfjs-dist和jsPDF生成pdf文件 1、安装依赖 npm install pdfjs-dist2.6.3472、引入依赖 import { jsPDF } from jspdf// 使用require方式导入pdfjs-dist v2.6.347&#xff0c;高版本报错&#xff08;import导入会报错&#xff1a;GlobalWorkerOptions undefined&…...

深度学习算法选择

1. 卷积神经网络&#xff08;Convolutional Neural Networks, CNNs&#xff09; 简介 卷积神经网络擅长处理具有网格结构的数据&#xff0c;如图像。通过卷积层、池化层和全连接层&#xff0c;CNN能够自动提取和学习数据的空间特征。 应用场景 图像识别与分类&#xff1a;如…...

asp.net core系统记录当前在线人数

实时记录当前在线人数&#xff0c;登录后保持120秒在线状态&#xff0c;在线状态保存在缓存中&#xff0c;采用滑动过期&#xff0c;在120秒内请求了系统&#xff0c;自动续活120秒&#xff1b;超过时间则移除用户在线状态&#xff1b; 需要在登录过滤器标记用户在线状态需要排…...

【每日学点鸿蒙知识】Grid子项拖动、Swiper指示器、手势事件上报、指定使用发布版本API、打包签名失败报错109

1、HarmonyOS Grid组件子项拖动问题&#xff1f; Grid组件中有20个GridItem子组件&#xff0c;其中前4个GridItem是不能拖动的&#xff0c;其余GridItem可拖动排序。 关于可拖拽grid及gridItem可参考如下代码&#xff08;注&#xff1a;其中 .draggable(parseInt(day) < 6…...

轻松实现向量搜索:探索 Elastic-Embedding-Searcher 项目

随着人工智能和机器学习技术的飞速发展&#xff0c;向量搜索已成为数据检索的重要方式。尤其是在处理大规模文本数据时&#xff0c;传统的基于关键词的检索方式已经难以满足需求。为了优化检索性能并提升搜索精度&#xff0c;向量搜索成为了更加高效的解决方案。而在这一领域&a…...

区块链平台安全属性解释

区块链平台安全属性解释 双向认证 解释:双向认证是指在通信过程中,**通信双方都需要对对方的身份进行验证,确保对方是合法的、可信任的实体。**只有双方身份都得到确认后,通信才会被允许进行,从而防止非法用户的接入和数据的窃取或篡改。举例:在基于区块链和联邦学习的数…...

matlab reshape permute

1.reshape 将向量按照顺序重新构建 矩阵&#xff0c;新矩阵 先排完第一列&#xff0c; 再第二列… 2.permute 将向量 维度变换...

《一文读懂卷积网络CNN:原理、模型与应用全解析》

《一文读懂卷积网络CNN&#xff1a;原理、模型与应用全解析》 一、CNN 基本原理大揭秘&#xff08;一&#xff09;从人类视觉到 CNN 灵感&#xff08;二&#xff09;核心组件详解 二、经典 CNN 模型巡礼&#xff08;一&#xff09;LeNet-5&#xff1a;开山鼻祖&#xff08;二&a…...

深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 (中英双语)

深入理解 PyTorch 的 view() 函数&#xff1a;以多头注意力机制&#xff08;Multi-Head Attention&#xff09;为例 在深度学习模型的实现中&#xff0c;view() 是 PyTorch 中一个非常常用的张量操作函数&#xff0c;它能够改变张量的形状&#xff08;shape&#xff09;而不改…...

【每日学点鸿蒙知识】获取是否有网接口、获取udid报错、本地通知、Json转Map、Window10安装Hyper-v

1、有没有获取当前是否真实有网的接口&#xff1f; 比如当前链接的是wifi&#xff0c;但是当前wifi是不能访问网络的&#xff0c;有没有接口可以获取到这个真实的网络访问状态&#xff1f; 请参考说明链接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyo…...

《Vue3 四》Vue 的组件化

组件化&#xff1a;将一个页面拆分成一个个小的功能模块&#xff0c;每个功能模块完成自己部分的独立的功能。任何应用都可以被抽象成一棵组件树。 Vue 中的根组件&#xff1a; Vue.createApp() 中传入对象的本质上就是一个组件&#xff0c;称之为根组件&#xff08;APP 组件…...

Linux:alias别名永久有效

一、背景 日常使用bash时候&#xff0c;有些常用的命令参数的组合命令太长&#xff0c;很难记&#xff0c;此时可以利用Linux提供的alias命令生成命令的别名&#xff08;命令的隐射&#xff09;&#xff0c;但是我们会发现&#xff0c;当退出了终端后重新登录就失效了&#xff…...

MicroDiffusion——采用新的掩码方法和改进的 Transformer 架构,实现了低预算的扩散模型

介绍 论文地址&#xff1a;https://arxiv.org/abs/2407.15811 现代图像生成模型擅长创建自然、高质量的内容&#xff0c;每年生成的图像超过十亿幅。然而&#xff0c;从头开始训练这些模型极其昂贵和耗时。文本到图像&#xff08;T2I&#xff09;扩散模型降低了部分计算成本&a…...

网神SecFox FastJson反序列化RCE漏洞复现(附脚本)

0x01 产品描述&#xff1a; ‌网神SecFox是奇安信网神信息技术(北京)股份有限公司推出的一款运维安全管理与审计系统‌&#xff0c;集“身份认证、账户管理、权限控制、运维审计”于一体&#xff0c;提供统一运维身份认证、细粒度的权限控制、丰富的运维审计报告、多维度的预警…...

解决无法在 Ubuntu 24.04 上运行 AppImage 应用

在 Ubuntu 24.04 中运行 AppImage 应用的完整指南 在 Ubuntu 24.04 中&#xff0c;许多用户可能会遇到 AppImage 应用无法启动的问题。即使你已经设置了正确的文件权限&#xff0c;AppImage 仍然拒绝运行。这通常是由于缺少必要的库文件所致。 问题根源&#xff1a;缺少 FUSE…...

Pytorch | 利用PC-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用PC-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集PC-I-FGSM介绍算法原理 PC-I-FGSM代码实现PC-I-FGSM算法实现攻击效果 代码汇总pcifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR…...

前端往后端传递参数的方式有哪些?

文章目录 1. URL 参数1.1. 查询参数&#xff08;Query Parameters)1.2. 路径参数&#xff08;Path Parameters&#xff09; 2. 请求体&#xff08;Request Body&#xff09;2.1. JSON 数据2.2. 表单数据2.3. 文件上传 3. 请求头&#xff08;Headers&#xff09;3.1. 自定义请求…...

对抗攻击VA-I-FGSM:Adversarial Examples with Virtual Step and Auxiliary Gradients

文章目录 摘要相关定义算法流程代码:文章链接: Improving Transferability of Adversarial Examples with Virtual Step and Auxiliary Gradients 摘要 深度神经网络已被证明容易受到对抗样本的攻击,这些对抗样本通过向良性样本中添加人类难以察觉的扰动来欺骗神经网络。目…...

【Java】IO流练习

IO流练习 题干&#xff1a; 根据指定要求&#xff0c;完成电话记录、 注册、登录 注册 题干&#xff1a; 完成【注册】功能&#xff1a; 要求&#xff1a; 用户输入用户名、密码存入users.txt文件中 若users.txt文件不存在&#xff0c;创建该文件若users.txt文件存在 输入…...

红魔电竞PadPro平板解BL+ROOT权限-KernelSU+LSPosed框架支持

红魔Padpro设备目前官方未开放解锁BL&#xff0c;也阉割了很多解锁BL指令&#xff0c;造成大家都不能自主玩机。此规则从红魔8开始&#xff0c;就一直延续下来&#xff0c;后续的机型大概率也是一样的情况。好在依旧有开发者进行适配研究&#xff0c;目前红魔PadPro平板&#x…...

小程序配置文件 —— 12 全局配置 - pages配置

全局配置 - pages配置 在根目录下的 app.json 文件中有一个 pages 字段&#xff0c;这里我们介绍一下 pages 字段的具体用法&#xff1b; pages 字段&#xff1a;用来指定小程序由哪些页面组成&#xff0c;用来让小程序知道由哪些页面组成以及页面定义在哪个目录&#xff0c;…...

供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇

概述 我们在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述 中描述了什么是供应链中台&#xff0c;供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解&#xff0c;我会逐一针对中台…...

leetcode 面试经典 150 题:删除有序数组中的重复项

链接删除有序数组中的重复项题序号26题型数组解题方法双指针难度简单熟练度✅✅✅✅✅ 题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保…...

Python 中的 lambda 函数和嵌套函数

Python 中的 lambda 函数和嵌套函数 Python 中的 lambda 函数和嵌套函数Python 中的 lambda 函数嵌套函数&#xff08;内部函数&#xff09;封装辅助函数闭包和工厂函数 Python 中的 lambda 函数和嵌套函数 Python 中的 lambda 函数 Lambda 函数是基于单行表达式的匿名函数。…...

Android笔试面试题AI答之Android基础(7)

Android入门请看《Android应用开发项目式教程》&#xff0c;视频、源码、答疑&#xff0c;手把手教 文章目录 1.Android开发如何提高App的兼容性&#xff1f;**1. 支持多版本 Android 系统****2. 适配不同屏幕尺寸和分辨率****3. 处理不同硬件配置****4. 适配不同语言和地区**…...

PhPMyadmin-cms漏洞复现

一.通过日志文件拿Shell 打开靶场连接数据库 来到sql中输入 show global variables like %general%; set global general_logon; //⽇志保存状态开启&#xff1b; set global general_log_file D:/phpstudy/phpstudy_pro/WWW/123.php //修改日志保存位置 show global varia…...

HTML-CSS(day01)

W3C标准&#xff1a; W3C&#xff08; World Wide Web Consortium&#xff0c;万维网联盟&#xff09; W3C是万维网联盟&#xff0c;这个组成是用来定义标准的。他们规定了一个网页是由三部分组成&#xff0c;分别是&#xff1a; 三个组成部分&#xff1a;&#xff08;1&…...

【服务器项目部署】⭐️将本地项目部署到服务器!

目录 &#x1f378;前言 &#x1f37b;一、服务器选择 &#x1f379; 二、服务器环境部署 2.1 java 环境部署 2.2 mysql 环境部署 &#x1f378;三、项目部署 3.1 静态页面调整 3.2 服务器端口开放 3.3 项目部署 ​ &#x1f379;四、测试 &#x1f378;前言 小伙伴们大家好…...

计算机网络 (14)数字传输系统

一、定义与原理 数字传输系统&#xff0c;顾名思义&#xff0c;是一种将连续变化的模拟信号转换为离散的数字信号&#xff0c;并通过适当的传输媒介进行传递的系统。在数字传输系统中&#xff0c;信息被编码成一系列的二进制数字&#xff0c;即0和1&#xff0c;这些数字序列能够…...

机器学习周报-TCN文献阅读

文章目录 摘要Abstract 1 TCN通用架构1.1 序列建模任务描述1.2 因果卷积&#xff08;Causal Convolutions&#xff09;1.3 扩张卷积&#xff08;Dilated Convolutions&#xff09;1.4 残差连接&#xff08;Residual Connections&#xff09; 2 TCN vs RNN3 TCN缺点4 代码4.1 TC…...

UniApp 页面布局基础

一、UniApp 页面布局简介 在当今的移动应用开发领域&#xff0c;跨平台开发已成为一种主流趋势。UniApp作为一款极具影响力的跨平台开发框架&#xff0c;凭借其“一套代码&#xff0c;多端运行”的特性&#xff0c;为开发者们提供了极大的便利&#xff0c;显著提升了开发效率。…...

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…...

论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》

Abstract 通过将时间序列编码为数字组成的字符串&#xff0c;我们可以将时间序列预测当做文本中下一个 token预测的框架。通过开发这种方法&#xff0c;我们发现像GPT-3和LLaMA-2这样的大语言模型在下游任务上可以有零样本时间序列外推能力上持平或者超过专门设计的时间序列训…...

STM32文件详解

STM32文件详解 启动文件打开MDK栈空间开辟堆空间开辟中断向量表复位程序对于 weak 的理解对于_main 函数的分析中断程序堆栈初始化系统启动流程 时钟树时钟源时钟配置函数时钟初始化配置函数 启动文件 启动文件的方式 1、初始化堆栈指针 SP _initial_sp 2、初始化程序计数器指…...

【Spring】详解(上)

Spring 框架核心原理与应用&#xff08;上&#xff09; 一、Spring 框架概述 &#xff08;一&#xff09;诞生背景 随着 Java 应用程序规模的不断扩大以及复杂度的日益提升&#xff0c;传统的 Java开发方式在对象管理、代码耦合度等方面面临诸多挑战。例如&#xff0c;对象之…...

大数据面试笔试宝典之Flink面试

1.Flink 是如何支持批流一体的? F link 通过一个底层引擎同时支持流处理和批处理. 在流处理引擎之上,F link 有以下机制: 1)检查点机制和状态机制:用于实现容错、有状态的处理; 2)水印机制:用于实现事件时钟; 3)窗口和触发器:用于限制计算范围,并定义呈现结果的…...

Rust编程与项目实战-箱

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 对于Rust而言&#xff0c;箱&#xff08;crate&#xff09;是一个独立的可编译单元&…...

git回退指定版本/复制提交id

1.使用“git reset --hard 目标版本号”命令将版本回退2.使用“git push -f”提交更改 因为我们回退后的本地库HEAD指向的版本比远程库的要旧&#xff0c;此时如果用“git push”会报错。 改为使用 git push -f 即可完成回退后的提交。...

数据库锁的深入探讨

数据库锁&#xff08;Database Lock&#xff09;是多用户环境中用于保证数据一致性和隔离性的机制。随着数据库系统的发展&#xff0c;特别是在高并发的场景下&#xff0c;锁的机制变得尤为重要。通过使用锁&#xff0c;数据库能够防止并发操作导致的数据冲突或不一致。本文将深…...

《机器学习》——KNN算法

文章目录 KNN算法简介KNN算法——sklearnsklearn是什么&#xff1f;sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors&#xff0c;通过寻找k个距…...

iOS开发代码块-OC版

iOS开发代码块-OC版 资源分享资源使用详情Xcode自带代码块自定义代码块 资源分享 自提&#xff1a; 通过网盘分享的文件&#xff1a;CodeSnippets 2.zip 链接: https://pan.baidu.com/s/1Yh8q9PbyeNpuYpasG4IiVg?pwddn1i 提取码: dn1i Xcode中的代码片段默认放在下面的目录中…...

关于在M系列的Mac中使用SoftEtherClient软件

1. 前言 本文说明的是在M系列的苹果的MacBook中如何使用SoftetherClient这款软件&#xff0c;是直接在MacOS操作系统中安装连接使用&#xff0c;不是在PD环境或者非ARM架构的Mac中安装使用。 PS&#xff1a;别费劲百度了&#xff0c;很少有相关解决方案的&#xff0c;在国内会…...

【畅购商城】详情页模块之评论

目录 接口 分析 后端实现&#xff1a;JavaBean 后端实现 前端实现 接口 GET http://localhost:10010/web-service/comments/spu/2?current1&size2 { "code": 20000, "message": "查询成功", "data": { "impressions&q…...

机器学习DAY4续:梯度提升与 XGBoost (完)

本文将通过 XGBoost 框架来实现回归、分类和排序任务&#xff0c;帮助理解和掌握使用 XGBoost 解决实际问题的能力。我们将从基本的数据处理开始&#xff0c;逐步深入到模型训练、评估以及预测。最后&#xff0c;将模型进行保存和加载训练好的模型。 知识点 回归任务分类任务…...