【Python爬虫(63)】从0到1:打造图片与视频爬虫攻略

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。

目录

  • 一、图片爬虫的实现
    • 1.1 发送 HTTP 请求获取网页内容
    • 1.2 解析 HTML 获取图片链接
    • 1.3 处理特殊的图片链接情况
    • 1.4 下载图片到本地
  • 二、视频爬虫的技术要点
    • 2.1 分析目标视频网站
    • 2.2 发送请求获取视频页面内容
    • 2.3 解析视频播放链接
    • 2.4 下载视频文件
  • 三、处理图片与视频的版权问题与合规性
    • 3.1 了解版权相关法律法规
    • 3.2 尊重网站的 Robots 协议
    • 3.3 获取合法授权
    • 3.4 合理使用原则


一、图片爬虫的实现

1.1 发送 HTTP 请求获取网页内容

在 Python 中,我们通常使用requests库来发送 HTTP 请求。这个库简单易用,功能强大,能够满足大多数网页请求的需求。在发送请求前,我们需要先安装requests库,可以使用pip install requests命令进行安装。

下面是一个简单的示例,展示如何使用requests库发送 GET 请求获取网页内容:

import requests

url = 'https://example.com'  # 目标网页URL
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}  # 设置请求头,模拟浏览器访问,避免被反爬虫机制识别

try:
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # 检查请求是否成功,若状态码不是200则抛出异常
    html_content = response.text
    print(html_content)
except requests.exceptions.RequestException as e:
    print(f'请求发生错误: {e}')

在上述代码中,我们首先定义了目标网页的 URL 和请求头headers。User - Agent是请求头中的一个重要字段,它告诉服务器我们使用的浏览器和操作系统信息。通过设置合理的User - Agent,可以使我们的爬虫行为更像真实用户,降低被反爬虫的风险。

使用requests.get()方法发送 GET 请求,将 URL 和请求头作为参数传入。如果请求成功,response.status_code的值为 200,我们可以通过response.text获取网页的 HTML 内容。如果请求过程中发生错误,例如网络连接问题、服务器返回错误状态码等,requests库会抛出RequestException异常,我们可以捕获这个异常并进行相应的处理。

1.2 解析 HTML 获取图片链接

获取到网页的 HTML 内容后,我们需要从中提取图片链接。常用的解析 HTML 的库有BeautifulSoup和lxml。BeautifulSoup提供了简单的导航、搜索、修改分析树等功能,使得解析 HTML 和 XML 文档变得容易;lxml则是一个高性能的 XML 和 HTML 解析库,解析速度快,且支持 XPath 表达式,功能强大。

首先,我们需要安装这两个库,使用pip install beautifulsoup4 lxml命令进行安装。

使用BeautifulSoup解析 HTML 获取图片链接的示例代码如下:

from bs4 import BeautifulSoup

# 假设html_content是前面获取到的网页HTML内容
soup = BeautifulSoup(html_content, 'html.parser')
img_tags = soup.find_all('img')  # 查找所有的img标签

image_links = []
for img in img_tags:
    src = img.get('src')  # 获取img标签的src属性,即图片链接
    if src:
        image_links.append(src)

print(image_links)

在上述代码中,我们使用BeautifulSoup创建了一个BeautifulSoup对象soup,并指定解析器为html.parser。然后使用soup.find_all(‘img’)方法查找所有的img标签,遍历这些标签,通过img.get(‘src’)获取每个img标签的src属性值,即图片链接。如果src属性存在,将其添加到image_links列表中。

使用lxml库结合 XPath 表达式解析 HTML 获取图片链接的示例代码如下:

from lxml import etree

# 将HTML内容转换为lxml的Element对象
html = etree.HTML(html_content)
img_links = html.xpath('//img/@src')  # 使用XPath表达式查找所有img标签的src属性
print(img_links)

在这个示例中,我们使用etree.HTML()方法将 HTML 内容转换为lxml的Element对象。然后使用 XPath 表达式//img/@src查找所有img标签的src属性,//表示在整个文档中查找,img表示查找img标签,@src表示获取img标签的src属性。

不同网站的 HTML 结构和图片链接的表示方式可能存在差异。有些网站可能会将图片链接放在data - original等自定义属性中,而不是常规的src属性。对于这种情况,我们需要根据具体网站的 HTML 结构,调整解析代码。例如,如果某个网站使用data - original属性存储图片链接,我们可以这样修改BeautifulSoup的解析代码:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_content, 'html.parser')
img_tags = soup.find_all('img')

