作者开发的爬取妹子图片Python项目,值得你收藏拥有

最好的学习方法在于实践,学习编程语言Python,也是同样的道理。本文讲解自己开发的一个项目,实现爬取妹子图片,所用的Python知识点以及模块,可以关注参考作者公众号的Python语言合集。

—、前情介绍

1.1 涉及模块

本项目的实现涉及模块有,

requestsBeautifulSoupostimeloggingre

1.2 网站信息以及项目代码地址

爬取图片所在网站地址:https://www.xrmn03.cc/

项目完整代码所在gitee:https://gitee.com/shawn_chen_rtz/meizi_pic.git

欢迎关注,STAR

1.3 执行效果

执行后生成的文件夹效果,

图片

日志信息,可以查看当前执行下载情况,

图片

二、单张图片保存方法

2.1 在线图片保存方法

def save_pic(direct, pic_src, pic_no):
    """保存单个图片,根据目录direct,图片地址pic_src,图片保存名称pic_no."""
    pic_url = "https://www.xrmn03.cc" + pic_src.attrs['src']
    if not os.path.exists(direct + "/" + str(pic_no) + ".jpg"):
        for _ in range(20):
            try:
                pic_binary = requests.get(url=pic_url).content
                with open(direct + "/" + str(pic_no) + ".jpg", "wb") as img:
                    img.write(pic_binary)
            except Exception:
                time.sleep(60)
            else:
                break

以上是保存图片方法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:异常处理。

三、获取整套图方法

3.1 获取整套图方法

思路:观察该网站的图集展示逻辑,一套图集中是以多个分页组成的。

图片

图片

图片

可以观察到每个分页链接的组成是有一定规律的,根据规律获取单套图集每个分页的链接后,循环请求分页链接,在循环体中增加从每个分页的响应结果中爬取出包含图片的超链接功能,结合第二章的save_pic()方法,把图片保存到本地。

代码实现,

def get_full_album(album_address, title):
    """获取整个图集的图片,根据图集地址album_address和图集名称title"""
    if not os.path.exists(title):
        os.mkdir(title)
    # 图集中的第i张图片
    i = 1
    for album_page in range(100):
        album_page_url = (
                "https://www.xrmn03.cc/" + album_address) if album_page == 0 else "https://www.xrmn03.cc/" + album_address.rstrip(
            ".html") + "_" + str(album_page) + ".html"
        for _ in range(20):
            try:
                pics_page = requests.get(url=album_page_url)
            except requests.exceptions.ChunkedEncodingError as err:
                logger.error(f"occur {err}")
                time.sleep(60)
            except requests.exceptions.ConnectionError as err:
                logger.error(f"{current_time()} occur {err}")
                time.sleep(60)
            else:
                pics_page.encoding = "utf-8"
                pics_soup = BeautifulSoup(pics_page.text, 'html.parser')
                # 如果页面中不存在class_="content",图集下载完成。
                if not pics_soup.findAll(class_="content"):
                    logger.info("{album} all downloaded".format(album=title))
                    return
                pics = pics_soup.findAll(class_="content")[0]
                pics = pics.findAll('img')
                if pics:
                    for pic in pics:
                        save_pic(title, pic, i)
                        i = i + 1
                break

可以看到获取整套图方法get_full_album(album_address, title)接收两个参数,分别表示图集地址album_address和图集名称title。

首先,判断路径下是否已存在与图集名称同名的文件夹,如果不存在,通过os.mkdir(title)进行创建。循环遍历for album_page in range(100),album_page表示图集中的分页,获取每个分页的超链接​​​​​​​,

album_page_url = (
                "https://www.xrmn03.cc/" + album_address) if album_page == 0 else "https://www.xrmn03.cc/" + album_address.rstrip(
            ".html") + "_" + str(album_page) + ".html"

用的格式是if分支语句的缩略写法。比如举个例子,大于0的数字是正数,相反则是非正数。正常写法是,​​​​​​​

if a > 0:
    print("Positive NO.")
else:
    print("Not Positive NO.")

​​​​​​​​​​​​​​简写格式则是,两种形式是等效的。

print("Positive NO.") if a > 0 else print("Not Positive NO.")

循环请求分页地址,循环体内请求分页链接,根据访问详情结果,用BeautifulSoup提取出所有的图片链接,循环图片数据,调用save_pic(title, pic, i)方法,下载至本地保存。

当然同保存图片方法一样,也使用了异常处理机制,增强代码运行的健壮性与稳定性。如果发生异常错误时,用for循环的方式增加重试/重新请求的机制。

四、遍历获取图集地址/名称

