Python爬虫实战:抓取猫眼电影排行榜top100#4

爬虫专栏系列:http://t.csdnimg.cn/Oiun0

抓取猫眼电影排行

本节中,我们利用 requests 库和正则表达式来抓取猫眼电影 TOP100 的相关内容。requests 比 urllib 使用更加方便,而且目前我们还没有系统学习 HTML 解析库,所以这里就选用正则表达式来作为解析工具。

同时我会放出Xpath和Beautiful Soup版本的源代码,便于有基础的同学尝试。

1. 本节目标

本节中,我们要提取出猫眼电影 TOP100 的电影名称、时间、评分、图片等信息,提取的站点 URL 为 http://maoyan.com/board/4,提取的结果会以文件形式保存下来。

2. 准备工作

在本节开始之前,请确保已经正确安装好了 requests 库。如果没有安装,可以参考Python爬虫请求库安装-CSDN博客的安装说明。

3. 抓取分析

我们需要抓取的目标站点为http://maoyan.com/board/4,打开之后便可以查看到榜单信息,如图所示。

榜单信息

e526995897ee4e15b30bba58a85fcdc3.png

排名第一的电影是霸王别姬,页面中显示的有效信息有影片名称、主演、上映时间、上映地区、评分、图片等信息。

将网页滚动到最下方,可以发现有分页的列表,直接点击第 2 页,观察页面的 URL 和内容发生了怎样的变化,如图所示。

56d291fb4d794908b405b31ddc8cc702.png

可以发现页面的 URL 变成 TOP100榜 - 猫眼电影 - 一网打尽好电影,比之前的 URL 多了一个参数,那就是 offset=10,而目前显示的结果是排行 11~20 名的电影,初步推断这是一个偏移量的参数。再点击下一页,发现页面的 URL 变成了 猫眼验证中心,参数 offset 变成了 20,而显示的结果是排行 21~30 的电影。

由此可以总结出规律,offset 代表偏移量值,如果偏移量为 n,则显示的电影序号就是 n+1 到 n+10,每页显示 10 个。所以,如果想获取 TOP100 电影,只需要分开请求 10 次,而 10 次的 offset 参数分别设置为 0、10、20…90 即可,这样获取不同的页面之后,再用正则表达式提取出相关信息,就可以得到 TOP100 的所有电影信息了。

4. 抓取首页

接下来用代码实现这个过程。首先抓取第一页的内容。我们实现了 get_one_page 方法,并给它传入 url 参数。然后将抓取的页面结果返回,再通过 main 方法调用。初步代码实现如下:

import requests  
​
def get_one_page(url):  headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/65.0.3325.162 Safari/537.36'  }
​response = requests.get(url, headers=headers)  if response.status_code == 200:  return response.text  return None  
​
def main():  url = 'http://maoyan.com/board/4'  html = get_one_page(url)  print(html)  
​
main()

这样运行之后,就可以成功获取首页的源代码了。获取源代码后,就需要解析页面,提取出我们想要的信息。

5. 正则提取

接下来,回到网页看一下页面的真实源码。在开发者模式下的 Network 监听组件中查看源代码,如图所示。

b9a3260f9b324a7381b7654f1c6145d7.png

注意,这里不要在 Elements 选项卡中直接查看源码,因为那里的源码可能经过 JavaScript 操作而与原始请求不同,而是需要从 Network 选项卡部分查看原始请求得到的源码。

查看其中一个条目的源代码,如图所示。

136451b5fb1a44f5a7967b4d39fbd55f.png

可以看到,一部电影信息对应的源代码是一个 dd 节点,我们用正则表达式来提取这里面的一些电影信息。首先,需要提取它的排名信息。而它的排名信息是在 class 为 board-index 的 i 节点内,这里利用非贪婪匹配来提取 i 节点内的信息,正则表达式写为:

<dd>.*?board-index.*?>(.*?)</i>

随后需要提取电影的图片。可以看到,后面有 a 节点,其内部有两个 img 节点。经过检查后发现,第二个 img 节点的 data-src 属性是图片的链接。这里提取第二个 img 节点的 data-src 属性,正则表达式可以改写如下:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"

再往后,需要提取电影的名称,它在后面的 p 节点内,class 为 name。所以,可以用 name 做一个标志位,然后进一步提取到其内 a 节点的正文内容,此时正则表达式改写如下:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>