image_links = []
for img in img_tags:
    src = img.get('data - original') or img.get('src')  # 优先获取data - original属性,若不存在则获取src属性
    if src:
        image_links.append(src)

print(image_links)

1.3 处理特殊的图片链接情况

在实际的爬虫过程中,我们可能会遇到一些特殊的图片链接情况,例如懒加载导致的图片链接获取异常。懒加载是一种网页优化技术,它延迟加载网页上的某些部分,以加速网页的加载速度和提高性能。在使用懒加载技术的图片网站上,只有当用户滚动到页面上的某一部分时,该部分的图片才会开始加载。在这种情况下,当我们直接获取网页的 HTML 内容时,可能会发现图片的src属性为空或者是一个占位链接,而真实的图片链接存储在其他自定义属性中,如data - original。

以站长之家的图片爬取为例,在爬取该网站的图片时,解析图片的src属性后得到的链接不正确,但查看网页结构会发现data - original属性中存储的才是正确的图片链接。此时,我们只需要将解析src属性的代码更改为解析data - original属性即可。示例代码如下:

import requests
from lxml import etree

url = 'https://sc.chinaz.com/tupian/jianzhutupian.html'
headers = {
    'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50'
}
resp = requests.get(url, headers=headers).content.decode('utf-8')
et = etree.HTML(resp)
img_list = et.xpath('//div[contains(@class, "tupian - list")]/div[contains(@class, "item")]/img')
for img in img_list:
    img_src = img.xpath('./@data - original')[0]  # 解析data - original属性获取图片链接
    print(img_src)

另外,有些网站可能会对图片链接进行加密或者使用复杂的 JavaScript 逻辑来生成图片链接。对于这种情况,处理起来相对复杂。可能需要分析网站的 JavaScript 代码,找出图片链接的生成逻辑,然后使用Selenium等工具结合浏览器驱动来执行 JavaScript 代码,获取真实的图片链接。例如,如果网站使用 JavaScript 动态生成图片链接,我们可以使用Selenium打开网页,等待页面加载完成并执行相关的 JavaScript 代码,然后再获取图片链接。示例代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化浏览器驱动,这里以Chrome为例
driver = webdriver.Chrome()
url = 'https://example.com'
driver.get(url)

# 等待页面加载完成,直到某个图片元素出现
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.TAG_NAME, 'img'))
)

img_tags = driver.find_elements(By.TAG_NAME, 'img')
image_links = []
for img in img_tags:
    src = img.get_attribute('src')
    if src:
        image_links.append(src)

print(image_links)
driver.quit()

1.4 下载图片到本地

获取到图片链接后,我们就可以将图片下载到本地。在 Python 中,我们可以使用urllib.request或requests库来实现图片下载。

使用urllib.request库下载图片的示例代码如下:

import urllib.request

image_url = 'https://example.com/image.jpg'  # 图片链接
save_path = 'path/to/save/image.jpg'  # 保存路径和文件名

try:
    urllib.request.urlretrieve(image_url, save_path)
    print(f'图片下载成功,保存到: {save_path}')
except Exception as e:
    print(f'图片下载失败: {e}')

在上述代码中,urllib.request.urlretrieve()方法接受两个参数,第一个参数是图片的 URL,第二个参数是保存图片的路径和文件名。该方法会自动从指定的 URL 下载图片,并保存到指定的路径。

使用requests库下载图片的示例代码如下:

import requests

image_url = 'https://example.com/image.jpg'
save_path = 'path/to/save/image.jpg'

try:
    response = requests.get(image_url)
    response.raise_for_status()  # 检查请求是否成功
    with open(save_path, 'wb') as f:
        f.write(response.content)
    print(f'图片下载成功,保存到: {save_path}')
except requests.exceptions.RequestException as e:
    print(f'图片下载失败: {e}')

在这个示例中,我们使用requests.get()方法发送 GET 请求获取图片的二进制数据。如果请求成功,通过response.content获取图片的二进制内容,然后使用 Python 的文件操作,以二进制写入模式(‘wb’)打开文件,并将图片数据写入文件中。

