Python爬虫图片:从入门到精通

news2024/11/15 7:18:27

在数字化时代,图片作为信息传递的重要媒介之一,其获取和处理变得越来越重要。Python作为一种功能强大且易于学习的编程语言,非常适合用来编写爬虫程序,帮助我们自动化地从互联网上获取图片资源。本文将从基础到高级,详细介绍如何使用Python编写图片爬虫。

1. Python爬虫基础

Python爬虫基础是构建任何网络爬虫的起点,无论是用于获取文本数据还是图片。以下是Python爬虫基础的关键要素:

1.1 什么是爬虫

爬虫(Web Crawler 或 Spider)是一种自动浏览网络的程序,它按照一定的算法顺序访问网页,抓取网页上的信息。

1.2 爬虫的工作原理

  1. 发送请求:爬虫向目标网站发送HTTP请求。
  2. 接收响应:服务器响应请求并返回网页内容。
  3. 解析内容:爬虫解析返回的HTML或JSON内容,提取所需信息。
  4. 存储数据:将提取的数据保存到数据库或文件中。
  5. 跟踪链接:爬虫识别网页中的链接,并跟踪这些链接继续抓取。

1.3 Python语言的优势

  • 易于学习:Python语法简洁,易于上手。
  • 丰富的库:Python有大量的库来支持网络请求、数据解析和处理等任务。

1.4 常用Python库

  • Requests:用于发送HTTP请求。
  • BeautifulSoup 或 lxml:用于解析HTML和XML文档。
  • Scrapy:一个强大的爬虫框架,适用于构建大型爬虫项目。
  • Pandas:数据处理和分析。
  • SQLAlchemy:数据库ORM工具,简化数据库操作。

1.5 爬虫的基本组件

  • URL管理器:负责管理待爬取的URL队列。
  • 下载器:负责获取网页内容。
  • 解析器:负责解析网页内容,提取数据。
  • 存储器:负责将数据存储到数据库或文件中。
  • 调度器:负责控制爬虫的流程和行为。

1.6 编写第一个Python爬虫

以下是一个简单的Python爬虫示例,使用Requests和BeautifulSoup库:

import requests
from bs4 import BeautifulSoup

# 目标网页URL
url = 'http://example.com'

# 发送GET请求
response = requests.get(url)

# 检查请求是否成功
if response.status_code == 200:
    # 解析网页内容
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 提取网页的标题
    title = soup.find('title').get_text()
    print('网页标题:', title)
    
    # 可以继续提取其他信息...
else:
    print('请求失败,状态码:', response.status_code)

1.7 注意事项

  • 遵守Robots协议:尊重网站的爬虫政策,避免对网站造成负担。
  • 设置请求间隔:避免过快地发送请求,以免对服务器造成压力。
  • 异常处理:编写爬虫时要考虑异常处理,确保爬虫的稳定性。

1.8 结论

Python爬虫基础涵盖了爬虫的定义、工作原理、Python的优势、常用库、基本组件以及如何编写简单的爬虫程序。掌握这些基础知识是深入学习爬虫技术,包括图片爬虫的前提。

在接下来的章节中,我们将深入探讨图片爬虫的特定技术和策略,帮助读者更高效地获取和处理网络图片资源。

2. 图片爬虫概述

图片爬虫是网络爬虫的一种特殊形式,专注于从互联网上抓取图片资源。与文本数据爬虫相比,图片爬虫在技术上有一些独特的考量和挑战。

2.1 图片爬虫的定义

图片爬虫是一种自动下载网页中图片的程序,它可以识别图片链接并将其保存到本地或云存储中。

2.2 图片爬虫的应用场景

  • 数据收集:为机器学习或图像识别算法收集训练数据。
  • 内容聚合:创建图片画廊或图片分享平台。
  • 市场研究:分析特定行业的图片使用趋势。
  • 个人项目:获取特定主题或兴趣的图片资源。

