Python美女图片爬虫实战

Python美女图片爬虫实战

准备工作

  1. python3开发环境

  2. 相应的python包:

    import urllib.request
    from lxml import etree
    import re
    import os
    import datetime
    
  3. 开发环境:为了方便测试,

    我这里使用的是Jupyter notebook进行开发测试。

    当然也可以使用其他的开发环境,例如PyCharm

  4. 谷歌浏览器 :用于抓包分析(其他浏览器也可以,例如火狐浏览器)

(更详细的关于安装python包的安装这里就不说了,毕竟这个不是入门教程)

分析网页结构

网站:https://www.mn52.com/ mn52图库网(是正规的网站,没有露点,不属于色情范围,是合法的)

这个网站是一个图片网站,内容基本都是图片,分类有很多,因为网页结构都是一样的,所以我这里选取了性感美女这个分类进行分析。

性感美女:https://www.mn52.com/xingganmeinv/

因为我要爬取这个分类下的所有图片,所以首先我要分析这个url的组成。

爬取的时候是1~220页,每一页有20组图片(即一页有20个缩略图,点击进去才是我们需要获取的原图)。

分析完成之后思路如下:获取每一页的url → 获取每一页的20个详情页面的url → 获取每一详情页下的原图url → 下载每组图片的原图到本地。最后使用循环进行爬取。

大致的思路就是这样,下面开始写代码进行测试。

写代码分析

列表的url组成

第一页
https://www.mn52.com/xingganmeinv/list_1_1.html
第二页
https://www.mn52.com/xingganmeinv/list_1_2.html
末页
https://www.mn52.com/xingganmeinv/list_1_220.html
    
url组成:
url="https://www.mn52.com/xingganmeinv/list_1_" + number +".html"  (number=1-->200)

详情页url的获取

然后根据 Xpath表达式进行获取

//div[@id="waterfall"]/ul/li/div/a/@href

详情页下的所有图片url

使用 Xpath表达式获取

//div/ul[@id="pictureurls"]/li/div/a/img/@src

图片命名规则

图片的类型
  • 因为这里的图片有 .jpg.png两种格式,所有下载的图片还是需要按照这两种格式进行保存,所有需要获取原来图片的保存格式。
  • 这里获取图片的数据是根据IO流进行传输的,这里采用二进制的方式进行传输,即字节码方式传输,而不是字符。

由于每一组图片都是一样的格式保存的,要么是 .jpg,要么是 .png,所以我这里只是知道一张图片的保存格式即可,即获取到第一张图片的url后缀即可。

例如:实际的详情页下的某张图片的url组成

https://image.mn52.com/img/allimg/190827/8-1ZRH10243.png
https://image.mn52.com/img/allimg/190818/8-1ZQR13348.jpg

这里我们需要获取的是后面的四个字符

由于前面已经获取了每一个详情页下的所有原图url的列表[ ],这里只需要获取列表的第一个元素的后四个字符即可。

# src列表下的第一个元素 (src是所有的原图url列表)
firstSrc = src[0]
# 获取字符串的最后四个字符
filetype = firstSrc[-4:]
图片的命名

由于我们需要下载的图片很多,可能有几万张,甚至超过几十万张,所有一个好的命名方式显得很重要。

这里我按照图片原来的命名去命名,即是我需要获取到图片原来的命名名称。

在分析测试过程中,我发现图片命名可能存在以下两种(可能不止两种)

https://image.mn52.com/img/allimg/190827/8-1ZRH10243.png

https://image.mn52.com/img/allimg/c160322/145V4939360050-3110O.jpg

我这里需要获取的是

8-1ZRH10243
145V4939360050-3110O

由于图片类型前面已经获取到了,这里不需要再次获取。(或者也可以直接在这里获取名称和类型,直接省略上一步获取图片类型)

这里我使用正则表达式进行获取

# src是原图的url
pattern = '\w*?\-\w+'
name = re.search(pattern,src).group()
print(name)

# src = 'https://image.mn52.com/img/allimg/c150926/144323X0404I0-1261301.jpg'
# 结果144323X0404I0-1261301
# src = 'https://image.mn52.com/img/allimg/190818/8-1ZQR14016.jpg'
# 结果8-1ZQR14016

这样我们就可以获取到图片的名称了,无论怎么变化,这个正则表达式应该都可以满足这里的需求了。

反爬的解决

前面的工作完成之后,我迫不及待的进行了测试。

然而却遇到了403404错误…

经过分析,我认为网站设置了防盗链

解决方案:

  • 模拟浏览器爬取
  • 设置header为该网站链接发出的跳转请求

最后成功解决了。

然后下载了几个小时,下载了21330张性感美女图片,这里只是爬取了1~120页的图片,后面的没有继续去爬取。

自动爬取效果

程序可以改进之处

  • 程序可以设置一个时间判断:如果每次请求时间过长就跳过(防止某次请求时间过长,造成程序假死)
  • 设置多线程爬取(其实这里和开几个程序爬取是一样道理的,这里感觉没必要…因为该网站服务器感觉性能不高,开太多程序爬取,貌似也没有提高多少效率?)
  • 使用Scrapy框架爬取(提高效率?)

完整代码

这里只提供思路,完整的程序这里就不贴出来了,主要是担心到时候太多人去爬这个网站了,造成服务器宕机,毕竟这里只是一时兴起研究一下这个网站,没必要给站长带来麻烦。

最后这个网站的性感美女图片都是写真,是合法的,没有露点,所以不存在色情一说。

有兴趣的朋友可以研究一下,完成的分析过程和思路以及反爬取的解决方案已经给出了。

最后希望大家能完整写出来,搞点写真照欣赏一下<:#滑稽>

微信公众号

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值