(由于简书无法将代码以文本形式较好地呈现,故本文代码部分将以图片形式呈现,若有文本代码的需要,请移步至淀粉月刊官网原文)
大妈之家最近又在自审了,虽然社区版客户端还能用,网页端也能用,但是为了防止下一次自审,以及以后的作品被ban,总要找个后备方案。(UWP客户端,确信)python脚本爬取图片,便是其中一种。
0. 环境
本文默认读者已经安装和正确配置如下环境
python3(愤鸟的版本为3.8.2),需安装requests、lxml、urllib、selenium
FireFox及其对应selenium WebDriver(Chrom(ium)、Edge(两个版本)、Internet Explorer、Opera 和 Safari也可以,其他浏览器不保证能用)
selenium的安装可参考这篇文章,但愤鸟建议安装好WebDriver以后,将WebDriver所在路径添加至系统环境变量里。
1. 思路
要实现爬取、下载大妈之家的漫画图片,我们需要解析、获取图片链接;为了方便查看,需要将每话的图片单独放到一个文件夹内,最好可以将每个作品使用一个文件夹存放;有余力的话,可以做出简单的防止重复下载功能。
为了实现解析、获取图片链接,我们需要分析观看漫画页面的源代码。经过实践得知,大妈之家的观看漫画页的图片为通过js动态加载,那么我们需要从以下两个方案中选择一种:用python运行js脚本从而获取图片链接;用selenium操作浏览器,使页面加载完成后取得图片链接。愤鸟选择了后一种方案,该方案的优势是:代码好写,易读;劣势是:由于要等待浏览器,因此效率较低,而且会吃内存。
为了实现将每话的图片单独放到一个文件夹内和每个作品使用一个文件夹存放,我们需要在漫画详情页获取各话链接。同时还要检测文件夹是否存在,并适时创建文件夹。
为了实现防止重复下载,我们需要设置一个标记,证明我们下载过这一话。愤鸟选择的方案是在下载完成后放置一个空白文件作为标记。
整个程序的流程为:
存在不存在否是是否开始获取输入访问作品页面获取,处理作品页面源代码作品存在链接A结束链接A获取作品信息及各话url本地确认作品文件夹是否存在该话已下载访问该话页面所有话均下载完成页面加载完成后获取页面信息和图片url下载图片创建标记
2. 编码
获取输入
有关代码十分简单:
访问作品页面、获取,处理页面源代码
通过输入,获取对应url后,使用requests访问,使用etree处理,解析xpath结构以便于提取信息。
判断作品是否存在
愤鸟选用的方法是,判断页面标题,若不是404,则认为作品存在。
获取作品信息及各话url
通过xpath找到相应元素的信息:
作品名称
各话信息
本地确认作品文件夹是否存在
可以通过os的方法,直接判断路径的存在性。
愤鸟所用的路径为,以脚本所在当前路径为根,检测、创建相应文件夹。
同时判断作品文件夹和各话文件夹是否存在,可以省去下载失败后的大量重试时间,缺点就是会短时间内产生大量空文件夹。
访问各话页面
由于需要浏览器代劳加载页面,使我们可以获取图片链接,所以这里用到了selenium(的WebDriver)。
页面加载完成后获取页面信息和图片url
需要通过WebDriver获取。
由于图片加载时间不稳定,且python无法准确识别图片加载完成的时间,因此需要使用WebDriverWait方法。这个方法可以使浏览器等待某元素加载后读取信息。需要注意的是,这个方法需要设置以秒为单位的超时(timeout)。
图片链接的获取也是使用了xpath,与上面不同的是,这里无需etree,可以直接通过WebDriver的find_elements_by_xpath方法获取。
P.S 现版本的大妈之家web的漫画浏览页的跳转选择中直接存放了图片地址……
检测该话是否已下载
也是使用os.path.exists进行判断。
下载图片
使用requests下载图片
完整代码
将实现以上功能的代码整合,再添加亿点细节,即得到脚本的完整代码:
3. 结束
经过实际测试,脚本达到了可用级别。哪怕是对于话数特别多的漫画,根据分析网页代码可以认为,该脚本也能对其正常下载。
于是一个可靠的备胎(?)诞生了。
本文在此处和我的博客处同步发布,头图来自愤鸟自己。
本文首发于淀粉月刊(https://dfkan.com)
原作者:愤鸟之眸