2.3 图片爬虫的技术要点

  • 图片URL识别:从HTML中提取图片的直接链接。
  • 反爬虫策略:应对网站采取的反爬虫措施。
  • 多线程/异步下载:提高图片下载的效率。
  • 错误处理:处理下载失败、链接无效等问题。

2.4 图片爬虫的挑战

  • 动态加载内容:某些图片可能通过JavaScript动态加载,需要特殊处理。
  • 反爬机制:网站可能采用各种反爬虫技术,如IP封锁、请求频率限制等。
  • 版权问题:下载和使用图片可能涉及版权问题。

2.5 图片爬虫的开发步骤

  1. 确定目标网站:选择要爬取图片的网站或网页。
  2. 分析网页结构:使用浏览器的开发者工具分析网页,找到图片URL的来源。
  3. 编写爬虫代码:使用Python编写爬虫程序,实现图片的下载。
  4. 测试和优化:测试爬虫的性能,优化下载速度和稳定性。
  5. 遵守法律和道德规范:确保爬虫活动合法合规,尊重版权。

2.6 图片爬虫示例

以下是一个简单的Python图片爬虫示例,使用Requests库下载图片:

import requests
import os

def download_image(url, path):
    response = requests.get(url)
    if response.status_code == 200:
        with open(path, 'wb') as f:
            f.write(response.content)

# 图片URL和保存路径
image_url = 'http://example.com/image.jpg'
image_path = 'path/to/your/directory/image.jpg'

# 下载图片
download_image(image_url, image_path)
print('图片下载完成。')

2.7 结论

图片爬虫为自动化图片收集提供了一种有效手段,但同时也带来了技术挑战和法律风险。开发者在编写图片爬虫时,需要充分考虑这些因素,确保爬虫的高效性、稳定性和合法性。在后续章节中,我们将深入探讨图片爬虫的具体实现技术和高级策略。

3. 环境搭建与依赖库

在开始编写Python图片爬虫之前,需要搭建合适的开发环境,并安装所需的依赖库。这一步骤对于确保代码的顺利运行和后续开发至关重要。

3.1 Python环境搭建

安装Python

  • 访问Python官网下载并安装Python。
  • 可以选择安装Python 2或Python 3,但推荐使用Python 3,因为它是当前的主流版本。
  • 可以参考我之前写的文章:01-Python详细安装教程(大妈看了都会)

创建虚拟环境

  • 使用虚拟环境可以隔离项目依赖,避免不同项目间的依赖冲突。
  • 在命令行中执行以下命令创建虚拟环境:
    python -m venv myenv
  • 激活虚拟环境:
    • Windows:
      myenv\Scripts\activate
    • macOS/Linux:
      source myenv/bin/activate

3.2 依赖库安装

使用pip安装依赖

  • 在激活虚拟环境后,使用pip安装所需的库:
    pip install requests beautifulsoup4 pillow lxml

依赖库说明

  • Requests:用于发送HTTP请求,获取网页内容。
  • BeautifulSoup:用于解析HTML和XML文档,提取数据。
  • Pillow:Python Imaging Library的更新版,用于处理图像文件。
  • lxml:另一个高效的解析库,可以作为BeautifulSoup的解析器。

3.3 编辑器或IDE选择

  • 选择编辑器:选择一个适合自己的代码编辑器,如VSCode、Sublime Text、Atom等。
  • 配置IDE:如果使用集成开发环境(IDE),如PyCharm,确保配置好Python解释器和虚拟环境。

3.4 测试环境

  • 在安装完所有依赖后,创建一个简单的Python脚本测试环境是否搭建成功:
    import requests
    import bs4
    
    print("Requests version:", requests.__version__)
    print("BeautifulSoup version:", bs4.__version__)

3.5 版本管理

  • 使用版本控制系统,如Git,来管理你的代码和依赖。
  • 创建requirements.txt文件来记录项目依赖的版本:
    pip freeze > requirements.txt

