Python爬虫使用实例-漫kzhan

环境配置

pip install shutil parsel pillow pypdf

1/ 单个章节

singleChapter

需要获取参数:chapter_id与comic_id,可能要sign和uid

获取请求地址
在这里插入图片描述

url='https://comic.mkzhan.com/chapter/content/v1/' # 请求地址

获取请求参数
在这里插入图片描述

data={
    'chapter_id':'499715',
    'comic_id':'209405',
    'format':'1',
    'quality':'1',
    'sign':'0',
    'type':'1',
    'uid':'0',
}

在这里插入图片描述

for index in response.json()['data']['page']:
    img_url=index['image']

实现代码:

# 单个章节
import requests
url='https://comic.mkzhan.com/chapter/content/v1/' # 请求地址
data={
    #'chapter_id':'997698',
    'chapter_id':'639648',
    'comic_id':'211604',
    'format':'1',
    'quality':'1',
    'sign':'bf511db7ee8e01fd18a888b0039cfefa',
    'type':'1',
    'uid':'75377874',
}
# 模拟伪装
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
# 发送请求
response = requests.get(url=url, params=data, headers=headers)
# print(response) # <Response [200]>
# print(response.json())
img_name = 1
for index in response.json()['data']['page']:
    # print(index)
    img_url=index['image']
    # print(img_url)
    img_content = requests.get(url=img_url, headers = headers).content
    with open('output\\' + str(img_name)+'.jpg',mode='wb') as f:
        f.write(img_content)
    img_name += 1

2/ 合成长图

longPicture
需要获取参数:chapter_id与comic_id,可能要sign和uid

用 Python 的 os 模块来检查文件夹是否存在,如果不存在,则创建它。

# 检查文件夹是否存在,若不存在则创建
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

合成长图,要将文件夹中的所有jpg图片合并成一张长图,可以使用 python 的 pillow 库。读取指定文件夹中的所有jpg图片,并将它们依次合并成一张长图。

  1. 导入库:os库用于文件处理,Image 用于图片操作。读取指定文件夹中的所有.jpg 图片,并按名称排序。
  2. 排序: 在 images.sort() 中,将排序方式更改为通过提取文件名中的数字进行排序。 key=lambda x: int(os.path.splitext(x)[0]) 先去掉文件扩展名,再将其转换为整数进行排序。使用 img[:-4].isdigit() 只保留文件名的数字部分。
# 按数字顺序排序,提取数字,然后排序
# 只保留文件名是数字的文件
images = [img for img in images if img[:-4].isdigit()]  
images.sort(key=lambda x: int(os.path.splitext(x)[0]))
  1. 计算:算所有图片的总高度和最大宽度,以便创建合成图像。
  2. 创建新图像: 使用 Image.new 创建一张新的空白图像。逐一将读取的图片粘贴到新图像中。
  3. 保存图像: 将合成后的图像保存到指定路径。
  4. 生成长图后用 os.remove() 函数删除原始图片(仅保留merged.jpg)

实现代码:

# 单个章节并合成长图
import os
from PIL import Image
import requests
url='https://comic.mkzhan.com/chapter/content/v1/' # 请求地址
data={
    'chapter_id':'639633',
    'comic_id':'211604',
    'format':'1',
    'quality':'1',
    'type':'1',
} # 请求参数
# 模拟伪装
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
# 发送请求
response = requests.get(url=url, params=data, headers=headers)
# print(response) # <Response [200]>
# print(response.json())
# 获取
def get_img():
    img_name = 1
    # 检查文件夹是否存在,若不存在则创建
    folder = 'output\\'
    if not os.path.exists(folder):
        os.makedirs(folder)
    for index in response.json()['data']['page']:
        # print(index)
        img_url = index['image']
        # print(img_url)
        img_content = requests.get(url=img_url, headers=headers).content
        with open(folder + str(img_name) + '.jpg', mode='wb') as f:
            f.write(img_content)
        img_name += 1
        