在设置保存路径和命名规则时,我们可以根据实际需求进行灵活处理。例如,可以根据图片的来源网站、图片的类别等信息来构建保存路径和文件名。同时,为了避免文件重名覆盖,我们可以使用一些唯一标识,如时间戳、图片链接的哈希值等作为文件名的一部分。另外,在下载过程中,可能会遇到网络波动、服务器响应异常等问题,导致下载失败。我们可以通过设置重试机制来提高下载的成功率。例如,使用retry库来实现重试功能:

import requests
from retry import retry

image_url = 'https://example.com/image.jpg'
save_path = 'path/to/save/image.jpg'


@retry(tries=3, delay=2)  # 最多重试3次,每次重试间隔2秒
def download_image():
    try:
        response = requests.get(image_url)
        response.raise_for_status()
        with open(save_path, 'wb') as f:
            f.write(response.content)
        print(f'图片下载成功,保存到: {save_path}')
    except requests.exceptions.RequestException as e:
        print(f'图片下载失败: {e}')


download_image()

在上述代码中,使用@retry装饰器对下载函数进行装饰,设置tries=3表示最多重试 3 次,delay=2表示每次重试间隔 2 秒。这样,当下载过程中出现异常时,会自动进行重试,提高了下载的稳定性。

二、视频爬虫的技术要点

2.1 分析目标视频网站

在进行视频爬虫之前,深入分析目标视频网站是关键的第一步。以常见的视频网站 B 站为例,我们可以借助浏览器的开发者工具来展开分析。在 Chrome 浏览器中,通过右键点击页面并选择 “检查”,或者直接使用快捷键 “Ctrl + Shift + I”(Windows)、“Cmd + Option + I”(Mac),即可打开开发者工具。

在开发者工具的 Elements 面板中,我们能够查看网页的 HTML 结构。通过仔细查找和定位,可以发现视频元素通常被包含在标签中。在 B 站的网页结构里,视频播放链接所在的位置较为隐蔽,可能需要展开多层标签才能找到。例如,在某个视频页面中,视频播放链接可能存储在

除了使用 Elements 面板,Network 面板也是我们分析视频网站的有力工具。在 Network 面板中,刷新视频页面后,所有的网络请求都会被清晰地展示出来。我们可以通过筛选请求类型、查看请求的 URL 和响应内容等方式,找到与视频相关的请求。一般来说,视频文件的请求通常是一个较大的文件,并且其 URL 的后缀可能是常见的视频格式,如.mp4、.flv等。通过分析这些请求,我们可以获取到视频的真实播放链接,以及一些与视频相关的参数,如视频的分辨率、码率等。

2.2 发送请求获取视频页面内容

在获取视频页面内容时,我们依然使用requests库来发送 HTTP 请求。由于视频网站通常会设置较为严格的反爬虫机制,所以在发送请求时,我们需要采取一系列措施来伪装我们的爬虫,使其更像真实用户的访问行为。

设置随机 User - Agent 是伪装请求的重要手段之一。User - Agent 包含了浏览器类型、版本、操作系统等信息,通过设置不同的 User - Agent,我们可以模拟不同的浏览器和设备进行访问。例如,我们可以从一个预先准备好的 User - Agent 列表中随机选择一个 User - Agent,添加到请求头中:

import requests
import random

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15'
]

url = 'https://example.com/video'
headers = {
    'User - Agent': random.choice(user_agents)
}

try:
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    html_content = response.text
    print(html_content)
except requests.exceptions.RequestException as e:
    print(f'请求发生错误: {e}')

使用代理 IP 也是应对反爬虫机制的有效方法。当我们的爬虫频繁访问视频网站时,网站可能会根据我们的 IP 地址进行限制或封禁。通过使用代理 IP,我们可以隐藏自己的真实 IP 地址,以代理服务器的 IP 地址进行访问。代理 IP 可以从一些专业的代理服务提供商处获取,也可以使用一些免费的代理 IP 资源,但免费代理 IP 的稳定性和速度可能较差。在 Python 中,使用代理 IP 发送请求的示例代码如下:

import requests

url = 'https://example.com/video'
proxies = {
    'http': 'http://your_proxy_ip:port',
    'https': 'https://your_proxy_ip:port'
}

try:
    response = requests.get(url, proxies=proxies)
    response.raise_for_status()
    html_content = response.text
    print(html_content)
except requests.exceptions.RequestException as e:
    print(f'请求发生错误: {e}')

