Python3网络爬虫开发实战(1)爬虫基础

news2024/11/16 13:35:03

一、URL 基础

URL也就是网络资源地址,其满足如下格式规范

scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]

  • scheme:协议,常用的协议有 Http,https,ftp等等;
  • username,password:在某些情况下 URL 需要提供用户名和密码才能访问;
  • hostname:主机地址,可以是域名或者是 IP 地址;
  • port:端口,这是服务器设定的端口;
  • path:路径,指的是网络资源在服务器中的指定地址;
  • query:用来查询某类资源,如果有多个查询使用 & 隔开;
  • fragment:对资源描述的部分补充,可以理解为内部的书签,有两个主要的运用,一个是做单页面路由如 Vue,另一个用作 Html 锚点,控制页面滚动到固定位置;

HTTPS 与 HTTP 不同的是 HTTPS 的安全基础是 SSL,SSL 的主要作用有以下两种:

  1. 建立一个信息安全通道,保证数据传输的安全性;
  2. 确认网站的真实性,使用了 HTTPS 协议的网站,可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,还可以通过 CA 机构颁发的安全签章来查询;

二、请求

请求分为三个部分:请求方法,请求头,请求体;

请求方法:用于表示请求客户端请求服务端的方式,常见的请求方法有两种:GET 和 POST;

  1. GET 请求中的参数包含在 URL 里面,数据可以在 URL 中看到;而 POST 请求的 URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中;
  2. GET 请求提交的数据最多只有 1024 字节,而 POST 请求则没有限制;

除了 GET 和 POST 请求方式,还有以下请求方式;

序号方法描述
1GET从服务器获取资源。用于请求数据而不对数据进行更改。例如,从服务器获取网页、图片等。
2POST向服务器发送数据以创建新资源。常用于提交表单数据或上传文件。发送的数据包含在请求体中。
3PUT向服务器发送数据以更新现有资源。如果资源不存在,则创建新的资源。与 POST 不同,PUT 通常是幂等的,即多次执行相同的 PUT 请求不会产生不同的结果。
4DELETE从服务器删除指定的资源。请求中包含要删除的资源标识符。
5PATCH对资源进行部分修改。与 PUT 类似,但 PATCH 只更改部分数据而不是替换整个资源。
6HEAD类似于 GET,但服务器只返回响应的头部,不返回实际数据。用于检查资源的元数据(例如,检查资源是否存在,查看响应的头部信息)。
7OPTIONS返回服务器支持的 HTTP 方法。用于检查服务器支持哪些请求方法,通常用于跨域资源共享(CORS)的预检请求。
8TRACE回显服务器收到的请求,主要用于诊断。客户端可以查看请求在服务器中的处理路径。
9CONNECT建立一个到服务器的隧道,通常用于 HTTPS 连接。客户端可以通过该隧道发送加密的数据。

请求头:用来说明服务器要使用的附加信息,比较重要的信息有 Cookie,Referer,User-Agent 等;

  • Accept:请求报头域,用于指定客户端可接受哪些类型的信息;
  • Accept-Language:用于指定客户端可接受的语言类型;
  • Accept-Encoding:用于指定客户端可接受的内容编码;
  • Host:用于指定请求资源主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置,请求必须包含此内容;
  • Cookie:这是网站为了辨别用户,进行会话跟踪而存储在用户本地的数据,主要功能是维持当前访问会话;
  • Referer:用于表示请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如来源统计、防盗链处理等等;
  • User-Agent:添加此信息可以伪装成浏览器,如果不加很容易被识别出来;
  • Content-Type:用来表示具体请求中的媒体类型信息;

请求体:一般承载的内容是 POST 请求中的表单数据,对于 GET 请求,请求体为空

Content-TypePOST 提交数据的方式
application/x-www-form-urlencoded表单数据
multipart/form-data表单文件上传
application/json序列化 JSON 数据
text/xmlXML 数据

在构造 POST 请求中需要使用正确的 Content-Type,并了解设置各种请求库的各个参数时使用的都是哪种 Content-Type,如若不然可能会导致 POST 提交后无法得到正常响应

三、响应

响应是由服务端发送给客户端,可以分为三部分:响应状态码,响应头和响应体;

响应状态码:表示服务器的响应状态,如下所示:

状态码状态码英文名称中文描述
100Continue继续。客户端应继续其请求
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200OK请求成功。一般用于GET与POST请求
201Created已创建。成功请求并创建了新的资源
202Accepted已接受。已经接受请求,但未处理完成
203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206Partial Content部分内容。服务器成功处理了部分GET请求
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。使用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305Use Proxy使用代理。所请求的资源必须通过代理访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
400Bad Request客户端请求的语法错误,服务器无法理解
401Unauthorized请求要求用户的身份认证
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405Method Not Allowed客户端请求中的方法被禁止
406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408Request Time-out服务器等待客户端发送的请求时间过长,超时
409Conflict服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
412Precondition Failed客户端请求信息的先决条件错误
413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
415Unsupported Media Type服务器无法处理请求附带的媒体格式
416Requested range not satisfiable客户端请求的范围无效
417Expectation Failed(预期失败)服务器无法满足请求头中 Expect 字段指定的预期行为。
418I’m a teapot状态码 418 实际上是一个愚人节玩笑。它在 RFC 2324 中定义,该 RFC 是一个关于超文本咖啡壶控制协议(HTCPCP)的笑话文件。在这个笑话中,418 状态码是作为一个玩笑加入到 HTTP 协议中的。
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功能,无法完成请求
502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理
响应头:包含了服务器对请求的应答信息
  • Data:用于标识响应产生的时间;
  • Last-Modified:用于指定资源的最后修改时间;
  • Content-Encoding:用于指定响应内容的编码;
  • Server:包含服务器的信息,例如名称,版本号等;
  • Content-Type:文档类型,指定返回的数据是什么类型,如 text/html 代表返回 HTML 文档,application/x-javascript 代表返回 JavaScript 文件,image/jpeg 代表返回图片;
  • Set-Cookie:设置 Cookie,响应头中的 Set-Cookie 用于告诉浏览器需要将此内容放在 Cookie 中,下次请求时将 Cookie 携带上;
  • Expires:用于指定响应的过期时间,可以让代理服务器或浏览器将加载的内容更新到缓存中,当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载,缩短加载时间的目的;

响应体:响应的正文数据都存在于响应体中,例如请求网页时,响应体就是网页的 HTML 代码;请求一张图片,响应体就是图片的二进制数据。做爬虫请求网页的时候,要解析的内容就是响应体;

四、Web 网页

网页基本由三部分组成,HTML,CSS 和 JavaScript;其中 HTML 相当于骨架,JavaScript 相当于肌肉,CSS 相当于皮肤;这三者结合起来才能形成一个完善的网页;

网页由一个个节点组成,CSS 选择器会为不同的节点设置不同的样式规则;CSS 选择器 | 菜鸟教程 (runoob.com)