3.6 依赖库的高级使用

  • 学习Requests、BeautifulSoup、Pillow等库的高级用法,以应对更复杂的爬虫任务。

3.7 结论

搭建一个稳定且高效的开发环境是编写Python图片爬虫的第一步。通过安装Python、创建虚拟环境、安装依赖库、选择编辑器或IDE以及进行版本管理,可以为后续的开发工作打下坚实的基础。确保你熟悉这些工具和库,以便在编写爬虫时能够更加得心应手。

4. 解析网页内容

一旦你通过requests库获取了网页数据,下一步就是解析这些数据以提取有用的信息。对于图片爬虫来说,主要任务是找到图片的URL并下载它们。Python中最常用的解析库是BeautifulSoup

4.1 BeautifulSoup库简介

BeautifulSoup是一个用于解析HTML和XML文档的库,它能够从复杂的HTML文档中提取数据。

安装BeautifulSoup

如果尚未安装BeautifulSoup,可以通过以下命令安装:

pip install beautifulsoup4

4.2 使用BeautifulSoup解析HTML

from bs4 import BeautifulSoup

# 假设response.text包含了网页的HTML内容
soup = BeautifulSoup(response.text, 'html.parser')

# 使用BeautifulSoup查找标签
for img_tag in soup.find_all('img'):
    print(img_tag.get('src'))  # 打印<img>标签的src属性

4.3 定位图片URL

  • 通常图片的URL位于<img>标签的src属性中。
  • 有时图片可能是通过CSS背景、JavaScript动态加载等方式嵌入的,这需要更高级的解析技术。

4.4 处理相对URL

  • 如果图片URL是相对路径,需要转换为绝对路径:
    from urllib.parse import urljoin
    absolute_url = urljoin(response.url, img_src)

4.5 过滤和选择图片

  • 根据图片的属性(如高度、宽度、文件类型)进行过滤:
    for img_tag in soup.find_all('img', {'src': True}):
        if '.jpg' in img_tag['src'] and int(img_tag.get('height', 0)) > 100:
            print(img_tag['src'])

4.6 异常处理

  • 在解析过程中,应对可能出现的异常进行处理:
    try:
        # 解析代码
    except Exception as e:
        print("解析错误:", e)

4.7 使用CSS选择器

  • BeautifulSoup支持CSS选择器来更精确地定位元素:
    img_tags = soup.select('div.gallery img')  # 选择在class为gallery的div下的img标签

4.8 使用正则表达式

  • 对于某些复杂的HTML结构,可以使用正则表达式辅助提取信息:
    import re
    pattern = re.compile(r'<img src="(.*?)"')
    for match in pattern.finditer(response.text):
        print(match.group(1))

4.9 性能优化

  • 当解析大量数据时,性能可能成为问题。考虑使用lxml作为解析器,它通常比默认的html.parser更快:
    soup = BeautifulSoup(response.text, 'lxml')

4.10 结论

解析网页内容是爬虫开发中的另一个关键步骤。BeautifulSoup是一个强大的工具,可以帮助你轻松提取HTML文档中的数据。在编写图片爬虫时,你需要熟练使用BeautifulSoup来找到图片的URL,并处理可能遇到的各种情况,包括相对URL转换、异常处理和性能优化。此外,根据网页的不同结构,可能还需要使用正则表达式等其他技术来辅助解析。

5. 图片下载策略

一旦你使用爬虫技术定位并获取了图片的URL,接下来的任务就是将这些图片下载到本地系统中。以下是一些有效的图片下载策略:

5.1 单线程下载

最基本的下载方法是使用单线程按顺序下载每张图片:

import requests

def download_image(url, path):
    response = requests.get(url)
    if response.status_code == 200:
        with open(path, 'wb') as f:
            f.write(response.content)

5.2 多线程下载

为了提高下载效率,可以使用threading模块实现多线程下载:

import threading

def download_image_with_thread(url, path):
    thread = threading.Thread(target=download_image, args=(url, path))
    thread.start()

5.3 异步下载