在上述代码中,proxies字典中设置了 HTTP 和 HTTPS 协议的代理 IP 和端口号。需要注意的是,在使用代理 IP 时,要确保代理 IP 的有效性和稳定性,定期检查代理 IP 是否可用,并及时更换不可用的代理 IP。

2.3 解析视频播放链接

从获取到的视频页面内容中解析出视频播放链接是视频爬虫的核心步骤之一。常用的解析方法有正则表达式和使用相关的解析库,如BeautifulSoup和lxml。

使用正则表达式解析视频播放链接时,需要根据视频链接的特点和网页结构编写合适的正则表达式模式。例如,对于常见的视频网站,其视频链接可能符合一定的格式,如https://example.com/video/[video_id].mp4。我们可以使用如下正则表达式来匹配这种格式的视频链接:

import re

html_content = '<html>...</html>'  # 假设这是获取到的视频页面内容
pattern = re.compile(r'https://example.com/video/(\d+)\.mp4')
matches = pattern.findall(html_content)
if matches:
    video_links = [f'https://example.com/video/{match}.mp4' for match in matches]
    print(video_links)

在上述代码中,re.compile()方法用于编译正则表达式模式,pattern.findall(html_content)方法用于在网页内容中查找所有符合模式的视频链接。

然而,使用正则表达式解析视频链接时,需要对网页结构和视频链接的格式有较为深入的了解,并且正则表达式的编写和调试相对复杂。相比之下,使用解析库如BeautifulSoup和lxml可以更方便地处理复杂的网页结构。

以BeautifulSoup为例,假设视频链接存储在<a>标签的href属性中,并且该<a>标签具有特定的类名,我们可以使用如下代码解析视频链接:

from bs4 import BeautifulSoup

html_content = '<html>...</html>'
soup = BeautifulSoup(html_content, 'html.parser')
video_links = []
for a_tag in soup.find_all('a', class_='video - link - class'):
    href = a_tag.get('href')
    if href:
        video_links.append(href)
print(video_links)

在这个示例中,soup.find_all(‘a’, class_=‘video - link - class’)方法用于查找所有具有video - link - class类名的<a>标签,然后通过a_tag.get(‘href’)获取每个<a>标签的href属性,即视频链接。

对于不同视频格式和网站结构,解析方法也会有所不同。例如,一些视频网站可能使用m3u8格式来播放视频,m3u8是一种基于文本的媒体播放列表文件格式,其中包含多个由 URI 引用的媒体资源文件的 URL。在解析m3u8格式的视频链接时,需要先找到m3u8文件的链接,然后再解析m3u8文件,获取其中的视频片段链接。

2.4 下载视频文件

在 Python 中,我们可以使用requests库来下载视频文件。对于大文件下载,为了避免一次性加载大量数据导致内存溢出,我们可以使用requests库的stream参数实现分块下载。

示例代码如下:

import requests

video_url = 'https://example.com/video.mp4'
save_path = 'path/to/save/video.mp4'

try:
    response = requests.get(video_url, stream=True)
    response.raise_for_status()
    with open(save_path, 'wb') as f:
        for chunk in response.iter_content(chunk_size=1024 * 1024):  # 每次读取1MB的数据
            if chunk:
                f.write(chunk)
    print(f'视频下载成功,保存到: {save_path}')
except requests.exceptions.RequestException as e:
    print(f'视频下载失败: {e}')

在上述代码中,response.iter_content(chunk_size=1024 * 1024)方法用于按块迭代读取视频数据,每次读取 1MB 的数据。通过这种方式,我们可以有效地控制内存的使用,确保大文件的下载过程稳定可靠。

在实际下载过程中,可能会遇到网络波动、服务器响应异常等问题,导致下载中断。为了提高下载的稳定性,我们可以实现断点续传功能。断点续传的原理是在下载中断时,记录已下载的字节数,下次下载时从已下载的位置继续下载。实现断点续传需要使用 HTTP 请求头中的Range字段,该字段用于指定请求资源的部分内容。

示例代码如下:

import os
import requests

video_url = 'https://example.com/video.mp4'
save_path = 'path/to/save/video.mp4'

def download_video_with_resume(url, save_path):
    if os.path.exists(save_path):
        downloaded_size = os.path.getsize(save_path)
    else:
        downloaded_size = 0

    headers = {'Range': f'bytes={downloaded_size}-'}
    try:
        response = requests.get(url, headers=headers, stream=True)
        response.raise_for_status()
        with open(save_path, 'ab') as f:
            for chunk in response.iter_content(chunk_size=1024 * 1024):
                if chunk:
                    f.write(chunk)
                    downloaded_size += len(chunk)
        print(f'视频下载成功,保存到: {save_path}')
    except requests.exceptions.RequestException as e:
        print(f'视频下载失败: {e}')