选择器示例示例说明
.class.intro选择所有class="intro"的元素
#id#firstname选择所有id="firstname"的元素
**选择所有元素
elementp选择所有<p>元素
element,elementdiv,p选择所有<div>元素和 <p> 元素
element.classp.hometown选择所有 class=“hometown” 的<p> 元素
element elementdiv p选择<div>元素内的所有<p>元素
element>elementdiv>p选择所有父级是<div> 元素的 <p> 元素
element+elementdiv+p选择所有紧跟在 <div> 元素之后的第一个 <p> 元素
[attribute][target]选择所有带有target属性元素
[attribute=value][target=-blank]选择所有使用target="-blank"的元素
[attribute~=value][title~=flower]选择标题属性包含单词"flower"的所有元素
[attribute|=language][lang|=en]选择 lang 属性等于 en,或者以 en- 为开头的所有元素
:linka:link选择所有未访问链接
:visiteda:visited选择所有访问过的链接
:activea:active选择活动链接
:hovera:hover选择鼠标在链接上面时
:focusinput:focus选择具有焦点的输入元素
:first-letterp:first-letter选择每一个<p>元素的第一个字母
:first-linep:first-line选择每一个<p>元素的第一行
:first-childp:first-child指定只有当<p>元素是其父级的第一个子级的样式。
:beforep:before在每个<p>元素之前插入内容
:afterp:after在每个<p>元素之后插入内容
:lang(language)p:lang(it)选择一个lang属性的起始值="it"的所有<p>元素
element1~element2p~ul选择p元素之后的每一个ul元素
[attribute^=value]a[src^=“https”]选择每一个src属性的值以"https"开头的元素
[attribute$=value]a[src$=“.pdf”]选择每一个src属性的值以".pdf"结尾的元素
[attribute*=value]a[src*=“runoob”]选择每一个src属性的值包含子字符串"runoob"的元素
p:firs-of-typep:first-of-type选择每个p元素是其父级的第一个p元素
:last-of-typep:last-of-type选择每个p元素是其父级的最后一个p元素
:only-of-typep:only-of-type选择每个p元素是其父级的唯一p元素
:only-childp:only-child选择每个p元素是其父级的唯一子元素
:nth-child(n)p:nth-child(2)选择每个p元素是其父级的第二个子元素
:nth-last-child(n)p:nth-last-child(2)选择每个p元素的是其父级的第二个子元素,从最后一个子项计数
:nth-of-type(n)p:nth-of-type(2)选择每个p元素是其父级的第二个p元素
:nth-last-of-type(n)p:nth-last-of-type(2)选择每个p元素的是其父级的第二个p元素,从最后一个子项计数
:last-childp:last-child选择每个p元素是其父级的最后一个子级。
:root:root选择文档的根元素
:emptyp:empty选择每个没有任何子级的p元素(包括文本节点)
:target#news:target选择当前活动的#news元素(包含该锚名称的点击的URL)
:enabledinput:enabled选择每一个已启用的输入元素
:disabledinput:disabled选择每一个禁用的输入元素
:checkedinput:checked选择每个选中的输入元素
:not(selector):not§选择每个并非p元素的元素
::selection::selection匹配元素中被用户选中或处于高亮状态的部分
:out-of-range:out-of-range匹配值在指定区间之外的input元素
:in-range:in-range匹配值在指定区间之内的input元素
:read-write:read-write用于匹配可读及可写的元素
:read-only:read-only用于匹配设置 “readonly”(只读) 属性的元素
:optional:optional用于匹配可选的输入元素
:required:required用于匹配设置了 “required” 属性的元素
:valid:valid用于匹配输入值为合法的元素
:invalid:invalid用于匹配输入值为非法的元素

除了 CSS 选择器,还可以使用 XPath 选择器来选择节点;

五、爬虫常见问题

越来越多的网页是采用 Ajax,前端模块化工具构建的

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

如采用 Vue 开发的网页中,其 index.html 的 body 中只有一个 id 为 app 的 div 节点和一个 main.js 的 script,其负责整个网页的渲染;

因此当我们请求页面的时候,我们只得到 HTML 代码,而不会渲染 JavaScript 文件,无法看到完整的页面内容;对于这样的情况,我们只有分析源代码后台的 Ajax 接口,或者使用 Selenium 等库来模拟 JavaScript 的渲染;

六、服务器,Session 和 Cookie

将 html 代码文件放在某台具有固定公网 IP 的主机上,在这台主机上安装 Apache 或者 Nginx 等服务器,这台主机就可以作为服务器了;

Session 在服务端,用来保存用户的 Session 信息, Cookie 在客户端,浏览器在访问相同的网页时会自动带上 Cookie,服务器通过识别 Cookie 判断哪个用户访问,然后判断用户是否处于登入状态,并返回对应的响应;

在客户端第一次请求服务器时,服务器会创建一个 Session 并返回一个响应头中与 Session 对应的 Set-Cookie 字段的响应给客户端,客户端接受到响应后会将 Set-Cookie 中的字段保存为 Cookie,当下一次请求同一网站时,Cookie 会随着客户端的请求发送给服务器,服务器通过 Cookie 中的字段找到 Session,通过判断 Session 辨认用户状态并返回对应响应;

关闭浏览器并不会导致 Session 被删除,因此需要服务器为 Session 设置一个失效时间,当距离客户端上一次使用 Session 的时间超过这个失效时间,服务器才可以认为客户端已经停止了活动并删除 Session 以节省空间;

七、代理,多进程和多线程

服务器会检测某个 IP 在单位时间内的请求次数,如果请求次数超过设定的阈值,就直接拒绝提供服务,并返回一些错误信息,这种情况被称为 封IP

代理常用的有 HTTP 代理和 SOCKS 代理,其配置如下

import requests

# http 代理
proxies = {
    'http': 'http://proxy.example.com:8080',
    'https': 'https://proxy.example.com:8080'
}

# socks 代理
proxies = {
    'http': 'socks5://user:pass@host:port',
    'https': 'socks5://user:pass@host:port'
}

response = requests.get(url, proxies=proxies)