# 合并当前章节的图片为长图, 按顺序
def merge_images_vertically_in_order():
    image_folder = 'output\\'
    # 获取文件夹中的所有 JPG 文件
    images = [img for img in os.listdir(image_folder) if img.endswith('.jpg')]

    # 按数字顺序排序,提取数字,然后排序
    images = [img for img in images if img[:-4].isdigit()]  # 只保留文件名是数字的文件
    images.sort(key=lambda x: int(os.path.splitext(x)[0]))

    # 打开所有图片并获取它们的宽度和高度
    image_objects = [Image.open(os.path.join(image_folder, img)) for img in images]

    # 计算最终长图的总高度和最大宽度
    total_height = sum(img.height for img in image_objects)
    max_width = max(img.width for img in image_objects)

    # 创建一张新的空白图像,用于存放合成的长图
    new_image = Image.new('RGB', (max_width, total_height))

    # 逐个将图片粘贴到新图像上
    current_height = 0
    for img in image_objects:
        new_image.paste(img, (0, current_height))
        current_height += img.height

    # 保存合成的长图
    new_image.save('output\\merged.jpg')
    print(f'合成的长图已保存为: output\\merged.jpg')

    # 移除原始图片
    for img in images:
        os.remove(os.path.join(image_folder, img))
    print(f'原始图片已删除.')

# 使用示例
get_img()
# merge_images_vertically()
merge_images_vertically_in_order()

3/ 全部章节

multiChapter
需要获取参数:comic_id,可能要sign和uid
合并为长图,并合并长图为pdf

把长图放在图的上一级便于取用:用 Python 的 shutil 模块中的 move() 函数。将指定路径下的文件移动到其上一级文件夹。

shutil.move(long_img_path, os.path.join(main_folder, f'{chapter_name}.png'))

使用 PyPDF2(或 pypdf)库来将文件夹中的图片按顺序(如果有最终话或者最后话的话放在最后面,序章则放在最前面)合并成 PDF.

实现代码:

# 当然文件名之类的可能还需要修改一下
import os
import shutil
import requests
import parsel
from PIL import Image
from pypdf import PdfWriter
url1='https://www.mkzhan.com/214829/' # 请求地址
# 模拟伪装
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
html_data=requests.get(url=url1,headers=headers).text
#print(html_data)
# css 数据解析
selector = parsel.Selector(html_data)
list = selector.css('.chapter__list .chapter__list-box .chapter__item')

long_images = [] # 用于存放所有章节长图的列表

# 创建主文件夹
main_folder = 'output\\XⅪ.Awaken'
if not os.path.exists(main_folder):
    os.makedirs(main_folder)
