源码地址 在最下方
简介
程序员日常养眼系类、人体构造学系列、技术控爬虫系列。
功能很简单,抓mm131网站的m 女图片,理论上可以全部抓取下来。
思路很简单,根据点击思路,模仿人的浏览方式,最终保存到磁盘。
环境
- python 3.6
- requests 2.20.0
- lxml 4.2.5
使用方法
- 首先您需要拥有python 3。请自行安装,本文不涉及安装步骤。
- 其次将文件下载到本地,目录结构如下
mm131
└─lib
│ └─ parser.py
├─ main.py
├─ README.md
└─ requirements.txt
- 然后您需要安装上述环境中的各依赖。
root@localhost:~$ pip install -r requirements.txt
- 在 mm131 目录下执行
root@localhost:~/mm131$ python main.py
- 稍后您将会看到抓取过程中的输出,并在 mm131 文件夹中看到抓取到的picture。
[图片]
[图片]
[图片]
脚本思路
网站的防刷策略
直接访问 http://www.mm131.net/xinggan/ 将会被强制跳转到 index 界面,并且内容被置为空字符串。
经过Google浏览器的F12,找到了网站的防刷策略,关建在一个叫做 uaabc.js 的脚本文件
var mUA = navigator.userAgent.toLowerCase() + ',' + document.referrer.toLowerCase();
var _sa = ['baiduspider', 'baidu.com', 'sogou', 'sogou.com', '360spider', 'so.com', 'bingbot', 'bing.com', 'sm.cn', 'mm131.net'];
var _out = false;
for (var i = 0; i < 10; i++) {
if (mUA.indexOf(_sa[i]) > 1) {
_out = true;
break
}
}
if (!_out) {
var _d = new Date();
var _h = _d.getHours();
if (_h >= 0 && _h <= 23) {
var mPlace = escape(lo).toLowerCase();
if (mPlace == '%u5317%u4eac%u5e02' || mPlace == '%u56db%u5ddd%u7701' || mPlace == '%u6e56%u5317%u7701') {
top.location.href = 'https://m.mm131.net/index/';
}
}
};
脚本的大概意思是:userAgent 或者 referrer 中必须存在 ['baiduspider', 'baidu.com', 'sogou', 'sogou.com', '360spider', 'so.com', 'bingbot', 'bing.com', 'sm.cn', 'mm131.net'] 中的一个,
否则将会判断你的当前IP是否是 [北京、湖北、四川] 的,是的话将会强制跳转回 index 。
那么,我们只需要保证 refer 中包含 mm131.net,详情可见 parser.py 中的 set_header() 方法。
def set_header(self, referer):
headers = {
'Pragma': 'no-cache',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,ja;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
'Referer': '{}'.format(self.__set_referer(referer)),
}
return headers
解析界面
获取首页中主题ID、title
访问 http://www.mm131.net/xinggan/ 后会获取最新的20个主题的 ID以及title,这个将会用作下一步获取主题picture。
通过lxml 的 etree 对html进行定位和解析,最终获取到 id和title。详情可见 parser.py 中的 _ids_titles() 方法。
获取一个主题的所有picture链接
因为所有的picture链接都是很有规律的,很容易就可以拼接出某个主题的所有picture链接。详情可见 parser.py 中的 _ids_titles() 方法。
存储
上一步已经获取到了所有的picture链接了,有了链接,接下来就是存储就好了。可以使用串行下载,当然也可以使用并行,根据自己的需要自行调整就好啦。
- 串行下载一个页面的所有主题picture。get_page
- 并行下载一个页面的所有主题picture。get_page_parallel
搜索模块
可以直接搜索想要的角色的picture进行下载。但是目前由于官网服务器内部错误,待解决。
abort me
鉴于回复消息不及时,需要数据集的同学,请自行关注公众号: 小张睡不饱
回复:mm131爬虫代码
即可获得源码下载链接,同时还有其他惊喜哟
网友评论