一晃快10天没有更新任何内容了,按理来说应该搞一点福利文章。但是目前本站域名ICP备案主体信息变更、公安网备也一次次被退回,实在是不敢公然ghs,只能来一个曲线救国。
扫黄
前几天我在Github上提交的一个Pull requests突然被merged了,看了一下是我之前瞎写的一个qqzhpt爬虫,提交到awesome-spider被收录了。但是之前写的代码非常的烂,不重写一下感觉不好意思见人。

目标站点这个异常涩情的title总会给人无限遐想,不过这真的只是一个写真网站。想要图可以直接点上面的卡片去clone代码,下面主要介绍一下新版本代码。

内容变更

本次重写在功能上进行了阉割。之前的版本有多种使用方式,新代码简化后目前只有通过图集第一页url下载这一种方式。
旧版用过的aria2下载经测试不稳定且需要额外安装aria2,故弃用。
旧版代码复用度过低,几个代码文件大部分都是重复的。新版核心代码均在qqzhpt.py中。
之前的代码用urllib库下载页面,正则表达式提取url,恐怕这样做唯一的优点就是不需要第三方库了。这次重写换用了requests和beautifulsoup4库,使用时请安装相关依赖及lxml库。

部分代码

完整代码可以去Github获取。
目前main.py可以用python main.py url的方式调用,也可以直接运行后输入url。如果有多条url,建议自己写一个批量调用qqzhpt.py的脚本。
首先打开一个页面,例如 http://www.qqzhpt.com/meitu/detail/1562014808513 。我们要做两件事,一是获取这个图集有多少页,二是获取每页上的图片链接。这次改用比较熟悉的beautifulsoup4解析网页html,因此需要先检查网页元素。

图集页数

在页数位置检查元素如下:

这个位置的解析代码为:

soup = BeautifulSoup(web_content.text,'lxml')
detail_page = soup.body.find(class_ = ['detail-pag','meitu-page']).find_all("a")

之后可以用len(detail_page)获得页面数量,detail_page[index].attrs["href"]获得页面链接。

图片地址

在图片位置检查元素如下:

这个位置的解析代码为:imgs_list = soup.body.find(class_ = "imgs-list").div.find_all("img")
同样,imgs_list[index].attrs["src"]可以提取图片地址。
总之别用正则表达式做这个步骤,太麻烦了。

图片保存

用url中最后那串数字做目录名保存。

多线程

单张下载速度太慢,考虑到每页一般都有5张图片,总页数不会超过50页,每一页都用一个单独的线程下载问题不大,而且也没必要去考虑并发数量。
因为不需要太多功能,为了省事,用_thread模块完成。
不过要有一个办法判断所有进程都运行完之后才能结束程序,否则主进程分配完任务之后就结束了,所有下载进程都无法继续运行。我这个Python新手最开始啥也不懂,折腾了半天。
这个功能可以简单的用flag完成,但是为了学习Python我使用了_thread的线程锁,检测到所有锁都以释放之前程序会死循环运行。

封装

代码封装在qqzhpt.py中的meitu类中,import到自己代码内即可使用。
mark


挂科一时爽,一直挂科一直爽。
🀇🀇🀇🀈🀉🀊🀋🀌🀍🀎🀏🀏🀏 🀋