# 获取数据
def get_data():
    # for i in list(reversed(list)):
    for i in list:
        chapter_id = i.css('a::attr(data-chapterid)').get()
        chapter_name = i.css('a::text').getall()[-1].strip()

        print(chapter_id, chapter_name)

        # 创建章节文件夹
        chapter_folder = os.path.join(main_folder, chapter_name)
        if not os.path.exists(chapter_folder):
            os.makedirs(chapter_folder)

        # 请求参数
        data = {
            'chapter_id': chapter_id,
            'comic_id': '214829',  # 此
            'format': '1',
            'quality': '1',
            'type': '1',
        }

        # 发送请求
        url = 'https://comic.mkzhan.com/chapter/content/v1/'
        response = requests.get(url=url, params=data, headers=headers)

        img_name = 1
        images = []

        for index in response.json()['data']['page']:
            img_url = index['image']
            img_content = requests.get(url=img_url, headers=headers).content

            # 确保 chapter_name 是一个有效的文件夹名称
            chapter_name = chapter_name.replace('/', '-').replace('\\', '-').replace(':', '-').replace('*',
                                                                                                            '-').replace(
                '?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '')

            # 图片文件路径
            img_file_path = os.path.join(chapter_folder, f'{chapter_name}_{img_name}.png')
            # 检查图是否已存在
            if os.path.exists(img_file_path):
                print(f"图 {img_file_path} 已存在。")
            else:
                with open(img_file_path, mode='wb') as f:
                    f.write(img_content)

            images.append(img_file_path)
            img_name += 1

        # 合并当前章节的图片为长图
        if images:
            total_height = 0
            max_width = 0
            images_to_merge = []

            for img_path in images:
                img = Image.open(img_path)
                total_height += img.height
                max_width = max(max_width, img.width)
                images_to_merge.append(img)

            long_img = Image.new('RGB', (max_width, total_height))
            current_height = 0

            for img in images_to_merge:
                long_img.paste(img, (0, current_height))
                current_height += img.height

            long_img_path = os.path.join(chapter_folder, f'{chapter_name}.png')
            # 检查长图是否已存在
            if os.path.exists(long_img_path):
                print(f"长图 {long_img_path} 已存在。")
            else:
                long_img.save(long_img_path)
                long_images.append(long_img_path)

            long_img.save(long_img_path)
            long_images.append(long_img_path)
            # 移动到上一级, 即 image_folder = 'output\\XⅪ.Awaken\\'
            shutil.move(long_img_path, os.path.join(main_folder, f'{chapter_name}.png'))
# 设置图片文件夹路径和输出 PDF 文件路径
def merged_pdf():
    #image_folder = 'XⅪ.Awaken\\'  # 替换为你的图片文件夹路径
    #output_pdf_path = 'XⅪ.Awaken.pdf'  # 输出 PDF 文件路径
    image_folder = 'output\\XⅪ.Awaken\\'  # 替换为你的图片文件夹路径
    output_pdf_path = 'output\\XⅪ.Awaken\\XⅪ.Awaken.pdf'  # 输出 PDF 文件路径

    # 用于存放所有打开的图片及其标题
    images = []
    titles = []

    # 遍历文件夹中的所有图片
    for image_file in os.listdir(image_folder):
        if image_file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):  # 检查文件格式
            image_path = os.path.join(image_folder, image_file)
            img = Image.open(image_path)
            images.append(img)

            # 提取图片标题(不带扩展名)
            title = os.path.splitext(image_file)[0]
            titles.append(title)


    # 自定义排序函数
    def custom_sort_key(title):
        if "序章" in title:  # 序章放在最前
            return (0, title)
        elif "最终话" in title or "最后话" or "新oc" in title:  # 最终话放在最后
            return (2, title)
        else:
            # 提取话的数字,并放在第一排序位置
            number_part = ''.join(filter(str.isdigit, title))  # 提取数字部分
            return (1, int(number_part) if number_part.isdigit() else 0, title)


    # 根据自定义排序规则排序标题和图片
    sorted_indices = sorted(range(len(titles)), key=lambda i: custom_sort_key(titles[i]))
    images = [images[i] for i in sorted_indices]

    # 创建 PDF Writer 实例
    pdf_writer = PdfWriter()

    # 将每张图像添加到 PDF
    for img in images:
        img_pdf_path = os.path.join(image_folder, f"temp_{titles[images.index(img)]}.pdf")
        img.save(img_pdf_path, "PDF", quality=100)

        # 添加保存的 PDF 文件到 writer
        pdf_writer.append(img_pdf_path)

    # 保存生成的 PDF 文件
    with open(output_pdf_path, 'wb') as f:
        pdf_writer.write(f)

    # 清理临时文件
    for title in titles:
        os.remove(os.path.join(image_folder, f"temp_{title}.pdf"))

    print(f'PDF 文件已生成:{output_pdf_path}')


get_data()
merged_pdf()

4/ 可选章节

OptionalmultiChapter

下载comic, def get_data(start=0, end=None) 可指定章节, 通过改变参数start和end

可能要注意一下顺序, 而且有番外
在这里插入图片描述
倒序从前往后,前面的为0 正序则从后往前, 后面的为0
因为chapter_name = i.css('a::text').getall()[-1].strip() [-1]是取列表的最后一个元素, 若要reversed 可以改为[0] 此处不可
这里不能用reversed, 会报错 for i in list(reversed(list))[start:end]:

TypeError: ‘SelectorList’ object is not callable

改start值吧, 若倒序第十话 start=9 若正序第十话 start=len(list)-10
第一话start=len(list)-1 end=None也即end = len(list)

import os
import shutil
import requests
import parsel
from PIL import Image
from pypdf import PdfWriter
url1='https://www.mkzhan.com/209405/' # 请求地址
# 模拟伪装
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
html_data=requests.get(url=url1,headers=headers).text
#print(html_data)
# css 数据解析
selector = parsel.Selector(html_data)
list = selector.css('.chapter__list .chapter__list-box .chapter__item')
# print(type(list))
long_images = [] # 用于存放所有章节长图的列表

# 创建主文件夹
# main_folder = 'XⅪ.Awaken'
main_folder = 'output\\非人哉'
if not os.path.exists(main_folder):
    os.makedirs(main_folder)

# 获取数据
# start: 指定开始章节的索引(默认为0)。
# end: 指定结束章节的索引(默认为None,表示获取到列表的最后一章)。
# 例如 get_data(start=0, end=10) 会获取前10章。
# get_data(start=5) 会从第5章开始获取到最后一章。
def get_data(start=len(list)-10, end=None): # 第10话, 这个正序的, 底部更新, 一般倒序的
    # 假设 list 是从某个地方获取的章节列表
    # list = get_chapter_list()  # 这里需要你自己实现获取章节列表的逻辑

    if end is None:
        end = len(list)  # 如果没有指定结束位置,默认为列表的长度

    for i in list[start:end]:  # 根据 start 和 end 的值获取章节
        #chapter_id = i.css('a::attr(data-chapterid)').get()
        #chapter_name = i.css('a::text').getall()[-1].strip()
        chapter_id = i.css('a::attr(data-chapterid)').get()
        chapter_name = i.css('a::text').getall()[-1].strip()
        # chapter_name = i.css('a::text').getall()[0].strip()
        # [0]和[-1]结果一样, 原因:HTML 结构简单, 在你处理的特定 HTML 结构中每个 <a> 标签只包含了一个完整的文本节点,
        # 因此取第一个或最后一个节点都返回相同的字符串。

        print(chapter_id, chapter_name)

        # 创建章节文件夹
        chapter_folder = os.path.join(main_folder, chapter_name)
        if not os.path.exists(chapter_folder):
            os.makedirs(chapter_folder)

        # 请求参数
        data = {
            'chapter_id': chapter_id,
            'comic_id': 209405,  # 此
            'format': '1',
            'quality': '1',
            'type': '1',
        }

        # 发送请求
        url = 'https://comic.mkzhan.com/chapter/content/v1/'
        response = requests.get(url=url, params=data, headers=headers)

        img_name = 1
        images = []

        for index in response.json()['data']['page']:
            img_url = index['image']
            print(img_url)
            img_content = requests.get(url=img_url, headers=headers).content

            # 确保 chapter_name 是一个有效的文件夹名称
            chapter_name = chapter_name.replace('/', '-').replace('\\', '-').replace(':', '-').replace('*',
                                                                                                       '-').replace('?',
                                                                                                                    '').replace(
                '"', '').replace('<', '').replace('>', '').replace('|', '')

            # 图片文件路径
            img_file_path = os.path.join(chapter_folder, f'{chapter_name}_{img_name}.png')
            # 检查图是否已存在
            if os.path.exists(img_file_path):
                print(f"图 {img_file_path} 已存在。")
            else:
                with open(img_file_path, mode='wb') as f:
                    f.write(img_content)

            images.append(img_file_path)
            img_name += 1

            # 合并当前章节的图片为长图
        if images:
            total_height = 0
            max_width = 0
            images_to_merge = []

            for img_path in images:
                img = Image.open(img_path)
                total_height += img.height
                max_width = max(max_width, img.width)
                images_to_merge.append(img)

            long_img = Image.new('RGB', (max_width, total_height))
            current_height = 0

            for img in images_to_merge:
                long_img.paste(img, (0, current_height))
                current_height += img.height

            long_img_path = os.path.join(chapter_folder, f'{chapter_name}.png')
            # 检查长图是否已存在
            if os.path.exists(long_img_path):
                print(f"长图 {long_img_path} 已存在。")
            else:
                long_img.save(long_img_path)
                long_images.append(long_img_path)

            long_img.save(long_img_path)
            long_images.append(long_img_path)
            # 移动到上一级, 即 image_folder = 'output\\XⅪ.Awaken\\'
            shutil.move(long_img_path, os.path.join(main_folder, f'{chapter_name}.png'))

