Contents

Make a simple spider with Python and PyQt5

这是参加南邮校科协组织的“脑洞程序设计周”活动的作品,由于经常听说Python爬虫,就一直挺好奇的吧,这次算动手了解一下了。

程序的整体结构是使用双线程,爬虫在后台按着Url list抓取Pixiv页面并解析出图片暂存在本地,前端接收用户的选择,从本地呈现一张图片到前端,或者保存当前图片到某个文件夹,一共写了约两天半,500行左右,第一天写爬虫部分,第二天现学现卖硬着头皮用PyQt写了UI,最后使用Pyinstaller打包。

下载exe文件:https://am473ur.lanzous.com/ib91qbi

Spider

爬虫部分尽可能的模块化,方便后期修改,毕竟我写的时候还不知道怎么和前端对接。因为Pixiv图片列表页只能看到缩略图直接解析出的图片Url尺寸极小,所以可以先通过图片(<a>标签)链接进入原图页面,再解析图片Url。并且实际解析过程发现,这个原图页可以解析出5种尺寸的图片,也为本软件增加了一个小功能:在json文件中可以选择配置图片尺寸。

文件结构及功能

  • 网页下载器(HtmlDownloader.py)
    • 带着headers模拟浏览器向网页请求,下载图片指向的原图页面的Url列表
  • 网页解析器(HtmlParser.py)
    • 从json文件中读取用户配置的图片尺寸类型;进入原图页面;使用BeautifulSoup解析出图片Url
  • URL管理器(UrlManager.py)
    • Url池,存储解析出的Url和从Url池中pop出一个Url,同时记录以防图片重复
  • 图片下载器(ImgDownloader.py)
    • imgdownloader()类通过图片Url把图片下载到本地,并把图片名写入临时json文件(供前端读取)
    • img_manager()类是给前端使用的,负责从本地暂存图片文件夹提取一张图片传给前端,并把临时json文件中的这个图片名删除。
  • 主爬虫程序(MainSpider.py)
    • 从json文件读取P站页面Url列表,调用以上各程序

工作流程

  1. 访问P站的某个图片列表页面(比如每日排行榜),用网页下载器把页面下载下来传给网页解析器
  2. 网页解析器解析出这个页面的每个图片指向的 URL 列表,传给URL管理器储存起来。
  3. 访问每个 URL ,解析出真正的图片 URL(可以解析出各种尺寸的…),然后传给图片下载器带着 headers 模拟浏览器把图片下载下来,同时把所有图片名称写入临时 json 文件,供前端部分访问。
  4. 主爬虫函数对前端提供一个 craw_one() 方法接口,每执行一次就会抓取一个图片。

PyQt5 UI

对UI部分感兴趣的话可以看源代码(UI.py),基本是显示的功能对应内部函数,所以不详细说明函数功能了。

  1. 样式使用 QSS ,不得不说和 CSS 挺像的,默认边框隐藏,右上角只做一个关闭按钮,尽可能的简洁。
  2. 使用网格布局,分成左右两部分,左侧显示图片;右侧为功能区(关闭按钮也在右侧,鼠标移动成本更低:)
  3. 右侧网格区:
    • 右上角关闭按钮
    • 状态文本框(显示实时状态信息,比如: 在检测网络过程中自动退出,说明退出原因是无法访问到 Pixiv.net )
    • Next 按钮。点击时会自动删除当前显示的图片(避免不必要的浪费),并展示下一张图片。
    • Save 按钮。点击时会将当前图片保存到 Setting.json 中设置的路径。
    • 清除缓存并退出。点击时会删除加载完成但是没有展示过的图片,但不会删除保存的图片。干干净净(づ ̄3 ̄)づ╭❤~

main.py

主调用程序。双线程进行,先开启 UI 界面,然后再调用主爬虫程序后台开始爬涩图。

Package App

打包是使用Pyinstaller,我在设想成品的时候,想的是可以尽可能简单的使用,免安装,避免生成一堆复杂的文件,不小心删除了程序就崩了,所以最终只有两个文件即Setting.json和Spixiv.exe。临时生成的文件夹包含里面的背景图片都可以删除,下次打开时会自动生成。

img_64.py存储的就是背景图片的base64编码,所以不必担心删除背景图片程序就会崩溃,因为图片就在代码里:)

1
pyinstaller -F -i icon.ico -w main.py -p HtmlDownloader.py -p HtmlParser.py -p ImgDownloader.py -p MainSpider.py -p UI.py -p img_b64.py -p UrlManager.py --hidden-import UI --hidden-import MainSpider --hidden-import UrlManager --hidden-import HtmlDownloader --hidden-import HtmlParser --hidden-import ImgDownloader --hidden-import img_b64.py

readme.md

How to use

双击或右键打开 Spixiv.exe 即可开始运行。

  • 保证 Settings.json 文件存在且正确配置
  • 保证计算机可以正常访问外网

How to setting

在 Settings.json 中可以对 Spixiv 进行一些简单的设置 (默认设置可以正常运行)

  • Spixiv 支持更改爬取页面。当然必须是在 www.pixiv.net 站内,您可以在 “url_list” 后的 list 中更改成您喜欢的页面列表。
  • Spixiv 支持更改预览画质。有 original,regular,small,thumb,mini 共 5 种选择,您可以在 “preview_img_quality” 后更改关键词。
  • Spixiv 支持更改保存路径。可以是相对路径也可以的是绝对路径,如果文件夹不存在,Spixiv 会自动创建该文件夹,您可以在 “img_save_path” 后更改保存路径。