本项目的实现涉及模块有,
爬取图片所在网站地址:https://www.xrmn03.cc/
项目完整代码所在gitee:https://gitee.com/shawn_chen_rtz/meizi_pic.git
欢迎关注,STAR
执行后生成的文件夹效果,
日志信息,可以查看当前执行下载情况,
以上是保存图片方法save_pic(),它接收三个参数direct, pic_src, pic_no,分别表示欲存储的目录、图片链接和图片编号(用作命名图片文件)。
首先拼接成图片完整链接pic_url,再判断图片是否已存在路径中,如果不存在,开始执行保存操作,通过requests模块发出请求,读取图片数据pic_binary = requests.get(url=pic_url).content,通过文件写操作写入到本地路径下,文件操作可以参考个人公众号(欢迎关注)文章Python:文本文件的读、写处理。在请求过程中,可能基于网络等原因,报错异常,所以放在了一个循环体中,并在循环体中用try...except...else异常处理机制handle错误。如果出错,会等待60秒后继续请求,一共20次重试机会,也就是循环次数range(20);如果成功,则会直接跳出后续循环请求。异常处理机制可以参考个人公众号文章Python:异常处理。
思路:观察该网站的图集展示逻辑,一套图集中是以多个分页组成的。
可以观察到每个分页链接的组成是有一定规律的,根据规律获取单套图集每个分页的链接后,循环请求分页链接,在循环体中增加从每个分页的响应结果中爬取出包含图片的超链接功能,结合第二章的save_pic()方法,把图片保存到本地。
代码实现,
可以看到获取整套图方法get_full_album(album_address, title)接收两个参数,分别表示图集地址album_address和图集名称title。
首先,判断路径下是否已存在与图集名称同名的文件夹,如果不存在,通过os.mkdir(title)进行创建。循环遍历for album_page in range(100),album_page表示图集中的分页,获取每个分页的超链接,
用的格式是if分支语句的缩略写法。比如举个例子,大于0的数字是正数,相反则是非正数。正常写法是,
简写格式则是,两种形式是等效的。
循环请求分页地址,循环体内请求分页链接,根据访问详情结果,用BeautifulSoup提取出所有的图片链接,循环图片数据,调用save_pic(title, pic, i)方法,下载至本地保存。
当然同保存图片方法一样,也使用了异常处理机制,增强代码运行的健壮性与稳定性。如果发生异常错误时,用for循环的方式增加重试/重新请求的机制。
代码实现,
遍历图集分页,获取图集的链接,
根据图集分页链接组成规律,获取链接,for循环for page in range(1, 24)控制下载的页数范围,当前是下载1到23页的所有图集的图集信息。
获取所有albums,循环albums,处理得到图集链接album_url,图集名称album_title,如果已存在同名文件夹,并且文件夹中的图片数量与图集名称中的图片数量一致时,略过该图集,并写入对应日志信息。如果不存在同名文件夹,或者文件夹中的图片数量与文件夹名称中的数量不一致,则调用第三章中的get_full_album(album_url, album_title)方法。
ok,到这里结束了,有任何问题请留言或关注作者公众号,与我交流~