Python的asyncio库和aiohttp库可以用于异步下载,特别适合I/O密集型任务:

import aiohttp
import asyncio

async def download_image_async(session, url, path):
    async with session.get(url) as response:
        with open(path, 'wb') as f:
            while True:
                chunk = await response.content.read(1024)
                if not chunk:
                    break
                f.write(chunk)

async def main(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [download_image_async(session, url, f'image_{i}.jpg') for i, url in enumerate(urls)]
        await asyncio.gather(*tasks)

# 调用main函数并传入图片URL列表

5.4 断点续传

对于大文件,实现断点续传可以避免因中断而重新开始下载:

def download_image_with_resume(url, path):
    try:
        with requests.Session() as s:
            s.trust_env = False
            r = s.get(url, stream=True)
            if r.status_code == 200:
                with open(path, 'ab') as f:  # 'ab' 追加二进制模式
                    for chunk in r.iter_content(chunk_size=8192):
                        if chunk:
                            f.write(chunk)
    except requests.exceptions.RequestException as e:
        print(e)

5.5 错误处理

在下载过程中,应妥善处理可能发生的错误,如网络问题或文件写入错误:

try:
    download_image(url, path)
except requests.exceptions.RequestException as e:
    print(f"下载失败: {e}")

5.6 用户代理和Cookies

为了绕过一些简单的反爬虫机制,可以在请求中添加用户代理和Cookies:

headers = {'User-Agent': 'Your User Agent String'}
response = requests.get(url, headers=headers, cookies=your_cookies)

5.7 代理使用

当目标网站限制了你的IP时,可以使用代理来下载图片:

proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}
response = requests.get(url, proxies=proxies)

5.8 限速下载

为了避免对目标网站服务器造成过大压力,可以限制下载速度:

class BandwidthLimiter(object):
    def __init__(self, max_bandwidth):
        self.max_bandwidth = max_bandwidth

    def __enter__(self):
        self.start_time = time.time()

    def __exit__(self, exc_type, exc_val, exc_tb):
        if (time.time() - self.start_time) >= self.max_bandwidth:
            time.sleep(self.max_bandwidth - (time.time() - self.start_time))

# 使用示例
with BandwidthLimiter(max_bandwidth=0.5):  # 限制在0.5秒内完成下载
    download_image(url, path)

5.9 结论

图片下载策略需要根据你的具体需求和目标网站的特点来定制。单线程下载简单但效率低,多线程和异步下载可以显著提高效率,而断点续传和错误处理则增强了下载的稳定性和可靠性。同时,考虑到网站的反爬虫机制,可能需要使用用户代理、Cookies和代理等技术来规避限制。最后,限速下载是出于对网站服务器的尊重和遵守Robots协议的考虑。

6. 处理反爬虫机制

在开发爬虫时,经常会遇到网站采取的反爬虫机制,这些机制旨在限制或阻止自动化程序访问网站。以下是一些常见的反爬虫策略和应对方法:

6.1 常见反爬虫机制

  1. IP限制:短时间内多次请求同一IP地址被封锁。
  2. User-Agent检查:检查请求的User-Agent是否为常见的浏览器。
  3. Cookies限制:需要有效的Cookies才能访问某些页面。
  4. 验证码:需要人工输入验证码以验证请求是否来自真人。
  5. 动态令牌:通过JavaScript生成的动态令牌,需要执行JS才能获取。
  6. 隐藏资源:通过CSS或JavaScript动态加载的图片和链接。
  7. HTTPS:强制使用HTTPS协议,增加抓包分析的难度。