4.1 遍历图集

代码实现,​​​​​​​

for page in range(1, 24):
    url = "https://www.xrmn03.cc/XiuRen/" if page == 1 else "https://www.xrmn03.cc/XiuRen/index" + str(page) + ".html"
    resp = requests.get(url=url)
    resp.encoding = "utf-8"
    html = resp.text
    soup = BeautifulSoup(html, 'html.parser')
    albums = soup.findAll(class_="i_list list_n2")
    logger.info("Page No.{page} starting...".format(page=page))
    # 当前分页的第album_no图集
    album_no = 1
    for album in albums:
        album_url = album.find('a').attrs['href']
        album_title = album.find('a').attrs['title']
        logger.info("No.{no} album starting...".format(no=album_no))
        # 以下条件语句判断图集文件中的照片数量和图集名称中提取出的数量是否一致。如果一致则跳过该次循环。
        if os.path.exists(album_title):
            num_from_title = re.search(r'\d{2,3}P', album_title).group().strip("P")
            # print(num_from_title)
            if len(os.listdir("./" + album_title)) == int(num_from_title):
                logger.info("No.{no} album all already have saved before!".format(no=album_no))
                album_left = 30 - album_no
                if album_left > 0:
                    logger.info(f"当前分页{page},还剩{album_left}套待下载")
                album_no += 1
                continue
        get_full_album(album_url, album_title)
        logger.info("No.{no} album all saved!".format(no=album_no))
        album_left = 30 - album_no
        if album_left > 0:
            logger.info(f"当前分页{page},还剩{album_left}套图集待下载")
        album_no += 1
    logger.info("Page No.{page} completed".format(page=page))

遍历图集分页,获取图集的链接,

图片

根据图集分页链接组成规律,获取链接,for循环for page in range(1, 24)控制下载的页数范围,当前是下载1到23页的所有图集的图集信息。

获取所有albums,循环albums,处理得到图集链接album_url,图集名称album_title,如果已存在同名文件夹,并且文件夹中的图片数量与图集名称中的图片数量一致时,略过该图集,并写入对应日志信息。如果不存在同名文件夹,或者文件夹中的图片数量与文件夹名称中的数量不一致,则调用第三章中的get_full_album(album_url, album_title)方法。

ok,到这里结束了,有任何问题请留言或关注作者公众号,与我交流~


可以关注作者微信公众号,追踪更多有价值的内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/499561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

泛微E-Office10 < 10.0_20240222 远程代码执行漏洞

一、软件背景 泛微e-office是一套企业级电子办公解决方案,提供文档管理、流程审批、协同办公等功能,帮助企业实现数字化办公、提高工作效率。 二、影响版本 e-office10[10.0_20180516, 10.0_20240222) 三、漏洞分析 在受影响版本中,由于…

缺省和重载.引用——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 C输入&输出cout 和cin<<>> 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺…

【AIGC】如何在Windows/Linux上部署stable diffusion

文章目录 整体安装步骤windows10安装stable diffusion环境要求安装步骤注意事项参考博客其他事项安装显卡驱动安装cuda卸载cuda安装对应版本pytorch安装git上的python包Q&A linux安装stable diffusion安装anaconda安装cudagit 加速配置虚拟环境挂载oss&#xff08;optional…

实时渲染是什么意思?实时渲染和离线渲染的区别

一、实时渲染是什么意思&#xff1f; 实时渲染是指在计算机程序运行时即时地生成图像和动画的过程&#xff0c;这种渲染技术通常用于网络游戏、虚拟现实和增强现实等需要实时交互的XR应用中。实时渲染需要在每秒内渲染数百万到数十亿个像素&#xff0c;以呈现出平滑的动画和交…

位运算算法(2)

目录 面试题 01.01. 判断字符是否唯一 一、题目描述 二、思路解析 三、代码 268.丢失的数字 一、题目描述 二、思路解析 三、代码 371.两整数之和 一、题目描述 二、思路解析 三、代码 137.只出现一次的数字 II 一、题目描述 二、思路解析 三、代码 面试题 01.0…

consul集群部署三server一client

环境&#xff1a; consul&#xff1a;consul_1.16.2_linux_amd64.zip centos7.9 server:192.168.50.154 192.168.50.155 192.168.50.156 client:192.168.70.64 安装目录&#xff1a; [rootrabbit4-64 consul]# pwd /app/consul [rootrabbit4-64 consul]# ls consul consul_1…

Python基础:标准库 -- pprint (数据美化输出)

