网络爬虫(一)——爬虫及其实现

文章目录

    • 1.1 爬虫概述
      • 1.1.3 网络爬虫和浏览器的区别
      • 1.1.2 网络爬虫的定义
    • 1.2 requests请求库
      • 1.2.1 requests基本概念
      • 1.2.2 疫情数据爬取
      • 1.2.3 get请求
      • 1.2.4 headers请求头
      • 1.2.5 Cookies验证
    • 1.3 Beautiful Soup解析库
      • 1.3.1 安装
      • 1.3.2 对象的创建
      • 1.3.3 find方法
      • 1.3.4 后话
    • 1.4 正则表达式
      • 1.4.1 正则表达式语法
      • 1.4.2 re.findall()方法
      • 1.4.3 r原串的使用
      • 1.4.4 案例
    • 1.5 json
      • 1.5.1 json模块
      • 1.5.2 python转json
      • 1.5.3 案例

1.1 爬虫概述

1.1.3 网络爬虫和浏览器的区别

浏览器和爬虫都是在访问网站的服务器,然后返回对应的数据。不同的是,浏览器返回的数据还会经过渲染,变成十分美观的界面。而对于爬虫来说,返回的一般是原生的HTML代码。

image-20220328163853898

1.1.2 网络爬虫的定义

网络爬虫也叫网络蜘蛛或网络机器人,其模拟客户端发送网络请求,获取响应数据。换而言之,它是一种按照一定的规则,自动抓取万维网信息的程序或脚本。

1.2 requests请求库

1.2.1 requests基本概念

requests是一个优雅而简单的pythonHTTP请求库。它的作用是发送请求获取响应数据。如果你想要安装这个库,可以打开anaconda3的prompt黑窗口,然后在对应的环境中输入

pip install requests

安装完成后,我们来试着返回一下百度搜索的源代码

# 导入模块
import requests# 发送请求,获取响应
response = requests.get("https://www.baidu.com/")# 获取响应数据
response.encoding = 'utf8'
print(response.text)

从以上的演示来看,我们可以从中总结requests使用的步骤:

  • 导入模块
  • 发送get请求,获取响应
  • 从响应中获取数据

这里还要给大家科普response对象的方法。

response.text:响应体str类型

response.ecoding:二进制转换字符使用的编码

response.content:响应体bytes类型

1.2.2 疫情数据爬取

我们来试着爬取一下丁香园新型冠状病毒疫情实时动态首页内容。其url为:全球新冠肺炎疫情地图 - 丁香园·丁香医生 (dxy.cn)

# 导入模块
import requests# 发送请求,获取响应对象
response = requests.get("http://ncov.dxy.cn/ncovh5/view/pneumonia")# 从响应对象中获取数据
print(response.content.decode())
#print(response.text)

1.2.3 get请求

对于get请求返回的响应对象,实际上含有多种方法可调用。

  • response.url:打印请求url
  • response.headers:打印请求头
  • response.cookies:打印cookie信息
  • response.status_code:打印请求状态码

对于状态码来说,有如下几种情况:

image-20220406150657516

1.2.4 headers请求头

对于某些网页,其实现了反爬机制,所有通过get方法无法获取数据。这时候我们可以模拟浏览器的头部信息来访问。

每个浏览器的头部信息不同。如何查看浏览器的头部信息呢?

image-20220406151224394

打开一个网页,点检查,然后刷新一下网页,然后按照上图操作即可找到头部信息。

在使用get请求时,只需在get方法的有参构造中传入对应的请求头即可。如下所示:

import requests# 浏览器头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36 Edg/100.0.1185.29'}
url = "http://ncov.dxy.cn/ncovh5/view/pneumonia"response = requests.get(url, headers=headers)
print(response.status_code)

1.2.5 Cookies验证