6.2 应对策略

  1. 设置User-Agent: 使用常见的浏览器User-Agent模拟浏览器请求。

  2. 使用Cookies: 维持会话Cookies,或使用登录后的Cookies进行请求。

  3. 使用代理: 使用代理IP池,避免单个IP被封锁。

  4. 处理验证码: 使用OCR技术识别验证码,或人工打码平台。

  5. 浏览器自动化: 使用Selenium或Puppeteer模拟真实浏览器行为,执行JavaScript。

  6. 分布式爬虫: 使用分布式爬虫系统,分散请求来源。

  7. 降低请求频率: 设置合理的请求间隔,避免触发频率限制。

  8. 模拟正常用户行为: 模拟正常用户的浏览行为,如随机等待时间。

  9. 使用Web驱动: 对于动态加载的资源,使用WebDriver等待元素加载。

  10. HTTPS抓包: 使用Charles、Fiddler等工具进行HTTPS抓包分析。

6.3 示例:设置User-Agent和使用代理

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

proxies = {
    'http': 'http://123.456.78.90:8080',
    'https': 'https://123.456.78.90:8080',
}

response = requests.get('http://example.com', headers=headers, proxies=proxies)

6.4 结论

处理反爬虫机制是爬虫开发中的一个挑战。了解常见的反爬虫技术,并掌握相应的应对策略,是开发稳定爬虫的关键。在实施爬虫策略时,应始终遵守网站的使用条款和法律法规,尊重网站的Robots协议,合理合法地进行数据抓取。

7. 存储图片数据

下载图片后,存储和管理这些图片数据是图片爬虫的另一个重要环节。以下是几种常见的存储方法和实践:

7.1 本地文件系统存储

存储策略

  • 目录结构:创建一个有逻辑的目录结构,例如按照日期或主题分类。
  • 文件命名:给图片命名,确保名称唯一,避免覆盖。

示例代码

import os

def save_image(image_data, folder_path, file_name):
    # 确保目录存在
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
    
    # 保存图片
    with open(os.path.join(folder_path, file_name), 'wb') as file:
        file.write(image_data)

# 使用示例
response = requests.get(image_url)
if response.status_code == 200:
    save_image(response.content, 'path/to/folder', 'image.jpg')

7.2 云存储服务

流行的云存储服务

  • Amazon S3
  • Google Cloud Storage
  • Microsoft Azure Blob Storage
  • 阿里云OSS

存储策略

  • 桶(Bucket):在云存储服务中创建桶来存储图片。
  • 访问权限:设置合适的访问权限,如私有或公共读取。

示例代码(以AWS S3为例)

import boto3

def upload_to_s3(file_path, bucket_name, s3_file_name):
    s3 = boto3.client('s3')
    s3.upload_file(file_path, bucket_name, s3_file_name)

# 使用示例
with open('local_image.jpg', 'rb') as f:
    image_data = f.read()
    response = requests.post(upload_url, data=image_data)
    if response.status_code == 200:
        upload_to_s3('local_image.jpg', 'my-bucket', 'uploaded_image.jpg')

7.3 数据库存储

存储策略

  • 元数据:除了图片本身,还可以将图片的元数据(如URL、下载时间、描述等)存储在数据库中。
  • 数据库选择:关系型数据库(如MySQL、PostgreSQL)或非关系型数据库(如MongoDB)。

示例代码(以SQLite为例)

import sqlite3

def save_image_metadata(db_path, image_url, image_name):
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS images (url TEXT, name TEXT)")
    cursor.execute("INSERT INTO images (url, name) VALUES (?, ?)", (image_url, image_name))
    conn.commit()
    conn.close()

# 使用示例
save_image_metadata('images.db', image_url, 'image.jpg')

7.4 考虑因素

  • 备份:定期备份存储的图片数据,防止数据丢失。
  • 安全性:确保存储的图片数据安全,特别是当使用云存储服务时。
  • 访问速度:根据需要访问图片的速度选择合适的存储解决方案。

7.5 结论

存储图片数据需要考虑存储位置、数据安全、访问速度和成本等因素。本地文件系统适合小规模项目,而云存储服务提供了更好的可扩展性和可靠性。数据库存储则有助于管理图片的元数据。开发者应根据项目需求和资源选择合适的存储策略。同时,确保遵守数据保护法规和最佳实践,妥善管理图片数据。