1. pprint 库 官方文档 pprint --- 数据美化输出 — Python 3.12.2 文档 pprint — Data pretty printer — Python 3.12.2 documentation 2. 背景 处理JSON文件或复杂的嵌套数据时&#xff0c;使用普通的 print() 函数可能不足以有效地探索数据或调试应用程序。下面通过一…

vue3开发前端表单缓存自定义指令,移动端h5必备插件

开发背景 公司需要开发一款移动端应用&#xff0c;使用vue开发&#xff0c;用户录入表单需要本地缓存&#xff0c;刷新页面&#xff0c;或者不小心关掉重新进来&#xff0c;上次录入的信息还要存在。 这里有两种方案&#xff0c;第一种就是像博客平台一样&#xff0c;实时保存…

基于JSP的母婴用品网站

背景 随着时代的飞速进步&#xff0c;计算机技术已经广泛而深刻地渗透到社会的各个层面。人们生活质量的持续提升&#xff0c;以及对母婴产品需求的日益增长&#xff0c;都推动了母婴用品网站开发的必要性和紧迫性。这类网站依托计算机技术&#xff0c;通过对相关产品信息的有…

Java毕业设计 基于SSM新闻管理系统

Java毕业设计 基于SSM新闻管理系统 SSM jsp 新闻管理系统 功能介绍 用户&#xff1a;首页 图片轮播 查询 登录 注册 新闻正文 评论 广告 社会新闻 天下新闻 娱乐新闻 个人中心 个人收藏 管理员&#xff1a;登录 用户管理 新闻管理 新闻类型管理 角色&#xff1a;用户 管理员…

代码随想录刷题day38|斐波那契数爬楼梯最小花费爬楼梯

文章目录 day38学习内容一、动态规划理论基础1.1、动态规划理论基础的几个关键概念&#xff1a;1.2、动态规划五部曲 二、斐波那契数2.1、动态规划五部曲2.1.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.1.2、确定递推公式2.1.3、 dp数组如何初始化2.1.4、…

数据结构——lesson11排序之快速排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

ASP.NET制作试卷(单选+多选)

需求&#xff1a; 1.包含单选题、多选题。 2.所有题做完再提交。 3.提示错误、统计分数&#xff08;提交后&#xff09;。 项目结构&#xff1a; 效果展示&#xff1a; 效果展示&#xff08;视频&#xff09;&#xff1a; ASP.NET练习1效果 index.aspx代码&#xff1a; &l…

排序---数组和集合

1、数组排序 Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序&#xff0c;并且是按照从小到大的排序。 public static void main(String[] args) {Integer []arr {1,2,3,4,5,6};//升序Arrays.sort(arr);for (int x:arr){System.out.print(x " ");}Sys…

大学生租房系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 1. 系统功能…

ForkJoinPool、CAS原子操作

ForkJoinPool ForkJoinPool是由JDK1.7后提供多线程并行执行任务的框架。可以理解为一种特殊的线程池。 1.任务分割&#xff1a;Fork&#xff08;分岔&#xff09;&#xff0c;先把大的任务分割成足够小的子任务&#xff0c;如果子任务比较大的话还要对子任务进行继续分割。 …

C#手麻系统源码,医院手术麻醉信息系统源码,前端框架:Vue,Ant-Design,后端框架:百小僧开源框架

手术麻醉管理系统覆盖了从患者入院&#xff0c;经过术前、术中、术后&#xff0c;直至出院的全过程。医院手术麻醉系统能够规范麻醉科和手术室的工作流程、实现麻醉手术过程中的信息数字化和网络化、自动生成麻醉手术中的各种医疗文书、完整共享HIS、LIS和PACS等手术患者信息&a…

RPA机器人:人人都会实现的机器人

在这个数字化飞速发展的时代&#xff0c;微信已经成为我们日常生活和工作中不可或缺的社交工具。然而&#xff0c;随着联系人数量的不断增加&#xff0c;如何高效管理这些社交关系成为了许多人面临的挑战。今天&#xff0c;我要为大家介绍的&#xff0c;是一款能够彻底改变你微…

PHP实现单列内容快速查重与去重

应用场景:excel一列内容比如身份证号&#xff0c;可能有重复的&#xff0c; 则用此工具快速查询那些重复及显示去重后内容。 使用&#xff1a;粘贴一列数据&#xff0c;然后提交发送。 <?php $tm "单列查重去重(粘贴Excel中1列内容查重)!";function tipx($str…

WEB embedded APP (javafx)

WEB embedded APP &#xff08;javafx&#xff09; &#xff08;BS 嵌入CS&#xff09; CS嵌入BS_哔哩哔哩_bilibili