再提取主演、发布时间、评分等内容时,都是同样的原理。最后,正则表达式写为:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

这样一个正则表达式可以匹配一个电影的结果,里面匹配了 7 个信息。接下来,通过调用 findall 方法提取出所有的内容。

接下来,我们再定义解析页面的方法 parse_one_page,主要是通过正则表达式来从结果中提取出我们想要的内容,实现代码如下:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern, html)print(items)

这样就可以成功地将一页的 10 个电影信息都提取出来,这是一个列表形式,输出结果如下:

[('1', 'http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', ' 霸王别姬 ', '\n                主演:张国荣,张丰毅,巩俐 \n        ', ' 上映时间:1993-01-01(中国香港)', '9.', '6'), ('2', 'http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c', ' 肖申克的救赎 ', '\n                主演:蒂姆・罗宾斯,摩根・弗里曼,鲍勃・冈顿 \n        ', ' 上映时间:1994-10-14(美国)', '9.', '5'), ('3', 'http://p0.meituan.net/movie/fc9d78dd2ce84d20e53b6d1ae2eea4fb1515304.jpg@160w_220h_1e_1c', ' 这个杀手不太冷 ', '\n                主演:让・雷诺,加里・奥德曼,娜塔莉・波特曼 \n        ', ' 上映时间:1994-09-14(法国)', '9.', '5'), ('4', 'http://p0.meituan.net/movie/23/6009725.jpg@160w_220h_1e_1c', ' 罗马假日 ', '\n                主演:格利高利・派克,奥黛丽・赫本,埃迪・艾伯特 \n        ', ' 上映时间:1953-09-02(美国)', '9.', '1'), ('5', 'http://p0.meituan.net/movie/53/1541925.jpg@160w_220h_1e_1c', ' 阿甘正传 ', '\n                主演:汤姆・汉克斯,罗宾・怀特,加里・西尼斯 \n        ', ' 上映时间:1994-07-06(美国)', '9.', '4'), ('6', 'http://p0.meituan.net/movie/11/324629.jpg@160w_220h_1e_1c', ' 泰坦尼克号 ', '\n                主演:莱昂纳多・迪卡普里奥,凯特・温丝莱特,比利・赞恩 \n        ', ' 上映时间:1998-04-03', '9.', '5'), ('7', 'http://p0.meituan.net/movie/99/678407.jpg@160w_220h_1e_1c', ' 龙猫 ', '\n                主演:日高法子,坂本千夏,糸井重里 \n        ', ' 上映时间:1988-04-16(日本)', '9.', '2'), ('8', 'http://p0.meituan.net/movie/92/8212889.jpg@160w_220h_1e_1c', ' 教父 ', '\n                主演:马龙・白兰度,阿尔・帕西诺,詹姆斯・凯恩 \n        ', ' 上映时间:1972-03-24(美国)', '9.', '3'), ('9', 'http://p0.meituan.net/movie/62/109878.jpg@160w_220h_1e_1c', ' 唐伯虎点秋香 ', '\n                主演:周星驰,巩俐,郑佩佩 \n        ', ' 上映时间:1993-07-01(中国香港)', '9.', '2'), ('10', 'http://p0.meituan.net/movie/9bf7d7b81001a9cf8adbac5a7cf7d766132425.jpg@160w_220h_1e_1c', ' 千与千寻 ', '\n                主演:柊瑠美,入野自由,夏木真理 \n        ', ' 上映时间:2001-07-20(日本)', '9.', '3')]

但这样还不够,数据比较杂乱,我们再将匹配结果处理一下,遍历提取结果并生成字典,此时方法改写如下:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern, html)for item in items:yield {'index': item[0],'image': item[1],'title': item[2].strip(),'actor': item[3].strip()[3:] if len(item[3]) > 3 else '','time': item[4].strip()[5:] if len(item[4]) > 5 else '','score': item[5].strip() + item[6].strip()}

这样就可以成功提取出电影的排名、图片、标题、演员、时间、评分等内容了,并把它赋值为一个个的字典,形成结构化数据。运行结果如下:

{'image': 'http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', 'actor': ' 张国荣,张丰毅,巩俐 ', 'score': '9.6', 'index': '1', 'title': ' 霸王别姬 ', 'time': '1993-01-01(中国香港)'}
{'image': 'http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c', 'actor': ' 蒂姆・罗宾斯,摩根・弗里曼,鲍勃・冈顿 ', 'score': '9.5', 'index': '2', 'title': ' 肖申克的救赎 ', 'time': '1994-10-14(美国)'}
{'image': 'http://p0.meituan.net/movie/fc9d78dd2ce84d20e53b6d1ae2eea4fb1515304.jpg@160w_220h_1e_1c', 'actor': ' 让・雷诺,加里・奥德曼,娜塔莉・波特曼 ', 'score': '9.5', 'index': '3', 'title': ' 这个杀手不太冷 ', 'time': '1994-09-14(法国)'}
{'image': 'http://p0.meituan.net/movie/23/6009725.jpg@160w_220h_1e_1c', 'actor': ' 格利高利・派克,奥黛丽・赫本,埃迪・艾伯特 ', 'score': '9.1', 'index': '4', 'title': ' 罗马假日 ', 'time': '1953-09-02(美国)'}
{'image': 'http://p0.meituan.net/movie/53/1541925.jpg@160w_220h_1e_1c', 'actor': ' 汤姆・汉克斯,罗宾・怀特,加里・西尼斯 ', 'score': '9.4', 'index': '5', 'title': ' 阿甘正传 ', 'time': '1994-07-06(美国)'}
{'image': 'http://p0.meituan.net/movie/11/324629.jpg@160w_220h_1e_1c', 'actor': ' 莱昂纳多・迪卡普里奥,凯特・温丝莱特,比利・赞恩 ', 'score': '9.5', 'index': '6', 'title': ' 泰坦尼克号 ', 'time': '1998-04-03'}
{'image': 'http://p0.meituan.net/movie/99/678407.jpg@160w_220h_1e_1c', 'actor': ' 日高法子,坂本千夏,糸井重里 ', 'score': '9.2', 'index': '7', 'title': ' 龙猫 ', 'time': '1988-04-16(日本)'}
{'image': 'http://p0.meituan.net/movie/92/8212889.jpg@160w_220h_1e_1c', 'actor': ' 马龙・白兰度,阿尔・帕西诺,詹姆斯・凯恩 ', 'score': '9.3', 'index': '8', 'title': ' 教父 ', 'time': '1972-03-24(美国)'}
{'image': 'http://p0.meituan.net/movie/62/109878.jpg@160w_220h_1e_1c', 'actor': ' 周星驰,巩俐,郑佩佩 ', 'score': '9.2', 'index': '9', 'title': ' 唐伯虎点秋香 ', 'time': '1993-07-01(中国香港)'}
{'image': 'http://p0.meituan.net/movie/9bf7d7b81001a9cf8adbac5a7cf7d766132425.jpg@160w_220h_1e_1c', 'actor': ' 柊瑠美,入野自由,夏木真理 ', 'score': '9.3', 'index': '10', 'title': ' 千与千寻 ', 'time': '2001-07-20(日本)'}

到此为止,我们就成功提取了单页的电影信息。

6. 写入文件

随后,我们将提取的结果写入文件,这里直接写入到一个文本文件中。这里通过 JSON 库的 dumps 方法实现字典的序列化,并指定 ensure_ascii 参数为 False,这样可以保证输出结果是中文形式而不是 Unicode 编码。代码如下:

def write_to_file(content):  with open('result.txt', 'a', encoding='utf-8') as f:  print(type(json.dumps(content)))  f.write(json.dumps(content, ensure_ascii=False)+'\n')

通过调用 write_to_file 方法即可实现将字典写入到文本文件的过程,此处的 content 参数就是一部电影的提取结果,是一个字典。

7. 整合代码

最后,实现 main 方法来调用前面实现的方法,将单页的电影结果写入到文件。相关代码如下:

def main():  url = 'http://maoyan.com/board/4'  html = get_one_page(url)  for item in parse_one_page(html):  write_to_file(item)

到此为止,我们就完成了单页电影的提取,也就是首页的 10 部电影可以成功提取并保存到文本文件中了。

8. 分页爬取

因为我们需要抓取的是 TOP100 的电影,所以还需要遍历一下,给这个链接传入 offset 参数,实现其他 90 部电影的爬取,此时添加如下调用即可:

if __name__ == '__main__':  for i in range(10):  main(offset=i * 10)

这里还需要将 main 方法修改一下,接收一个 offset 值作为偏移量,然后构造 URL 进行爬取。实现代码如下:

def main(offset):  url = 'http://maoyan.com/board/4?offset=' + str(offset)  html = get_one_page(url)  for item in parse_one_page(html):  print(item)  write_to_file(item)

到此为止,我们的猫眼电影 TOP100 的爬虫就全部完成了,再稍微整理一下,完整的代码如下:

正则表达式版本
import json  
import requests  
from requests.exceptions import RequestException  
import re  
import time  def get_one_page(url):  try:  headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like   Gecko) Chrome/65.0.3325.162 Safari/537.36'  }response = requests.get(url, headers=headers)  if response.status_code == 200:  return response.text  return None  except RequestException:  return None  def parse_one_page(html):  pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a' 
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>' 
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)  items = re.findall(pattern, html)  for item in items:  yield {'index': item[0],  'image': item[1],  'title': item[2],  'actor': item[3].strip()[3:],  'time': item[4].strip()[5:],  'score': item[5] + item[6]  }  def write_to_file(content):  with open('result.txt', 'a', encoding='utf-8') as f:  f.write(json.dumps(content, ensure_ascii=False) + '\n')  def main(offset):  url = 'http://maoyan.com/board/4?offset=' + str(offset)  html = get_one_page(url)  for item in parse_one_page(html):  print(item)  write_to_file(item)  if __name__ == '__main__':  for i in range(10):  main(offset=i * 10)  time.sleep(1)
Xpath版本
from lxml import etreedef parse_one_page_xpath(html):root = etree.HTML(html)items = root.xpath('//dd[@class="board-index"]')for item in items:yield {'index': item.xpath('.//i[@class="board-index"]/text()')[0],'image': item.xpath('.//img[@class="board-index-img"]/@data-src')[0],'title': item.xpath('.//a/text()')[0],'actor': item.xpath('.//p[@class="star"]/text()')[0][3:].strip(),'time': item.xpath('.//p[@class="releasetime"]/text()')[0][5:].strip(),'score': item.xpath('.//i[@class="integer"]/text()')[0] + item.xpath('.//i[@class="fraction"]/text()')[0]}# 修改main函数来使用XPath版本
def main(offset):url = 'http://maoyan.com/board/4?offset=' + str(offset)html = get_one_page(url)for item in parse_one_page_xpath(html):print(item)write_to_file(item)if __name__ == '__main__':  for i in range(10):  main(offset=i * 10)  time.sleep(1)
Beautiful Soup版本
from bs4 import BeautifulSoupdef parse_one_page_bs(html):soup = BeautifulSoup(html, 'html.parser')items = soup.find_all('dd', class_='board-index')for item in items:yield {'index': item.find(i_class='board-index').get_text(),'image': item.find(img_class='board-index-img')['data-src'],'title': item.find(a_tag=True).get_text(),'actor': item.find(p_class='star').get_text()[3:].strip(),'time': item.find(p_class='releasetime').get_text()[5:].strip(),'score': item.find(i_class='integer').get_text() + item.find(i_class='fraction').get_text()}# 修改main函数来使用BeautifulSoup版本
def main(offset):url = 'http://maoyan.com/board/4?offset=' + str(offset)html = get_one_page(url)for item in parse_one_page_bs(html):print(item)write_to_file(item)if __name__ == '__main__':  for i in range(10):  main(offset=i * 10)  time.sleep(1)

现在猫眼多了反爬虫,如果速度过快,则会无响应,所以这里又增加了一个延时等待。

9. 运行结果

最后,我们运行一下代码,输出结果类似如下:

{'index': '1', 'image': 'http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c',   'title': ' 霸王别姬 ', 'actor': ' 张国荣,张丰毅,巩俐 ', 'time': '1993-01-01(中国香港)', 'score': '9.6'}  
{'index': '2', 'image': 'http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c', 'title':   ' 肖申克的救赎 ', 'actor': ' 蒂姆・罗宾斯,摩根・弗里曼,鲍勃・冈顿 ', 'time': '1994-10-14(美国)', 'score': '9.5'}  
...  
{'index': '98', 'image': 'http://p0.meituan.net/movie/76/7073389.jpg@160w_220h_1e_1c', 'title': ' 东京物语 ',   'actor': ' 笠智众,原节子,杉村春子 ', 'time': '1953-11-03(日本)', 'score': '9.1'}  
{'index': '99', 'image': 'http://p0.meituan.net/movie/52/3420293.jpg@160w_220h_1e_1c', 'title': ' 我爱你 ',   'actor': ' 宋在河,李彩恩,吉海延 ', 'time': '2011-02-17(韩国)', 'score': '9.0'}  
{'index': '100', 'image': 'http://p1.meituan.net/movie/__44335138__8470779.jpg@160w_220h_1e_1c', 'title':   ' 迁徙的鸟 ', 'actor': ' 雅克・贝汉,菲利普・拉波洛,Philippe Labro', 'time': '2001-12-12(法国)', 'score': '9.1'}