8. 高级技巧与实战

在掌握了Python爬虫的基本技能后,可以通过一些高级技巧来提升爬虫的性能、效率和智能化水平。以下是一些高级技巧和实战应用的示例:

8.1 使用Scrapy框架

Scrapy是一个快速的、高层次的web抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。

  • 安装Scrapy

    pip install scrapy
  • 创建Scrapy项目

    scrapy startproject myproject
  • 定义Item和Spider

    # myproject/items.py
    import scrapy
    
    class ImageItem(scrapy.Item):
        url = scrapy.Field()
        image_urls = scrapy.Field()
        filename = scrapy.Field()
    
    # myproject/spiders/example.py
    from scrapy.spiders import CrawlSpider
    from myproject.items import ImageItem
    
    class ExampleSpider(CrawlSpider):
        name = 'example'
        allowed_domains = ['example.com']
        start_urls = ['http://www.example.com']
    
        def parse(self, response):
            item = ImageItem()
            item['url'] = response.url
            # 根据实际情况提取图片URL
            return item

8.2 浏览器自动化测试工具

使用Selenium或Puppeteer等工具模拟浏览器行为,处理JavaScript渲染的页面。

  • 安装Selenium

    pip install selenium
  • 使用Selenium获取动态内容

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://www.example.com')
    # 等待页面加载完成,或执行某些操作
    html = driver.page_source
    driver.quit()

8.3 分布式爬虫

对于需要处理大规模数据的爬虫任务,可以使用分布式爬虫架构来提高效率。

  • 使用Scrapy的分布式功能: Scrapy可以与Celery、RabbitMQ等配合使用,实现分布式爬取。

8.4 爬虫的自我学习和优化

  • 使用机器学习识别内容: 利用机器学习算法自动识别和分类网页内容。

  • 动态调整请求策略: 根据爬取的反馈动态调整请求频率、User-Agent等。

8.5 处理大规模数据

  • 使用数据库: 对于大规模数据,使用数据库存储比文件系统更有效。

  • 数据清洗和预处理: 对爬取的数据进行清洗和预处理,提高数据质量。

8.6 遵守法律和道德规范

  • 尊重Robots协议: 检查并遵守网站的robots.txt文件。

  • 合法合规: 确保爬虫活动符合相关法律法规。

8.7 结论

高级爬虫技巧和实战应用可以帮助开发者构建更高效、更智能的爬虫系统。使用Scrapy框架、浏览器自动化工具、分布式架构以及机器学习技术,可以显著提升爬虫的性能和数据处理能力。同时,开发者应始终注意遵守法律和道德规范,尊重网站的数据使用政策。通过不断学习和实践,开发者可以掌握更高级的爬虫技术,应对各种复杂的爬取任务。

9. 法律与道德考量

在开发和运行爬虫程序时,法律和道德考量是至关重要的。这些考量不仅影响爬虫的合法性,还涉及到个人和公司的声誉。

9.1 法律考量

遵守法律法规

  • 确保爬虫活动遵守所在国家或地区的法律法规,包括但不限于版权法、隐私法和计算机欺诈与滥用法。

尊重版权

  • 许多网站的内容都是受版权保护的。在下载和使用图片、文本或其他媒体内容时,必须尊重版权所有者的权利。

Robots协议

  • 遵守目标网站的robots.txt文件,这是网站所有者指定爬虫可以或不能访问的网页的标准。

个人数据保护

  • 如果爬虫涉及到个人数据,需要确保遵守相关的数据保护法规,如欧盟的通用数据保护条例(GDPR)。

9.2 道德考量

尊重网站所有者

  • 即使法律没有明确禁止,也应该尊重网站所有者不希望被爬取的意愿。

避免滥用爬虫

  • 不应该使用爬虫进行不正当竞争、侵犯隐私或干扰网站正常运行。

透明使用

  • 在可能的情况下,公开说明爬虫的使用目的和方式,保持透明。

9.3 技术实践