在爬取某些数据时,需要进行网页的登录,才可以进行数据的抓取工作。Cookies登录就像很多网页中的自动登录功能一样,可以让用户第二次登录时在不需要验证账号和密码的情况下进行登录。在使用requests模块实现Cookies登录时,首先需要在浏览器的开发者工具页面中找到可以实现登录的Cookies信息,然后将Cookies信息处理并添加至RequestsCookieJar的对象中,最后将RequestsCookieJar对象作为网络请求的Cookies参数发送网络请求即可。以获取豆瓣网页登录后用户名为例,具体步骤如下:

  • 在Google浏览器中打开豆瓣网页地址(https://www.douban.com/),并输入自己的账号+密码登录。
  • 右键“检查”,选择“Network”选项。
  • 在“name”框中选择其中一个,在Headers选项中选择Request Headers选项,获取登录后的Cookies信息(选中后右键“Copy value”)。
  • 导入相应的模块,将复制出来的Cookie信息粘到下面的“此处填写登录后网页的Cookie信息”中,然后创建RequestsCookieJar()对象并对Cookie信息进行处理,最后将处理后的RequestsCookieJar()对象作为网络请求参数,实现网页的登录请求。

让我们试一下下面的代码:

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}
import requests #导入requests模块cookies = '此处填写登录后网页的Cookie信息'
#发送网络请求
url = 'https://www.douban.com'
#创建requestsCookieJar对象,用于设置Cookies信息
cookies_jar = requests.cookies.RequestsCookieJar()
for cookie in cookies.split(';'):key,value = cookie.split('=',1)cookies_jar.set(key,value)
response = requests.get(url,headers=headers,cookies=cookies_jar)
print(response.status_code)  #打印相应状态码
print(response.text) #打印相应结果

1.3 Beautiful Soup解析库

Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库。如果你不太懂HTML的相关知识,我希望您参考一下我的HTML相关博客。

1.3.1 安装

我们需要安装两个东西:bs4和lxml。

pip install bs4

pip install lxml

1.3.2 对象的创建

BeautifulSoup对象代表要解析的整个文档树。它支持搜索文档树和搜索文档树中描述的大部分方法。

我们来试着创建一个BeautifulSoup对象。解析时,我们采用lxml解析器。

# 导入模块
from bs4 import BeautifulSoup# 创建对象
soup = BeautifulSoup('<html>data</html>', 'lxml')
print(soup)

out:

<html><body><p>data</p></body></html>

输入结果时我们可以看到BeautifulSoup对象帮我们自动补全了html的标准格式。

1.3.3 find方法

BeautifulSoup拥有find方法,其作用可以用于搜索文档树。

find(self,name = None,attr = [],recursive = True,text = None,**kwargs)

  • name:标签名
  • attrs:属性字典
  • recursive:是否递归循环查找,如果为False,则无法找到指定标签的子标签
  • text:根据文本内容查找
  • return :查找到的第一个元素对象
  • 如果想要找到所有元素对象,可以使用findAll方法

我们来试着利用bs4来解析以下的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.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>  
</body>
</html>

让我们动手试一下:

# 导入模块
from bs4 import BeautifulSoup# HTML文档对象
htmlTest = """<!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.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>  
</body>
</html>"""# 创建对象
soup = BeautifulSoup(htmlTest, 'lxml')# 查找title标签
title = soup.find("title")
# 查找a标签
a = soup.find("a")
# 查找所有a标签
a_s = soup.findAll("a")print(title)
print(a)
print(a_s)

我们也可以不通过标签查找内容,而通过属性查找内容。那么我们可以使用find有参构造器中attrs属性来构建属性字典,从而进行查找。如下所示:

# 导入模块
from bs4 import BeautifulSoup# HTML文档对象
htmlTest = """<!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.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>  
</body>
</html>"""# 创建对象
soup = BeautifulSoup(htmlTest, 'lxml')# 根据title属性查找img内容
img = soup.find(attrs={'weight': "480"})
print(img)

1.3.4 后话

实际上,解析库不止有bs4,还有Xpath、selenium和Scrapy框架。这些后面我想单独再讲,这里有bs4已经足够爬取大部分的网页内容了。

1.4 正则表达式

1.4.1 正则表达式语法

正则表达式可以用于字符串匹配。其可以检查一个字符串是否含有某种子串,还可以替换匹配的子串,最后还能提取某个字符串汇总匹配的子串。

让我们来看一下正则表达式的语法。

字符作用
.匹配除换行符以外的任意字符
\转义字符,能使的改变字符原本的意思,变为字符串
[…]字符集。对应的位置可以是字符集中任意字符。如a[a-c]d,那么其匹配结果是aad、abd、acd。如果要取反,加上^即可。如a[ ^a-c ],其可以匹配除了aa、ab、ac以外的任何带a开头的两位英文字符串。

动手试一下吧,能够加深你的印象。

# 正则表达式的常见语法
import re# 字符匹配
str1 = 'abcdefg'
rs = re.findall('abc', str1)
rs1 = re.findall('a.c', str1)
print(f"字符串匹配结果{rs}")
print(f"点的匹配结果{rs1}")
str2 = 'a.bcdfg'
rs2 = re.findall('a\..c', str2)
print(f"用转义字符匹配点{rs2}")
rs3 = re.findall('a[bc]c', str1)
print(f"用字符集匹配{rs3}")