download_video_with_resume(video_url, save_path)

在这个示例中,首先检查本地是否已存在部分下载的文件,如果存在,则获取已下载的文件大小,并设置Range请求头,从已下载的位置开始继续下载。通过这种方式,我们可以有效地应对下载过程中的各种异常情况,提高视频下载的成功率。

三、处理图片与视频的版权问题与合规性

在进行图片与视频爬虫时,必须高度重视版权问题与合规性,避免陷入法律风险。这不仅是对版权所有者权益的尊重,也是保障自身行为合法的关键。

3.1 了解版权相关法律法规

在国内,图片和视频受到《中华人民共和国著作权法》的严格保护。该法明确规定,未经著作权人许可,复制、发行、通过信息网络向公众传播其作品的行为属于侵权行为。对于图片,从拍摄完成的那一刻起,摄影师就拥有了著作权,包括发表权、署名权、修改权和保护作品完整权等一系列人身权利,以及复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权等财产权利。对于视频,其版权归属通常归属于制片人,但导演、编剧、摄影、作词、作曲等作者也享有署名权,并有权按照与制片者签订的合同获得报酬。

国际上,不同国家和地区的版权法律法规也存在差异。例如,美国的版权法规定,作品的保护期通常为作者有生之年加死后 70 年;而在欧盟,版权保护期一般为作者去世后 70 年,对于影视作品,保护期则从作品首次公开发表或完成制作后的 70 年起算。在进行跨国图片和视频爬虫时,需要充分了解并遵守目标国家或地区的版权法律法规。

未经授权爬取和使用受版权保护的图片和视频可能会引发严重的法律后果。侵权者可能需要承担停止侵害、消除影响、赔礼道歉、赔偿损失等民事责任。如果侵权行为情节严重,损害了公共利益,还可能面临著作权行政管理部门的行政处罚,如责令停止侵权行为、没收违法所得、没收并销毁侵权复制品、罚款等。在某些情况下,侵权行为甚至可能构成犯罪,依法追究刑事责任。

3.2 尊重网站的 Robots 协议

Robots 协议,也称为爬虫协议、机器人协议等,其全称是 “网络爬虫排除标准”(Robots Exclusion Protocol)。它是一种存放于网站根目录下的 ASCII 编码的文本文件,通常以 robots.txt 命名。网站通过 Robots 协议明确告诉搜索引擎爬虫以及其他网络爬虫哪些页面可以抓取,哪些页面不能抓取。

Robots 协议的规则主要通过 User-agent、Disallow 和 Allow 这几个指令来实现。User-agent 指令用于指定规则所针对的爬虫,“*” 代表所有爬虫;Disallow 指令用于禁止爬虫访问指定的目录或页面,例如 “Disallow: /private/” 表示禁止所有爬虫访问网站的 /private 目录;Allow 指令则与 Disallow 指令相反,用于允许爬虫访问特定的目录或页面,如 “Allow: /public/” 表示允许所有爬虫访问网站的 /public 目录。

在编写爬虫程序时,应首先读取目标网站的 Robots 协议。可以使用 Python 的requests库发送请求获取 robots.txt 文件的内容,然后解析该文件,根据其中的规则来决定爬虫的访问行为。示例代码如下:

import requests
from urllib.parse import urljoin

def check_robots(url):
    robots_url = urljoin(url, 'robots.txt')
    try:
        response = requests.get(robots_url)
        if response.status_code == 200:
            robots_content = response.text
            # 这里可以添加解析robots_content的逻辑,判断是否允许爬取
            print(robots_content)
        else:
            print(f'无法获取robots.txt,状态码: {response.status_code}')
    except requests.exceptions.RequestException as e:
        print(f'请求发生错误: {e}')

如果爬虫违反 Robots 协议,可能会对网站的正常运行造成影响,如消耗过多的服务器资源,导致网站性能下降。同时,这种行为也可能引发网站所有者的法律追究,损害爬虫开发者的声誉和利益。例如,某知名搜索引擎的爬虫曾经因为违反了某些网站的 Robots 协议,被网站所有者起诉,最终该搜索引擎不得不调整其爬虫策略,并向网站所有者道歉。