限制请求频率

  • 避免对目标网站服务器造成过大压力,合理设置爬虫的请求频率。

用户代理

  • 诚实地使用用户代理字符串,不要伪装成其他用户代理。

错误处理

  • 在爬虫中实现错误处理机制,确保在遇到问题时能够优雅地停止或重试。

9.4 社区和行业标准

参与讨论

  • 参与爬虫相关的社区讨论,了解行业最佳实践和标准。

持续学习

  • 法律和道德标准是不断发展的,持续学习以确保爬虫活动始终符合最新的要求。

9.5 结论

法律和道德是爬虫开发和使用中不可忽视的两个方面。开发者必须确保他们的爬虫程序在法律允许的范围内运行,并且遵守道德规范。通过尊重版权、个人数据和网站所有者的意愿,开发者可以建立一个积极、负责任的爬虫使用者形象。同时,随着技术的发展和法律的更新,持续关注和学习相关的法律和道德议题对于每个开发者来说都是必要的。

结语 

编写Python图片爬虫是一个涉及多方面技能的过程,从基础的网络请求到高级的反爬虫策略,再到法律和道德的考量,每一步都至关重要。希望本文能帮助你构建自己的图片爬虫,高效地获取和处理网络图片资源。

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

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

相关文章

CTF密码学小结

感觉没啥好总结的啊 基础的永远是RSA、流密码、哈希、对称密码、古典密码那一套&#xff08;密码学上过课都会&#xff09;&#xff0c;其他的就是数论的一些技巧 似乎格密码也很流行&#xff0c;以及一些奇奇怪怪的性质利用也很多 1、random设置种子后随机的性质&#xff1a…

【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【Hello World、LED点灯、Memory测速、替换BIOS】

目录 开发板介绍下载仓库工程设计工程构建构建流程 工程测试Hello WorldLED点灯Memory测速替换BIOS 开发板信息 开发板介绍 手头目前只有一个购买的BoChenK7开发板&#xff0c;后续会用它来进行LiteX FPGA SoC的构建 测试可能会包括&#xff1a; LED&#xff1a;本篇文章 DDR …

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…

【Docker】Docker Volume(存储卷)

一、什么是存储卷 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。 在宿主…

xss-靶场

一、环境地址 XSS Game - Learning XSS Made Simple! | Created by PwnFunction 二、案例复现 案列1——Ma Spaghet&#xff01; <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(location).searchParams…

idea2022新建jsp项目并配置Tomcat服务器

1、创建项目 2、添加jdk 步骤如下&#xff0c;然后点击下边的create 创建项目即可 3、点击file 4、选择模块添加web 5、配置tomcat 6、依次点击 7、新建jsp文件 8、成功显示

Python 全栈系列262 使用sqlalchemy(clickhouse)

说明 再补充一篇。之前连不上的原因也挺搞笑&#xff0c;大概是deepseek把我带偏了&#xff0c; 应该是 pip3 install clickhouse-sqlalchemy -i https://mirrors.aliyun.com/pypi/simple/ 但是它教我 pip3 install sqlalchemy-clickhouse -i https://mirrors.aliyun.com/py…

Keepalived总结笔记

环境准备&#xff1a;两台安装ka的服务器&#xff0c;两台客户机&#xff0c;IP无要求&#xff0c;关闭火墙和selinux 1.在两台主机上安装ka 全局配置文件在/etc/keepalived/keepalived.conf 可以改写邮件地址和发送邮件的地址和主机唯一标识以及组播地址 配置虚拟路由&…

基于单片机的智能晾衣系统设计

摘 要 &#xff1a;在网络信息技术的推动下&#xff0c;智能家居得到了广泛应用&#xff0c;文章根据当前的市场动态&#xff0c;针对基于单片机的智能晾衣系统设计展开论述&#xff0c;具体包括两个方面的内容———硬件设计和软件设计。 关键词 &#xff1a;单片机&#xff…

经方药食两用服务平台