对于字符集来说,里面可以填上一些字符。

预定义字符集匹配
\d匹配数字0-9
\D匹配^\d
\s匹配空白字符
\S匹配非空白字符
\w匹配普通字符,相当于[A-Za-z0-9_]
\W匹配非英语字母

除了以上的字符之外,还有一些数量词。它们一般用于字符或字符集之后。

数量词说明实例结果
*匹配前一个字符0或无限次abc*ab,abccc
+匹配前一个字符1次或无限次abc+abc,abccc
?匹配前一个字符0次或1次acb?ab,abc
{m}匹配前一个字符m次ab{2}cabbc

1.4.2 re.findall()方法

re.findall(pattern,string,flag = 0)

  • 扫描整个string字符串,返回所有与pattern匹配的列表
  • pattern:正则表达式
  • string:从那个字符串中寻找
  • flags:匹配模式
import re# 1 findall方法,返回匹配的结果列表
rs = re.findall('\d+', 'Misaki123')
# print(rs)# 2 findall方法中,flag参数的作用
rs = re.findall('a.bc', 'a\nbc', re.DOTALL)
print(rs)# 3 findall方法中分组的使用
rs = re.findall('a.+bc', 'a\nbc', re.DOTALL)
rs = re.findall('a(.+)bc', 'a\nbc', re.DOTALL)
print(rs)

在上面的操作中,我们使用小括号进行分组,其中分组是用于返回括号内匹配的结果,如果不加分组则返回整个字符串;当加了分组后,小括号两旁的字符串是用于定位的。

1.4.3 r原串的使用

在我们不使用r原串时,如果我们想要匹配转义符怎么匹配?我们需要四个斜杆。即如果想用正则表达式匹配\,则需要\\\\

对于re模块来说,其为我们提供了r原串来解决上述的问题。我们来看一下下面的例子:

import re# 1 不使用r原串,遇到转义符怎么办
rs = re.findall('a\\\nbc', 'a\nbc')
print(rs)# 2 使用r原串
rs = re.findall(r'a\nbc', 'a\nbc')
print(rs)

1.4.4 案例

让我们来试着利用所学知识提取一下疫情的json字符串,注意,这里可能还有人不认识json是什么,下一讲我们会做阐述,这里我们应该关注的是,如何爬虫和如何正则匹配。

链接:全球新冠肺炎疫情地图 - 丁香园·丁香医生 (dxy.cn)

import requests
from bs4 import BeautifulSoup
import re# 1 获取首页内容
# 发送请求,获取响应
response = requests.get('http://ncov.dxy.cn/ncovh5/view/pneumonia')
# 从响应中获取数据
page = response.content.decode()# 2 提取各国疫情数据
# 构建bs对象
soup = BeautifulSoup(page, 'lxml')
# 查找标签
script = soup.find(id='getListByCountryTypeService2true')
# 获取标签内容
countries_text = script.text
# 提取json字符串
json_str = re.findall(r"(\[.*\])", countries_text)
print(json_str)

1.5 json

1.5.1 json模块

JSON全名JavaScript Object Notation(JavaScript 对象表示法),它是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析。其和python数据类型区别如下:

image-20220406141533704

我们来看一段json的文件:

{"sites": [{ "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" }]
}

python中提供了json模块,其可用于json格式的文件数据和python文件数据的相互转换。

如何实现装换呢?如果我们是要是json字符串转化为python类型数据的话,只需调用json.load(),将字符串传给构造器即可。

同样地,如果你想将json文件转为python类型的数据,那么首先要实例化json文件,让其变为对象,然后再将对象传入json.load()的构造器中。

import json# 1 把json字符串转换为python数据
json_str = """{"sites": [{ "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" }]
}"""rs = json.loads(json_str)
# print(rs)# 2 把json格式文件转换为python类型的数据
with open('Test.json') as fp:python_list = json.load(fp)print(python_list)

1.5.2 python转json

转换原理如下所示:

image-20220406145229853

import json# 1 python数据转换为json数据
# json转python
json_str = """{"sites": [{ "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" }]
}"""
rs = json.loads(json_str)
# print(rs)# python转json
json_str = json.dumps(rs, ensure_ascii=False)
# print(json_str)# 2 把python以json格式存储到文件中
with open('test.json', 'w') as fp:json.dump(rs, fp, ensure_ascii=False)

1.5.3 案例

让我们继续1.4.4中json字符串转换为python的过程。