这里省略了中间的部分输出结果。可以看到,这样就成功地把 TOP100 的电影信息爬取下来了。

这时我们再看下文本文件,结果如图所示。

运行结果

a24304a0a6e34b28852682ac4314cd35.png 

可以看到,电影信息也已全部保存到了文本文件中了,大功告成!

本节中,我们通过爬取猫眼 TOP100 的电影信息练习了 requests 和正则表达式的用法。这是一个最基础的实例,希望大家可以通过这个实例对爬虫的实现有一个最基本的思路,也对这两个库的用法有更深一步的了解。

如果本文对你有帮助,不要忘记点赞,收藏+关注,你的支持是我最大的动力!

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

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

相关文章

深度学习自然语言处理(NLP)模型BERT:从理论到Pytorch实战

文章目录 深度学习自然语言处理&#xff08;NLP&#xff09;模型BERT&#xff1a;从理论到Pytorch实战一、引言传统NLP技术概览规则和模式匹配基于统计的方法词嵌入和分布式表示循环神经网络&#xff08;RNN&#xff09;与长短时记忆网络&#xff08;LSTM&#xff09;Transform…

vim常用命令以及配置文件

layout: article title: “vim文本编译器” vim文本编辑器 有三种模式: 命令模式 文本模式, 末行模式 vim命令大全 - 知乎 (zhihu.com) 命令模式 插入 i: 切换到输入模式&#xff0c;在光标当前位置开始输入文本。 a: 进入插入模式&#xff0c;在光标下一个位置开始输入文…

Excel+VBA处理高斯光束

文章目录 1 图片导入与裁剪2 获取图片数据3 数据拟合 1 图片导入与裁剪 插入图片没什么好说的&#xff0c;新建Excel&#xff0c;【插入】->【图片】。 由于图像比较大&#xff0c;所以要对数据进行截取&#xff0c;选中图片之后&#xff0c;点击选项卡右端的【图片格式】…

前后端通讯:前端调用后端接口的五种方式,优劣势和场景

Hi&#xff0c;我是贝格前端工场&#xff0c;专注前端开发8年了&#xff0c;前端始终绕不开的一个话题就是如何和后端交换数据&#xff08;通讯&#xff09;&#xff0c;本文先从最基础的通讯方式讲起。 一、什么是前后端通讯 前后端通讯&#xff08;Frontend-Backend Commun…

HiveSQL——共同使用ip的用户检测问题【自关联问题】

注&#xff1a;参考文章&#xff1a; SQL 之共同使用ip用户检测问题【自关联问题】-HQL面试题48【拼多多面试题】_hive sql 自关联-CSDN博客文章浏览阅读810次。0 问题描述create table log( uid char(10), ip char(15), time timestamp);insert into log valuesinsert into l…

Java 学习和实践笔记(5)

三种类型的变量&#xff1a; Java中常量的定义&#xff1a; 下面的这个加号表示连接的意思&#xff0c;也就是把前面的字符串常量和后面的变量值在显示时连在一起&#xff1a; 显示效果如下&#xff1a; 如果没有用这个加号&#xff0c;就会报错&#xff1a;

037 稀疏数组

代码示例 /*** 生成稀疏数组* param arr 原数组* param defaultValue 数组默认值* return*/ static int[][] extractArray(int[][] arr, int defaultValue) {// 统计有多少个非默认值int count 0;for (int i 0; i < arr.length; i) {for (int j 0; j < arr[i].lengt…

2024年【高压电工】报名考试及高压电工操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年高压电工报名考试为正在备考高压电工操作证的学员准备的理论考试专题&#xff0c;每个月更新的高压电工操作证考试祝您顺利通过高压电工考试。 1、【单选题】 高压电动机发生单相接地故障时,只要接地电流大于()…

无人机飞控算法原理基础研究,多旋翼无人机的飞行控制算法理论详解,无人机飞控软件架构设计

多旋翼无人机的飞行控制算法主要涉及到自动控制器、捷联式惯性导航系统、卡尔曼滤波算法和飞行控制PID算法等部分。 自动控制器是无人机飞行控制的核心部分&#xff0c;它负责接收来自无人机传感器和其他系统的信息&#xff0c;并根据预设的算法和逻辑&#xff0c;对无人机的姿…

MySQL 主键策略导致的效率性能

MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一)&#xff0c;而是推荐连续自增的主键id&#xff0c;官方的推荐是auto_increment 一、准备三张表 分别是user_auto_key&#xff0c;user_uuid&#xff0c;user_random_key&#xff0c;分别表示自动增长的主键…