3.3 获取合法授权

当需要爬取受版权保护的图片和视频时,与版权所有者或网站运营方进行沟通并获取授权是至关重要的。在沟通时,应明确表达自己的身份、爬取的目的、使用的方式和范围等关键信息。例如,如果是为了学术研究目的爬取图片和视频,应详细说明研究的课题、使用图片和视频的具体方式以及研究成果的传播范围等。

获取授权的流程通常包括以下步骤:首先,通过网站上提供的联系方式、电子邮件或其他沟通渠道,与版权所有者或网站运营方取得联系;然后,向对方发送正式的授权请求邮件或函件,在其中清晰地阐述爬取的需求和使用计划;等待对方的回复,可能需要根据对方的要求提供进一步的信息或进行协商;如果对方同意授权,务必以书面形式确认授权的具体内容,包括授权的期限、使用的范围、是否可以转授权等关键条款,并妥善保存相关的授权文件。

在获取授权过程中,需要注意以下事项:确保授权请求的内容准确、清晰,避免产生歧义;尊重版权所有者的意见和要求,积极配合对方的询问和审核;对于授权协议中的条款,要仔细阅读和理解,确保自己能够履行相关的义务。例如,某些授权协议可能要求在使用图片和视频时必须注明版权所有者的信息,或者限制使用的次数和范围,爬虫开发者必须严格遵守这些规定。

3.4 合理使用原则

合理使用是著作权法中的一项重要制度,是指在特定的条件下,法律允许他人自由使用享有著作权的作品,而不必征得权利人的许可,也不向其支付报酬。合理使用的目的是为了平衡著作权人的利益与社会公众对知识和信息的获取需求,促进文化和科学的发展。

在我国,《著作权法》第 24 条规定了 12 种合理使用的情形,包括为个人学习、研究或者欣赏,使用他人已经发表的作品;为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;为报道时事新闻,在报纸、期刊、广播电台、电视台等媒体中不可避免地再现或者引用已经发表的作品等。对于图片和视频爬虫而言,如果是基于这些合理使用的目的进行数据获取,在符合相关条件的前提下,是被法律所允许的。

以新闻报道为例,如果需要爬取相关的图片和视频来配合新闻内容的发布,在满足合理使用的条件下,如注明图片和视频的来源、仅在必要的范围内使用、不影响作品的正常使用和著作权人的合法利益等,可以进行爬取和使用。但如果将爬取的图片和视频用于商业广告等营利性目的,超出了合理使用的范围,就可能构成侵权。在实际操作中,要准确判断是否符合合理使用原则,需要综合考虑使用作品的目的、性质、使用的程度以及对作品潜在市场或价值的影响等多方面因素。

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

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

相关文章

【前端基础篇】Day 1

总结&#xff1a; 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…

我与Linux的爱恋:了解信号量+共享内存+消息队列的应用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 信号量共享内存应用---Server&Client通信client.ccserver.ccnamepipe.hppShm.hpp 消息队列——实现Client&ServerCom.hppClient.ccServer.cc 信号量 信号量…

跟着李沐老师学习深度学习(十六)

继续学习深度学习&#xff08;十六&#xff09; 继续理解transformer 对于transformer的理解感觉还是云里雾里的&#xff0c;今天又找了一些视频进行一个梳理。 一个浅解 在B站学习发现评论区真的很不错&#xff0c;在沐神讲transformer论文的评论下&#xff0c;有一个评论…

DeepSeek-R1本地部署保姆级教程

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…

hbase集群部署

1.hbase集群的搭建&#xff08;以及内部逻辑&#xff09; 虽然Hmaster有多个&#xff0c;但是属于热备&#xff0c;起作用的就active上的这个。 部署流程&#xff1a; 因为我配置的hadoop是一个非HA的&#xff0c;所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…

2.1 链路层发现协议(LLDP)

LLDP&#xff08;Link Layer Discovery Protocol&#xff0c;链路层发现协议&#xff09;是一种用于网络设备的链路层协议&#xff0c;用于在局域网&#xff08;LAN&#xff09;中自动发现和通告设备的信息。LLDP是一个开放标准协议&#xff0c;定义在IEEE 802.1AB中&#xff0…

3dtiles平移旋转工具制作

