你是否曾经浏览小红书(Red)上的一篇精彩笔记,想要将其中的图片保存到本地?或者你想批量下载某个小红书用户的所有图片?不用担心,本教程将向你展示如何使用Python编写一个简单但功能强大的脚本,来实现批量下载小红书图片的目标。
1. 背景故事
小红书是一个充满灵感和创意的社交平台,用户可以在上面分享各种生活笔记,包括美食、时尚、旅行等等。这些笔记通常包含大量高质量的图片,有时你可能会希望将这些图片保存到本地,以便离线查看或做其他用途。但手动下载每张图片会非常费时费力,因此我们编写了这个Python脚本,来帮助你自动完成这项任务。
2. 准备工作
在开始之前,确保你已经安装了Python,并安装了以下必要的库:requests
和 BeautifulSoup
。你可以使用以下命令来安装它们:
pip install requests beautifulsoup4
3. 编写Python脚本
下面是我们编写的Python脚本,它可以根据你的选择,批量下载小红书上的图片。
import requests
from bs4 import BeautifulSoup
import os
import re
import json
# 创建文件夹
def mkdir(path):
folder = os.path.exists(path)
if not folder:
print("--- 创建新的文件夹? ---")
os.makedirs(path)
print("--- OK ? ---")
else:
print("--- ⚠️ 文件夹已存在! ---")
# 发起网络请求,获取网页源码
def fetchUrl(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36',
}
r = requests.get(url, headers=headers)
return r.text
# 解析html文本,提取无水印图片的url
def parsing_link(html):
soup = BeautifulSoup(html, 'html.parser')
script = soup.find('script', string=re.compile('window\.__INITIAL_STATE__'))
test = re.split(r'=', script.string)
string = test[1].replace('undefined', 'null')
result = json.loads(string, strict=False)
imageList = result.get('note', {}).get('note', {}).get('imageList')
title = result.get('note', {}).get('note', {}).get('title')
if title == '':
title = result.get('note', {}).get('note', {}).get('desc')
title = sanitize_folder_name(title)
if imageList and title:
print('标题:', title)
print('开始下载啦!?')
file = os.path.dirname(__file__) + '/image/' + title
mkdir(file)
for i in imageList:
picUrl = f"https://sns-img-qc.xhscdn.com/{i['traceId']}"
yield picUrl, i['traceId'], title
# 下载图片
def download(url, filename, folder):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36',
}
try:
r = requests.get(url, headers=headers)
content_type = r.headers.get('Content-Type')
image_format = content_type.split('/')[-1]
if image_format not in ['jpeg', 'png', 'gif', 'bmp']:
image_format = 'jpeg'
with open(f'image/{folder}/{filename}.{image_format}', 'wb') as v:
v.write(r.content)
except Exception as e:
print('图片下载错误!')
# 修正文件夹命名
def sanitize_folder_name(name: str) -> str:
name = re.sub(r'[<>:"/\\|?*]', '_', name)
name = name.strip()
if len(name) > 255:
name = name[:255]
return name
# 主循环
def roopLink(url):
html = fetchUrl(url)
traceId = 0
for url, _, title in parsing_link(html):
print(f"download image {url}")
download(url, traceId, title)
traceId += 1
if __name__ == '__main__':
choice = input("请输入选项 (1: 循环获取链接; 2: 获取文本地址并下载): ")
if choice == '1':
while True:
links = input("请输入小红书的链接 (输入 'end' 结束程序): ")
if links == 'end':
break
roopLink(links)
elif choice == '2':
file_path = input("请输入文本文件地址(回车默认是1.txt): ")
if file_path == '':
file_path = '1.txt'
with open(file_path, 'r') as f:
links = f.read().splitlines()
for link in links:
roopLink(link)
print("下载完成啦!?")
4. 使用方法
使用这个脚本非常简单,只需按照以下步骤操作:
- 运行脚本并选择你的操作类型(1或2)。
- 如果选择了1,输入小红书的链接并按照提示操作。
- 如果选择了2,输入包含小红书链接的文本文件的地址,并按照提示操作。
- 所有图片将会下载到脚本所在目录下的
image
文件夹中。
现在,你可以轻松地批量下载小红书图片了!
5. 安全性考虑
请注意,使用这个脚本下载图片时,要遵守小红书的使用规定和法律法规。不要滥用脚本来侵犯他人的隐私或侵
权。
希望这个教程对你有所帮助,让你更方便地管理小红书上的精彩图片!
免责声明:本教程仅用于教育和学习目的。请遵守相关网站的使用规定和法律法规,谨慎使用网络爬虫技术。