DolphinScheduler-3.2.0 集群搭建

本篇文章主要记录DolphinScheduler-3.2.0 集群部署流程。 注&#xff1a;参考文档&#xff1a; DolphinScheduler-3.2.0生产集群高可用搭建_dophinscheduler3.2.0 使用说明-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞25次&#xff0c;收藏23次。DolphinScheduler-3.2.0生产…

从0开始图形学(光栅化)

前言 说起图形学&#xff0c;很多人就会提到OpenGL&#xff0c;但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本&#xff0c;使得一些原理并不直观。可能你知道向量&#xff0c;矩阵&#xff0c;纹理&#xff0c;重心坐标等概念&#xff0c;但就是不知道这些概…

正点原子-STM32通用定时器学习笔记(1)

目录 1. 通用定时器简介&#xff08;F1为例&#xff09; 2. 通用定时器框图 ①时钟源 ②控制器 ③时基单元 ④输入捕获 ⑤捕获/比较&#xff08;公共&#xff09; ⑥输出比较 3.时钟源配置 3.1 计数器时钟源寄存器设置方法 3.2 外部时钟模式1 3.3 外部时钟模式2 3…

第二章:三角面片及其填充

本文是《从0开始图形学》笔记的第二章&#xff0c;主要说明模型的一般构成以及如何查找模型的有效范围&#xff0c;涉及三角面片的填充以及向量的叉乘计算。 概念解说 上一节中&#xff0c;我们画出了箱子的顶点和边缘线&#xff0c;箱子还只是一个骨架而已。这一节我们来将箱…

再识C语言 DAY17 【什么是原码、反码和补码】

文章目录 前言本文总结于此文章 一、知识补充二、原码三、反码四&#xff0c;补码 总结如果您发现文章有错误请与我留言&#xff0c;感谢 前言 本文总结于此文章 一、知识补充 通常&#xff0c;1字节包含8位。C语言用字节&#xff08;byte&#xff09;表示储存系统字符集所需…

草莓CDMS原创内容分销系统,微信小说平台系统,附带系统搭建教程,搭建手册

草莓原创内容分销系统&#xff08;草莓CDMS&#xff09;——您的一站式内容分销解决方案 引领内容分销新潮流&#xff0c;草莓原创内容分销系统&#xff08;简称草莓CDMS&#xff09;以强大的技术支持和灵活的业务模式&#xff0c;为原创内容的传播和商业变现提供了前所未有的…

力扣刷题之旅:进阶篇(三)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 一、动态规划&#xff08;DP&#xff09; 首先&#xff0c;让我们来…

口袋工具箱微信小程序源码

这是一款云开发口袋工具箱微信小程序源码&#xff0c;只有纯前端版本&#xff0c;该版本的口袋工具箱涵盖了13个功能&#xff0c;分别为圣诞帽头像生成、二维码生成、日语50音图、汉字拼音查询、计算器、程序员黄历、娱乐摇骰子、身材计算、所在地天气查询、IP地址查询、手机归…

机器学习系列——(二十)密度聚类

引言 在机器学习的无监督学习领域&#xff0c;聚类算法是一种关键的技术&#xff0c;用于发现数据集中的内在结构和模式。与传统的基于距离的聚类方法&#xff08;如K-Means&#xff09;不同&#xff0c;密度聚类关注于数据分布的密度&#xff0c;旨在识别被低密度区域分隔的高…

单片机在物联网中的应用

单片机&#xff0c;这个小巧的电子设备&#xff0c;可能听起来有点技术性&#xff0c;但它实际上是物联网世界中的一个超级英雄。简单来说&#xff0c;单片机就像是各种智能设备的大脑&#xff0c;它能让设备“思考”和“行动”。由于其体积小、成本低、功耗低、易于编程等特点…