TOC springboot226经方药食两用服务平台 绪论 1.1研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务&#xff0c;逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速&#xff0c;使用起来非常简单容易&#xff0c;用户甚至不用掌握相关的专业知识…

【经典算法】BFS_最短路问题

1. 最短路问题介绍 最短路径问题是图论中的一类十分重要的问题。本篇文章只介绍边权为1(或边权相同)的最简单的最短路径问题。所谓边权&#xff0c;就是两点之间的距离。 这类问题通俗的说就是告诉你起点和终点&#xff0c;要你找出最短的路径或是最短路径是多少。 解决方法&…

每日OJ_牛客_DP3跳台阶扩展问题

目录 DP3跳台阶扩展问题 题解代码1&#xff08;dp&#xff09; 题解代码2&#xff08;找规律&#xff09; DP3跳台阶扩展问题 跳台阶扩展问题_牛客题霸_牛客网 题解代码1&#xff08;dp&#xff09; 假定第一次跳的是一阶&#xff0c;那么剩下的是n-1个台阶&#xff0c;跳法…

汇编语言:jcxz 指令

‌ 在汇编语言中&#xff0c;jcxz 标号 指令是一个有条件转移指令&#xff0c;用于检测CX寄存器的值&#xff0c;如果CX寄存器的值为0&#xff0c;则跳转到指令中标号所指定的地址处执行&#xff1b;否则&#xff0c;指令将继续顺序执行。‌ 1. jcxz 标号 &#xff0…

超市收银出入库进销存库存管理系统java数据库SpringBoot前端VUE

系统设计是一个把软件需求转换成用软件系统表示的过程[9]。通过对目标系统的分析和研究&#xff0c;做出了对师范学院实习管理系统的总体规划&#xff0c;这是全面开发系统的重要基础。在对实习管理系统全面分析调查的基础上&#xff0c;制定出商品销售系统的总体规划。系统设计…

KEEPALIVED的高可用实现

目录 一.高可用集群 1.1 集群类型 Keepalived 环境准备 1.2Keepalived 相关文件 1.3实验步骤 1.3.1HTTP配置 1.3.2安装KA 1.3.3实现master/slave的 Keepalived 单主架构 1.3.4抢占模式和非抢占模式 非抢占模式 抢占模式 抢占延迟模式 preempt_delay 1.3.5开启KA…

习题2.38-2.39

2.38这个题目特别有意思,能比较深的理解什么是左侧优先右侧优先。先看看实现代码 ;;满足交换律,即操作函数的参数可相互交换,其结果不变 (defn fold-right[op initial sequences](if (empty? sequences)initial(op (first sequences)(accumulate op initial (rest sequence…

快讯 | 28页知网侵权函难挡秘塔AI:多家数据库抢着合作!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API

实时监测环境数据是一个非常常见的应用场景&#xff0c;例如气象站、智能家居等。这篇博客将带你使用 ESP32 微控制器和一个 TFT 屏幕&#xff0c;实时显示当前城市的天气信息。通过 OpenWeatherMap API&#xff0c;我们能够获取诸如温度、天气情况以及经纬度等详细的天气数据&…

【书生大模型实战营(暑假场)闯关材料】基础岛:第1关 书生大模型全链路开源体系

【书生大模型实战营&#xff08;暑假场&#xff09;闯关材料】基础岛&#xff1a;第1关 书生大模型全链路开源体系 简介一、背景介绍1.1 背景介绍1.2 全链路开源开放体系的优势 二、全链路开源开放体系的主要特点2.1 模型组件的公开和共享2.2 数据集的公开和共享2.3 模型的互操…

2024年【汽车驾驶员(技师)】报名考试及汽车驾驶员(技师)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;技师&#xff09;报名考试是安全生产模拟考试一点通生成的&#xff0c;汽车驾驶员&#xff08;技师&#xff09;证模拟考试题库是根据汽车驾驶员&#xff08;技师&#xff09;最新版教材汇编出…