import json
import requests
from bs4 import BeautifulSoup
import re# 1 获取首页内容
# 发送请求,获取响应
response = requests.get('http://ncov.dxy.cn/ncovh5/view/pneumonia')
# 从响应中获取数据
page = response.content.decode()# 2 提取各国疫情数据
# 构建bs对象
soup = BeautifulSoup(page, 'lxml')
# 查找标签
script = soup.find(id='getListByCountryTypeService2true')
# 获取标签内容
countries_text = script.text
# 提取json字符串
json_str = re.findall(r"\[.*\]", countries_text)[0]
print(json_str)# 3 把json字符串转换为python类型数据
last_day_corona_virus = json.loads(json_str)
print(last_day_corona_virus)

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

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

相关文章

Windows五种IO模型性能分析和Linux五种IO模型性能分析

Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blog.csdn.net/jay900323/article/details/18140847 重叠I/O模型的另外几个优点在于&#xff0c;微软针对重叠I/O模型提供了一些特有的扩展函数。当使用重…

C++从0到1的入门级教学(十一)——友元

文章目录11 友元11.1 全局函数做友元11.2 友元类11.3 成员函数做友元11 友元 让我们引入一个例子来讲述友元是什么。 生活中你的家有客厅&#xff0c;有卧室&#xff0c;客厅所有来的客人都可以进去&#xff0c;但是你的卧室是私有的。对于认识的人来说你可以允许它进去&…

KeyMob:为国内应用开发者管理的广告聚合平台

为什么80%的码农都做不了架构师&#xff1f;>>> 应用开发者在应用中嵌入广告SDK的来源主要包括两种&#xff1a;使用移动广告平台与移动广告聚合平台。国内有多少家提供移动广告管理的平台&#xff1f;据统计&#xff0c;这两个版本&#xff0c;已经有四五十家。虽…

模拟航班查询及预定系统 编写示例

一、建立C#窗体 所需控件&#xff1a; Label标签 Button 按钮 TextBox 文本框 ComboBox 组合框 DATaGridView 数据显示 DateTimePicker 日期表 NumericUpDown 数字选择 二、建立后台数据库 大概需要四张表 1&#xff0c;航空公司表 2&#xff0c;城市信息表 3&#xff0c;航班…

数据结构杂谈(七)——串

文章目录7 串7.1 基本知识7.1.1 串的定义:rose:定义:rose:各种概念:rose:字符串和线性表的区别7.1.2 串的抽象类型数据定义7.1.3 串的比较:rose:原理7.2 串的存储结构:rose:7.2.1串的顺序存储:rose:7.2.2 串的链式存储7.3 基本操作:rose:7.3.1 返回子串操作:rose:7.3.2 比较操作…

Linux实现的IEEE 802.q VLAN

本文转载自&#xff1a; http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN--------------------------我是快乐的分割线-------------------------------------------------- 第一部分&#xff1a;VLAN的核心概念 说起IEEE 802.1q&#xf…

C++从0到1的入门级教学(十二)——运算符重载

文章目录12 运算符重载12.1 加法运算符重载12.2 左移运算符重载12.2.1 演示与说明12.2.2 常见的友元使用&#xff1a;重载>>运算符12.3 递增运算符重载12.4 赋值运算符重载12.5 关系运算符重载12.6 函数调用运算符重载12 运算符重载 在本讲中&#xff0c;我们会设计到一…

C++从0到1的入门级教学(十三)——继承

文章目录13 继承13.1 继承的基本语法13.2 继承方式13.3 继承的对象模型13.4 继承中构造和析构顺序13.5 继承同名成员处理方式13.6 继承同名静态成员处理方式13.7 多继承语法13.8 菱形继承13 继承 继承是面向对象三大特性之一。有些类和类之间存在特殊的关系&#xff0c;如下图…

线性代数(二)

2 解线性方程组 1 Ax b的列图像实质是A的列向量有各种线性组合&#xff0c;b为其中的一种组合结果。 2 Ax b可以写为Axx1a1...xnanbAx x_1a_1...x_na_n bAxx1​a1​...xn​an​b&#xff0c;其中a1,a2...ana_1,a_2...a_na1​,a2​...an​为A中的列向量。 3 当Ax 0时&#…

xor方程组消元 UVA 11542 Square

题目传送门 题意&#xff1a;给n个数&#xff0c;选择一些数字乘积为平方数的选择方案数。训练指南题目。 分析&#xff1a;每一个数字分解质因数。比如4&#xff0c; 6&#xff0c; 10&#xff0c; 15&#xff0c;, , , , 令&#xff0c;表示选择第i个数字&#xff0c;那么&am…