进程是线程的集合,一个进程是由一个或者多个线程构成的,线程是操作系统进行运算调度的最小单元;

并发是指多个线程对应的多条指令被快速轮换地执行,在宏观上看起来是同时在运行,而微观上是交换执行;并行是指同一时刻由多条指令在多个处理器上同时执行,这意味着并行必须依赖多个处理器,无论是从宏观还是微观,都是同时运行的;

在一个程序的进程中,有一些指令是比较耗时或者需要等待的,如果使用单线程,指令只能等待一个指令完毕后才能执行下一个指令,因此我们可以使用多线程来实现并效果;同理,如果使用多进程我们可以实现并行的效果;

  • 在python中,实现多线程主要通过threading模块,而多进程主要通过multiprocessing模块。

  • 这两个模块的主要区别是:threading模块基于线程,而multiprocessing模块基于进程。threading模块使用共享内存来实现多线程,所有线程都共享一样的变量(这点在后续的实例中可以感受到);而multiprocessing基于子进程,每个子进程之间都有独立的变量和数据结构。两者的区别意味着threading更使用于I/O密集型任务(例如需要进行多表格读取操作),multiprocessing模块更适用于包含较多计算的CPU密集型任务(矩阵运算,图片处理类任务)。

  • 需要注意的是,由于python中的GIL锁的存在,Python解释器只允许一个Python进程使用,这意味着对于一个解释器只允许一个进程在运行,这也是为什么threading模块无法适用于CPU密集型这类需要大量CPU资源的任务,因为一个进程的CPU资源有限,无论开启多少个线程,总的资源就只有那些,总耗时不会有太大变化。而multiprocessing模块则可以开多个进程,能够更快速的处理CPU密集型任务。

代码参考

【Python】超详细实例讲解python多线程(threading模块)_python的threading模块详解-CSDN博客