# 设置图片文件夹路径和输出 PDF 文件路径
def merged_pdf():
    # image_folder = 'XⅪ.Awaken\\'  # 替换为你的图片文件夹路径
    # output_pdf_path = 'XⅪ.Awaken.pdf'  # 输出 PDF 文件路径
    image_folder = 'output\\非人哉\\'  # 替换为你的图片文件夹路径
    output_pdf_path = 'output\\非人哉\\非人哉.pdf'  # 输出 PDF 文件路径

    # 用于存放所有打开的图片及其标题
    images = []
    titles = []

    # 遍历文件夹中的所有图片
    for image_file in os.listdir(image_folder):
        if image_file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):  # 检查文件格式
            image_path = os.path.join(image_folder, image_file)
            img = Image.open(image_path)
            images.append(img)

            # 提取图片标题(不带扩展名)
            title = os.path.splitext(image_file)[0]
            titles.append(title)

    # 自定义排序函数
    def custom_sort_key(title):
        if "序章" in title:  # 序章放在最前
            return (0, title)
        elif "最终话" in title or "最后话" or "新oc" in title:  # 最终话放在最后
            return (2, title)
        else:
            # 提取话的数字,并放在第一排序位置
            number_part = ''.join(filter(str.isdigit, title))  # 提取数字部分
            return (1, int(number_part) if number_part.isdigit() else 0, title)

    # 根据自定义排序规则排序标题和图片
    sorted_indices = sorted(range(len(titles)), key=lambda i: custom_sort_key(titles[i]))
    images = [images[i] for i in sorted_indices]

    # 创建 PDF Writer 实例
    pdf_writer = PdfWriter()

    # 将每张图像添加到 PDF
    for img in images:
        img_pdf_path = os.path.join(image_folder, f"temp_{titles[images.index(img)]}.pdf")
        img.save(img_pdf_path, "PDF", quality=100)

        # 添加保存的 PDF 文件到 writer
        pdf_writer.append(img_pdf_path)

    # 保存生成的 PDF 文件
    with open(output_pdf_path, 'wb') as f:
        pdf_writer.write(f)

    # 清理临时文件
    for title in titles:
        os.remove(os.path.join(image_folder, f"temp_{title}.pdf"))

    print(f'PDF 文件已生成:{output_pdf_path}')

get_data()
# merged_pdf()

5/ 常见问题

转pdf时常见的报错

OSError: encoder error -2 when writing image file

可能的原因:文件太大了, 有的图片几十MB一个,如果有几十几百章, 占内存很大, 可能内存不足, 如果处理的文件非常大,可能会导致物理内存不足。如果可能的话,尝试在具有更高可用内存的环境中运行代码或者尝试将其压缩或降低分辨率。

在这里插入图片描述


还有一个常见的就是不报错,但是返回空。

获取数据不稳定,有时有又是没有,可能的原因:

  1. 访问频率限制(过于频繁会返回空的响应)
  2. 网络不稳定(网络异常导致获取数据失败)
  3. 网站使用javascript加载动态页面,导致无法获取完整html内容,标签为空
  4. 代码错误:正则表达式匹配规则有误or不准确,数据没有正确解析