深度学习修炼(八)——经典卷积网络

文章目录8 经典卷积网络8.1 LeNet模型8.2 Alexnet8.3 VGG8.4 ResNet8.5 感受野8 经典卷积网络 在前面一讲&#xff0c;我们谈论了关于卷积神经网络的诸多细节。综合来讲&#xff0c;卷积神经网络就是含卷积层的网络。在本讲中&#xff0c;我们将会根据卷积神经网络发展的历史&…

视觉中的经典图像特征小结(一): 颜色直方图, HOG, LBP

[普兒原创, 如有错误和纰漏欢迎指正. 更新中...] 1. 颜色直方图 颜色空间在本质上是定义在某种坐标系统下的子空间&#xff0c;空间中的每一个坐标表示一种不同的颜色。颜色空间的目的在于给出某种颜色标准&#xff0c;使得不同的设备和用途都能对颜色有一致的描述。这里主要介…

C++从0到1的入门级教学(七)——指针

文章目录7 指针7.1 指针的基本概念7.2 指针变量的定义和使用7.3 指针所占内存空间7.4 空指针7.5 野指针7.6 void*指针7.7 指向指针的指针7.8 const修饰指针7.9 指针和数组7.10 指针和函数7 指针 指针是指向另外一种类型的符合类型&#xff0c;和引用类似&#xff0c;指针也实现…

C++从0到1的入门级教学(五)——字符串、向量和数组

文章目录5 字符串、向量和数组5.1 命名空间5.2 标准库string5.2.1 定义和初始化string对象5.2.2 string对象上的操作5.2.2.1 读取string对象5.2.2.2 风格5.2.2.3 使用getline读取一整行5.2.2.4 empty和size操作5.2.2.5 size_type类型5.2.2.6 比较string对象5.2.2.7 string对象的…

媒体格式分析之flv -- 基于FFMPEG

本来是应该先写一个媒体文件格式的简单讲解的&#xff0c;还没来得及写&#xff0c;以后再写。今天就先根据ffmpeg的flv.c的flv_demux这个结构体来讲解一下当前比较流行的媒体格式flv. FLV 是FLASH VIDEO的简称&#xff0c;FLV流媒体格式是随着Flash MX的推出发展而来的视频格式…

C++从0到1的入门级教学(三)——表达式和运算符

文章目录3 运算符3.1 表达式3.1.1 基本概念3.1.2 运算符和运算对象3.1.3 运算对象的转换3.1.4 左值和右值3.2 运算符3.2.1 算术运算符3.2.2 赋值运算符3.2.3 比较运算符3.2.4 逻辑运算符3.2.5 成员访问运算符3.2.6 条件运算符3 运算符 C提供了一套供操作内置数据类型的运算符&…

谈谈用SQLite和FMDB而不用Core Data

谈谈用SQLite和FMDB而不用Core Data 发布于&#xff1a;2014-04-22 11:22阅读数&#xff1a;4235 凭良心讲&#xff0c;我不能告诉你不去使用Core Data。它不错&#xff0c;而且也在变好&#xff0c;并且它被很多其他Cocoa开发者所理解&#xff0c;当有新人加入你的组或者需要别…

Idea工具开发 SpringBoot整合JSP(毕设亲测可用)

因为&#xff0c;临近毕业了&#xff0c;自己虽然也学了很多框架。但是&#xff0c;都是在别人搭建好的基础上进行项目开发。但是springboot的官方文档上明确指出不提倡使用jsp进行前端开发&#xff0c;但是在校期间只学了jsp作为前端页面。所以&#xff0c;废话不多说&#xf…

深度学习番外——Yolov5服务器环境搭建

文章目录1 服务器搭建yolov5环境1.1 创建环境1.2 跟随官方指引2 下载预训练权重3 推理4 测试1 服务器搭建yolov5环境 1.1 创建环境 首先先的在本地环境下搭建一个我们的环境&#xff0c;名字设为yolo5-6 conda create -n yolov5-6 python3.7#创建环境 conda activate yolov5…

机器学习实战(一)——员工离职预测

文章目录员工离职预测——逻辑回归的应用1 读取文件2 独热编码3 划分数据集4 归一化5 逻辑回归预测6 模型预测及评估员工离职预测——逻辑回归的应用 开始这个案例之前&#xff0c;请先点击这里的数据集进行下载&#xff1a;HR_comma_sep.zip - 蓝奏云 (lanzout.com) 1 读取文…