python3开发环境
相应的python包:
import urllib.request
from lxml import etree
import re
import os
import datetime
开发环境:为了方便测试,
我这里使用的是Jupyter notebook
进行开发测试。
当然也可以使用其他的开发环境,例如PyCharm
。
谷歌浏览器
:用于抓包分析(其他浏览器也可以,例如火狐浏览器)
(更详细的关于安装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
使用 Xpath表达式
获取
//div/ul[@id="pictureurls"]/li/div/a/img/@src
.jpg
和 .png
两种格式,所有下载的图片还是需要按照这两种格式进行保存,所有需要获取原来图片的保存格式。由于每一组图片都是一样的格式保存的,要么是 .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
这样我们就可以获取到图片的名称了,无论怎么变化,这个正则表达式应该都可以满足这里的需求了。
前面的工作完成之后,我迫不及待的进行了测试。
然而却遇到了403
,404
错误…
经过分析,我认为网站设置了防盗链
解决方案:
最后成功解决了。
然后下载了几个小时,下载了21330张性感美女图片
,这里只是爬取了1~120页的图片,后面的没有继续去爬取。
这里只提供思路,完整的程序这里就不贴出来了,主要是担心到时候太多人去爬这个网站了,造成服务器宕机,毕竟这里只是一时兴起研究一下这个网站,没必要给站长带来麻烦。
最后这个网站的性感美女图片都是写真,是合法的,没有露点,所以不存在色情一说。
有兴趣的朋友可以研究一下,完成的分析过程和思路以及反爬取的解决方案已经给出了。
最后希望大家能完整写出来,搞点写真照欣赏一下<:#滑稽>