6/ 源码附件

  • https://lightly.teamcode.com/a67bdf54/mkzhan
  • https://download.csdn.net/download/weixin_45693567/89717244

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下安装MySQL8.0

一、安装 1.下载安装包 先创建一个mysql目录&#xff0c;在将压缩包下载到此 # 下载tar包 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz等待下载成功 2.解压mysql8.0安装包 tar xvJf mysql-8.0.20-linux-glibc2.12-x86…

java编辑器——IntelliJ IDEA

java编辑器有两种选择——IntelliJ IDEA和VsCode。其中IntelliJ IDEA现在是企业用的比较多的&#xff0c;是专门为java设计的&#xff0c;而VsCode则是通过插件来实现Java编辑的。 1.IntelliJ IDEA 官网下载链接&#xff1a;https://www.jetbrains.com/idea/ 注意选择社区版…

STM32F103调试DMA+PWM 实现占空比逐渐增加的软启效果

实现效果&#xff1a;DMAPWM 实现PWM输出时&#xff0c;从低电平到输出占空比逐渐增加再到保持高电平的效果&#xff0c;达到控制 MOS 功率开关软启的效果。 1.配置时钟 2.TIM 的 PWM 功能配置 选择、配置 TIM 注意&#xff1a;选择 TIM 支持 DMA 控制输出 PWM 功能的通道&a…

【Python报错已解决】`AttributeError: move_to requires a WebElement`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述&#xff1a;1.1 报错示例&#xff1a;1.2 报错分析&#xff1a;1.3 解决思路&#xff…

当网工,华为认证哪种适合我?四个维度来解惑

随着网络技术的不断进步&#xff0c;对网工的专业技能要求也越来越高。 在这种背景下&#xff0c;获得权威认证成为了提升个人技能、证明专业能力的重要途径。 华为&#xff0c;作为全球领先的ICT解决方案提供商&#xff0c;其认证项目在业界享有极高的声誉。 华为认证不仅涵盖…

Day22_K8S

文章目录 3.资源管理方式通过命令管理通过配置文件管理4. 基本概念入门4.1 Namespace4.2 Pod4.3 Label4.4 Deployment4.5 Service5. Pod详解5.1 Pod介绍5.2 Pod配置5.3 Pod生命周期5.3.1 初始化容器5.3.2 钩子函数5.3.3 容器探测5.3.4 重启策略5.4 Pod调度5.4.1 定向调度5.4.2 …

dubbo 服务消费原理分析之引用服务配置

文章目录 前言一、服务监听ContextRefreshedEvent1、AbstractApplicationContext.refresh2、AbstractApplicationContext.finishRefresh3、DubboDeployApplicationListener.onApplicationEvent4、DefaultModuleDeployer .referServices5、SimpleReferenceCache.get 二、引用服务…

WPF性能优化之UI虚拟化

文章目录 前言一、VirtualizingStackPanel1.1 虚拟化功能介绍1、在Window中添加一个ListBox控件。2、在设计视图中用鼠标选中ListBox控件并右健依次单击“编辑其他模板”&#xff0d;“编辑项的布局模板”&#xff0d;“编辑副本”。3、查看生成的模板代码。 1.2 虚拟化参数介绍…

基于free5gc模拟5G核心网和UERANSIM模拟5G用户设备的模拟5G网络环境的部署搭建方法总结和解析。

简介&#xff1a;下文介绍了基于free5gc模拟5G核心网和UERANSIM模拟5G用户设备的模拟5G网络环境的部署搭建方法&#xff0c;并且通过完成相关配置&#xff0c; 简单实现测试5G用户设备接入核心网的注册流程、去注册流程&#xff0c;模拟了一个用户设备通过模拟核心网进行实际的…

Python输出多位数