3dtiles平移旋转缩放原理及可视化工具实现 背景 平时工作中&#xff0c;通过cesium平台来搭建一个演示场景是很常见的事情。一般来说&#xff0c;演示场景不需要多完善的功能&#xff0c;但是需要一批三维模型搭建&#xff0c;如厂房、电力设备、园区等。在实际搭建过程中&…

LeetCode 2506 统计相似字符串对的数目

一、问题描述 我们面对的问题是处理一个下标从 0 开始的字符串数组 words。题目中定义了一种字符串相似的规则&#xff1a;如果两个字符串由相同的字符组成&#xff0c;那么就认为这两个字符串是相似的。例如&#xff0c;"abca" 和 "cba" 是相似的&#xf…

【Deepseek高级使用教程】Deepseek-R1的5种高级进阶玩法,5分钟教会你Deepseek+行业的形式进行工作重构的保姆级教程

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 最近&#xff0c;有各行各业的小伙伴问我&#xff0c;到底应该怎么将deepseek融入进他们自身的工作流呢&#xff1f;其实这个问题很简单。我就以…

【LeetCode刷题之路】leetcode155.最小栈

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

Linux版本控制器Git【Ubuntu系统】

文章目录 **前言**一、版本控制器二、Git 简史三、安装 Git四、 在 Gitee/Github 创建项目五、三板斧1、git add 命令2、git commit 命令3、git push 命令 六、其他1、git pull 命令2、git log 命令3、git reflog 命令4、git stash 命令 七、.ignore 文件1、为什么使用 .gitign…

2025年信息科学与工程学院科协机器学习介绍——机器学习基本模型介绍

机器学习 目录 机器学习一.安装基本环境conda/miniconda环境 二.数据操作数据预处理一维数组二维数组以及多维数组的认识访问元素的方法torch中tenson的应用张量的运算张量的广播 三.线性代数相关知识四.线性回归SoftMax回归问题&#xff08;分类问题&#xff09;什么是分类问题…

pyecharts介绍

文章目录 介绍安装pyecharts基本使用全局配置选项 折线图相关配置地图模块使用柱状图使用 介绍 echarts虑是个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可&#xff0c;而Pyhon是门富有表达力的语言&a…

蓝桥杯——lcd显示

一&#xff1a;复制文件 从官方参考文件中复制相关文件&#xff0c;Src中的lcd.c&#xff0c;Inc中的lcd.h&#xff0c;fonts.h复制到自己创建的文件中 二&#xff1a;lcd初始化 在lcd.h中找到四个初始化函数&#xff0c;将其写到main文件中 三&#xff1a;写lcd显示函数 在…

ligerUI在前端层面对于数据的验证拦截

当你的系统框架采用ligerUI的时候&#xff0c;对于常见的数据验证&#xff0c;我们可以采取ligerUI本身的一些API调用来进行前端的数据验证&#xff0c;例如当你想遍历验证每行数据的时候&#xff1a; var rows liger.get("edit_Mtl").getData(); for (var i 0; i…

ubuntu-24.04.1-desktop 中的 QT6.7 QtCreator 调试程序

ubuntu-24.04.1-desktop 中的 QT6.7 QtCreator 中调试程序 &#xff11; 启动调试时提示&#xff1a;The kit does not have a debugger set.&#xff12; CDB配置问题&#xff12;.1 选择 工具 -> 外部 -> 配置&#xff12;.2 配置 CDB 路径 &#xff11; 启动调试时提示…

VSCode ssh远程连接内网服务器(不能上网的内网环境的Linux服务器)的终极解决方案

VSCode ssh远程连接内网服务器&#xff08;不能上网的内网环境的Linux服务器&#xff09; 离线下载vscode-server并安装: 如果远程端不能联网可以下载包离线安装,下载 vscode-server 的 url 需要和 vscode 客户端版本的 commit-id 对应.通过 vscode 面板的帮助->关于可以获…

【C语言基础】基本数据类型和常量介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 基本数据类型和常量介绍一、整数类型 int二、浮点数值类型 f…

【Deepseek】AnythingLLM + Ollama

1. 下载安装 anythingllm 下载地址&#xff1a;https://anythingllm.com/desktop 2. 启动anything 点击 Get started 3.创建工作空间 4.选择Ollama大语言模型 聊天设置 当前只有一个1.5b的模型 下载完成7b模型后 选择后记得点击更新到工作空间&#xff01;&…