Python 爬虫进阶六之多进程的用法 | 静觅 (cuiqingcai.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1949073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正点原子 通用外设配置模型 GPIO配置步骤 NVIC配置

1. 这个是通用外设驱动模式配置 除了初始化是必须的 其他不是必须的 2. gpio配置步骤 1.使能时钟是相当于开电 2.设置工作模式是配置是输出还是输入 是上拉输入还是下拉输入还是浮空 是高速度还是低速度这些 3 和 4小点就是读写io口的状态了 3. 这个图是正点原子 将GPIO 的时…

2024中国大学生算法设计超级联赛(2)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 鸡爪解题思…

eclipse修改tomcat的Jre运行环境

1.双击tomcat 2.RuntimeEnvironment 3.选择

轨道式智能巡检机器人,助力综合管廊安全运维

1 引言 当前城市综合管廊建设已经成为世界范围内的发展趋势&#xff0c;2017年5月住建部、发改委联合发布《全国城市市政基础设施建设“十三五”规划》&#xff0c;截至2017年4月底国内地下综合管廊试点项目已开工建设687 km&#xff0c;建成廊体260 km&#xff0c;完成投资40…

redis的使用场景-热点数据缓存

1.什么是缓存&#xff1f; 把一些经常访问的数据放入缓存中&#xff0c;减少访问数据库的频率&#xff0c;减少数据库的压力&#xff0c;从而提高程序的性能。【内存中存储】 2.缓存的原理 通过上图可以看出程序首先访问缓存&#xff0c;如果缓存中有访问的数据会直接方会给客…

分布式系统常见软件架构模式

常见的分布式软件架构 Peer-to-Peer (P2P) PatternAPI Gateway PatternPub-Sub (Publish-Subscribe)Request-Response PatternEvent Sourcing PatternETL (Extract, Transform, Load) PatternBatching PatternStreaming Processing PatternOrchestration Pattern总结 先上个图&…

基于Golang+Vue3快速搭建的博客系统

WANLI 博客系统 项目介绍 基于vue3和gin框架开发的前后端分离个人博客系统&#xff0c;包含md格式的文本编辑展示&#xff0c;点赞评论收藏&#xff0c;新闻热点&#xff0c;匿名聊天室&#xff0c;文章搜索等功能。 项目在线访问&#xff1a;http://bloggo.chat/ 或 http:/…

Photos框架 - 自定义媒体资源选择器(数据部分)

引言 在iOS开发中&#xff0c;系统已经为我们提供了多种便捷的媒体资源选择方式&#xff0c;如UIImagePickerController和PHPickerViewController。这些方式不仅使用方便、界面友好&#xff0c;而且我们完全不需要担心性能和稳定性问题&#xff0c;因为它们是由系统提供的&…

基于扩散的生成模型的语音增强和去噪

第二章 目标说话人提取之《Speech Enhancement and Dereverberation with Diffusion-based Generative Models》 文章目录 前言一、任务二、动机三、挑战四、方法1.方法:基于分数的语音增强生成模型(sgmse)2.网络结构 五、实验评价1.数据集2.采样器设置和评价指标3.基线模型4.评…

godot新建项目及设置外部编辑器为vscode

一、新建项目 初次打开界面如下所示&#xff0c;点击取消按钮先关闭掉默认弹出的框 点击①新建弹出中间的弹窗②中填入项目的名称 ③中设置项目的存储路径&#xff0c;点击箭头所指浏览按钮&#xff0c;会弹出如下所示窗口 根据图中所示可以选择或新建自己的游戏存储路径&…

音视频开发之旅(85)- 图像分类-VGG模型解析

目录 1. VGG解决的问题 2. 网络结构和参数 3. pytorch搭建vgg 4.flower_photos分类任务实践 5.资料 一、VGG解决的问题 论文链接&#xff1a;https://arxiv.org/pdf/1409.1556 在VGG之前&#xff0c;大多数深度学习模型相对较浅&#xff0c;比如下面的AlexNet(5层卷积和3…

记录阿里云部署gitlab

登录阿里云&#xff1a; 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 选择自己的ECS实例。我的实例是 使用VNC登录&#xff1a;输入用户名和密码 安装所需的依赖包&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm2 添…

Git(分布式版本控制系统)(fourteen day)

一、分布式版本控制系统 1、Git概述 Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更&#xff0c;它由Linux、torvalds创建的&#xff0c;最初被设计用于Linux内核的开发。Git允许开发人员跟踪和管理代码的版本&#xff0c;并且可以在不同的开发人员之间进行…

货架管理a

路由->vue的el标签->Api->call方法里calljs的api接口->数据声明const xxxData-> 编辑按钮:点击跳出页面并把这一行的数据给到表单formDataba2 保存按钮:formDataba2改过的数据->xxApi发送->查询Api 跳转仓库:把tableData.value数据清空->callXxxAp…

华为云依赖引入错误

问题&#xff1a;记录一次项目加在华为云依赖错误&#xff0c;如下&#xff1a; 错误信息&#xff1a;Could not find artifact com.huawei.storage:esdk-obs-java:pom:3.1.2.1 in bintray-qcloud-maven-repo (https://dl.bintray.com/qcloud/maven-repo/) 找到本地仓库&#…

mac环境Qt Creator报错:Warning: You are changing a read-only file.

mac环境Qt Creator报错&#xff1a; Warning: You are changing a read-only file. 权限许可 文件权限问题 修改文件夹权限的基本语法&#xff1a; 打开终端&#xff1a;打开 macOS 中的终端应用程序。 sudo chmod -R permissions folder_pathchmod 是改变文件或文件夹权限…

虚拟机之ip配置,ssh连接到虚拟机

右边是我的虚拟机&#xff0c;左边是我使用vscode来连接&#xff08;终端也可以。然后注意vscode配置后点一下刷新&#xff0c;不会自动刷新的QA&#xff09;&#xff08;吐槽一下&#xff0c;虚拟机都不能复制内容呢&#xff0c;确实仿真&#xff0c;centos仿真就是因为没有图…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器&#xff0c;然后进行识别&#xff0c;识别结果如下&#xff1a; 本课题中…

爬取贴吧的标题和链接

免责声明 感谢您学习本爬虫学习Demo。在使用本Demo之前&#xff0c;请仔细阅读以下免责声明&#xff1a; 学习和研究目的&#xff1a;本爬虫Demo仅供学习和研究使用。用户不得将其用于任何商业用途或其他未经授权的行为。合法性&#xff1a;用户在使用本Demo时&#xff0c;应确…

微信小程序-自定义tabBar

通过官网给出的示例自己实现了自定义的tabBar&#xff0c;但结果发现 无法监听页面生命周期函数 结语&#xff1a;原想的是实现不一样的效果&#xff08;如下&#xff09; 故尝试了自定义tabBar&#xff0c;虽然做出来了&#xff0c;但也发现这个做法存在不足&#xff1a; 在…