作者制作不易&#xff0c;关注、点赞、收藏一下吧&#xff01; 1.第一种:正常直接用循环 以三位数为例: for i in range(100, 1000):print(i) 运行结果( 展示一部分 ): 图1-1 2.第二种:特定位数 以三位数为例: for i in range(1, 5): # 括号内指定那个位的范围for j in r…

STM32F4按键状态机--单击、双击、长按

STM32F4按键状态机--单击、双击、长按 一、状态机的三要素二、使用状态机原因2.1资源占用方面2.2 执行效率方面&#xff1a;2.3 按键抖动方面&#xff1a; 三、状态机实现3.1 状态机分析3.1 程序实现 百度解析的状态机概念如下 状态机由状态寄存器和组合逻辑电路构成&#xff0…

SQL【2】稍稍进阶

目录 首先&#xff0c;怎么安装&#xff0c;环境怎么调。 alter——改变&#xff08;此段Al&#xff09; 创建于删除数据库、表格 上一节进阶 预设值default​编辑 关于插入顺序 有条件的删除DELETE FROM 表 WHERE 条件 多种语句组合查看 查看排序​编辑 LIMIT 2只取前…

Leetcode面试经典150题-221.最大正方形

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**本题一看就是典型的动态规划&#xff0c;要找以每个点为右下角的正方形的面积&#xff0c;然后取最大的这个题要注意找规律&#xff0c;我找到的规律如下&#xff1a;1.以第一行为右下角的&#xff0c;因为正…

ADC——模数转换器

一、转换流程 在处理器中主要进行ADC 1、AD转换流程 &#xff1a;采样、保持、量化、编码 通过比较器获得的电信号转换数字信号&#xff0c;根据自己需求&#xff0c;如果要求速率就可以使用较多的比较器&#xff0c;不要求速率考虑成本就可以使用较少的比较器&#xff0c;将最…

Vue学习笔记 二

4、Vue基础扩展 4.1 插槽 组件的最大特性就是复用性&#xff0c;而用好插槽能大大提高组件的可复用能力在Vue中插槽是很重要的存在&#xff0c;通过插槽&#xff0c;我们可以把父组件中指定的DOM作用到子组件的任意位置&#xff0c;后面我们坐项目用到的组件库比如element-ui…

5、Django Admin后台移除“删除所选”操作

默认情况下&#xff0c;Django Admin后台的listview模型列表页&#xff0c;会有一个Delete Selected删除所选操作。假设你需要再从Hero管理模型中移除该删除操作。 ModelAdmin.get_actions方法可以返回所有的操作方法。通过覆盖此方法&#xff0c;移除其中delete_selected方法…

Python 优雅编程:会报恩的代码(五)

文章目录 引言从文本搜索指定单词&#xff0c;不区分单词的大小写使用 str.lower()使用 re 模块 从文本搜索多个单词&#xff0c;依旧不区分单词的大小写使用 str.lower() 和循环使用 re 模块 反复执行 re.compile&#xff0c;re 是否会缓存编译结果&#xff1f;结语 引言 在 …

苹果mac数据恢复概率大吗 mac数据恢复专业软件哪个好用

一般情况下&#xff0c;当我们把电脑中的数据删掉后&#xff0c;都会保存在回收站里面&#xff0c;但如果回收站被清空了或者数据在回收站中没有找到的话&#xff0c;那么&#xff0c;之前被删掉的数据还能恢复吗&#xff1f;恢复的概率有多大呢&#xff1f; 答案是可以的&…

链式栈、队列

1、链式栈&#xff1a; 声明&#xff1a; #ifndef _STACK_H #define _STACK_H #include<stdlib.h>typedef int DataType;typedef struct snode //节点 {DataType data;struct snode *pnext; }SNode_t;typedef struct stack //链表 {SNode_t *ptop;int clen; }St…

【python】—— Python爬虫实战:爬取珠海市2011-2023年天气数据并保存为CSV文件

目录 目标 准备工作 爬取数据的开始时间和结束时间 爬取数据并解析 将数据转换为DataFrame并保存为CSV文件 本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点: 使用r…