一个简单的p站作者查询脚本
一个简单的p站作者查询脚本
使用这部分请保证网络条件允许访问相关网站
本脚本仅供学习使用,也为本人学习练习使用,如违规使用导致涉及ip封禁,或者触犯法律和本人无关
找到该脚本的源码可以->点这里
一、脚本功能
- 支持通过一个完整的pid来进行快速访问
- 支持通过一个完整的pid来进行对该pid对应作者的作品悉数爬取
- 爬取的作品会创建一个文件夹进行保存
二、编写过程
1、环境配置
本脚本已经内置环境下载部分,但是请准备python环境
手动部署环境如下
在脚本文件内打开终端完成,键入以下来完成环境配置
1 | pip install selenium |
2、导入必要的库
在脚本的开头,导入所需的库:
1 | import os |
3、检查并安装库
编写一个函数来检查并安装缺失的库:
1. 安装库的函数
1 | def install(package): |
定义一个名为 install
的函数,用于安装指定的 Python 包。
subprocess.check_call(...):
这个函数用于在 Python 中调用外部命令。在这里,它调用 pip 来安装指定的包。
sys.executable:
返回当前 Python 解释器的路径,确保在正确的 Python 环境中执行安装命令。
"-m", "pip", "install", package:
这是传递给 Python 的参数,表示使用 pip
模块来安装指定的包
2. 尝试导入 requests 库
1 | try: |
尝试导入 requests
库,这是一个用于发送 HTTP 请求的流行库。
try
块:尝试执行 import requests
。
except ImportError
:如果 requests
库未安装,Python 会抛出 ImportError
异常,进入 except
块。
install('requests')
:调用之前定义的 install
函数,安装 requests
库。
3. 尝试导入 selenium 库及其组件
1 | try: |
尝试导入 selenium
库及其相关组件,这些组件用于自动化浏览器操作。
try
块:尝试导入 selenium
的多个模块:
from selenium import webdriver:导入 webdriver,用于控制浏览器。
from selenium.webdriver.common.by import By:导入 By 类,用于定位网页元素。
from selenium.webdriver.chrome.service import Service:导入 Service 类,用于管理 ChromeDriver 的服务。
from webdriver_manager.microsoft import EdgeChromiumDriverManager:导入 EdgeChromiumDriverManager,用于自动下载和管理 Microsoft Edge
的 WebDriver
。
except ImportError:如果 selenium 库未安装,Python 会抛出 ImportError 异常,进入 except
块。
install(‘selenium’):调用之前定义的 install
函数,安装 selenium
库。
4、函数jump_to_author
1 | def jump_to_author(): |
获取用户输入的 UID:
1
uid = uid_entry.get()
- 从 Tkinter 界面的输入框中获取用户输入的 UID(用户 ID),并将其存储在变量
uid
中。
- 从 Tkinter 界面的输入框中获取用户输入的 UID(用户 ID),并将其存储在变量
初始化 WebDriver:
1
driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))
- 使用
webdriver_manager
自动下载和管理 Microsoft Edge 的 WebDriver。 - 创建一个
webdriver.Edge
实例,允许脚本控制 Edge 浏览器。
- 使用
构建用户页面 URL:
1
author_url = "https://www.pixiv.net/users/" + uid
- 根据用户输入的 UID 构建 Pixiv 用户页面的 URL。
打开用户页面:
1
driver.get(author_url)
- 使用 WebDriver 打开构建的用户页面 URL。
5、函数 download_all_works
1 | def download_all_works(): |
获取用户输入的 UID:
1
uid = uid_entry.get()
- 从 Tkinter 界面的输入框中获取用户输入的 UID。
构建用户页面 URL:
1
author_url = "https://www.pixiv.net/users/" + uid
- 根据用户输入的 UID 构建 Pixiv 用户页面的 URL。
初始化 WebDriver:
1
2driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))
driver.get(author_url)- 创建一个
webdriver.Edge
实例,并打开用户页面。
- 创建一个
隐式等待:
1
driver.implicitly_wait(10)
- 设置隐式等待时间为 10 秒,确保在查找元素时,如果元素未立即出现,WebDriver 会等待最多 10 秒。
查找作品链接:
1
2works = driver.find_elements(By.CSS_SELECTOR, "a[href*='/artworks/']")
work_links = [work.get_attribute('href') for work in works]- 使用 CSS 选择器查找所有包含
/artworks/
的链接,表示该用户的作品。 - 将找到的链接存储在
work_links
列表中。
- 使用 CSS 选择器查找所有包含
创建用户目录:
1
os.makedirs(uid, exist_ok=True)
- 创建一个以 UID 命名的目录,用于存储下载的作品。如果目录已存在,则不会引发错误。
设置请求限制:
1
2max_requests = 100
request_count = 0- 设置最大请求次数为 100 次,防止过于频繁的请求导致被封禁。
循环下载作品:
1
for link in work_links:
- 遍历每个作品链接,进行下载。
请求次数检查:
1
2
3
4if request_count >= max_requests:
print("达到最大请求次数,暂停一段时间...")
time.sleep(3600)
request_count = 0- 如果请求次数达到最大值,暂停 1 小时,然后重置请求计数。
下载作品:
1
2
3
4
5
6
7
8
9
10
11
12
13
14try:
driver.get(link)
time.sleep(random.uniform(2, 5))
img_element = driver.find_element(By.CSS_SELECTOR, "img[src*='img-master']")
img_url = img_element.get_attribute('src')
img_data = requests.get(img_url).content
img_name = os.path.join(uid, img_url.split('/')[-1])
with open(img_name, 'wb') as handler:
handler.write(img_data)
request_count += 1- 使用
try
块来处理可能出现的异常。 - 打开作品链接,随机等待 2 到 5 秒,以模拟人类行为,避免被检测为机器人。
- 查找作品的图片元素,获取其 URL。
- 使用
requests
库下载图片数据。 - 将图片保存到之前创建的目录中,文件名为图片 URL 的最后一部分。
- 增加请求计数。
- 使用
异常处理:
1
2
3except Exception as e:
print(f"请求失败: {e}")
time.sleep(10)- 如果在下载过程中发生任何异常,打印错误信息并等待 10 秒后继续。
关闭 WebDriver:
1
2driver.quit()
print("所有作品已下载。")- 下载完成后,关闭 WebDriver,释放资源。
- 打印下载完成的消息。
这两个函数的主要功能是:
jump_to_author
:根据用户输入的 UID 跳转到该用户的 Pixiv 页面。download_all_works
:下载该用户的所有作品,并将其保存到本地目录中。
通过使用 Selenium 自动化浏览器操作和 Requests 下载图片,这个脚本实现了对 Pixiv 用户作品的快速访问和下载。
6、Tkinter 界面代码
1 | window = Tk() |
- 创建主窗口:
window = Tk()
:初始化 Tkinter 主窗口。window.title("Pixiv作者查询")
:设置窗口标题为 “Pixiv作者查询”。window.geometry("400x400")
:设置窗口大小为 400x400 像素。window.configure(bg="#f0f0f0")
:设置窗口背景颜色为浅灰色。
1 | # 设置字体 |
- 设置字体:
- 使用
font.Font
创建字体对象,定义标题和标签的字体样式。
- 使用
1 | # 创建一个Frame用于组织控件 |
- 创建 Frame:
frame = Frame(window, bg="#f0f0f0")
:创建一个 Frame 组件,用于组织其他控件。frame.pack(pady=20)
:将 Frame 添加到主窗口,并设置上下边距为 20 像素。
1 | # 创建标签和输入框 |
- 创建标签和输入框:
uid_label
:创建一个标签,提示用户输入 UID。uid_entry
:创建一个输入框,用户可以在其中输入 UID。- 使用
pack()
方法将标签和输入框添加到 Frame 中,并设置上下边距。
1 | # 创建按钮 |
- 创建按钮:
jump_button
:创建一个按钮,点击后调用jump_to_author
函数,背景色为绿色。download_button
:创建一个按钮,点击后调用download_all_works
函数,背景色为蓝色。- 使用
pack()
方法将按钮添加到 Frame 中,并设置上下边距。
1 | # 添加提示语到窗口底部 |
- 添加提示信息:
- 创建一个新的 Frame
info_frame
,用于放置提示信息。 - 创建多个标签
info_label
、info_label2
和info_label3
,分别提供运行提示、网络要求和使用声明。 - 使用
pack()
方法将这些标签添加到info_frame
中,并设置上下边距。
- 创建一个新的 Frame
1 | # 运行Tkinter窗口的主循环 |
- 启动主循环:
window.mainloop()
:启动 Tkinter 的事件循环,等待用户操作。
该代码创建了一个简单的 Tkinter 界面,允许用户输入 Pixiv UID,并提供两个按钮以跳转到作者界面或下载作者的所有作品。
三、测试和调试
调试完打包运行即可