Python:mm131图片爬虫实现

目标

爬取mm131网站的图片,并且保存到本地

环境

python3.7 requests.2.22.0 BeautifulSoup4 4.8.2

1、分析url

从网站的sitemap.xml中可以看到最新更新的都是在**https://www.mm131.net/xinggan/**后面,并且是有规律的变化,这样写爬虫倒是方便了很多。这边我们仅为学习,只爬取最新的几条就行。
Python:mm131图片爬虫实现_第1张图片

2、进入网页拿图片

随便打开一个https://www.mm131.net/xinggan/5357.html,一共66页图片,打开F12,可以看到图片url,尽管有分页,但是图片url也是非常有规律。
第1页图片:
在这里插入图片描述
第2页图片:
在这里插入图片描述
第66页图片:
在这里插入图片描述
5357是上面我们进入的网页最后面的数字number,X.jpg则是我们的分页,这样我们就可以拼接出图片的url为https://img1.mmmw.net/pic/number/X.jpg,只要拿到总页页码,就能拿到所有的图片url。

3、访问图片

直接把图片url放地址栏搜索,发现会不给源图片
Python:mm131图片爬虫实现_第2张图片
打开F12继续看,找到了一个叫uaredirect.js的文件
Python:mm131图片爬虫实现_第3张图片
大概意思是对请求头的referer参数进行了限制,所以我们在请求图片的时候要注意referer参数,用主站的地址https://www.mm131.net就行,代码我贴上,有兴趣的同学可以多看下:

function uaredirect(f) {
	try {
		if (document.getElementById("bdmark") != null) {
			return
		}
		var b = false;
		if (arguments[1]) {
			var e = window.location.host;
			var a = window.location.href;
			if (isSubdomain(arguments[1], e) == 1) {
				f = f + "/#m/" + a;
				b = true
			} else {
				if (isSubdomain(arguments[1], e) == 2) {
					f = f + "/#m/" + a;
					b = true
				} else {
					f = a;
					b = false
				}
			}
		} else {
			b = true
		}
		if (b) {
			var c = window.location.hash;
			if (!c.match("fromapp")) {
				if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i))) {
					location.replace(f)
				}
			}
		}
	} catch (d) {
	}
}
function isSubdomain(c, d) {
	this.getdomain = function(f) {
		var e = f.indexOf("://");
		if (e > 0) {
			var h = f.substr(e + 3)
		} else {
			var h = f
		}
		var g = /^www\./;
		if (g.test(h)) {
			h = h.substr(4)
		}
		return h
	};
	if (c == d) {
		return 1
	} else {
		var c = this.getdomain(c);
		var b = this.getdomain(d);
		if (c == b) {
			return 1
		} else {
			c = c.replace(".", "\\.");
			var a = new RegExp("\\." + c + "$");
			if (b.match(a)) {
				return 2
			} else {
				return 0
			}
		}
	}
};
;
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://www.mm131.net/index/';
		}
	}
};

4、代码实现

首先requests.get方法中的headers定义,要包含referer和user-agent,其他的不要也行。

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
               "Referer": "https://www.mm131.net"
        }

然后,请求到分页的网站获取分页,直接用BeautifulSoup拿分页标签里的数字就行。

allPage = soup.select('body > div.content > div.content-page > span:nth-child(1)')[0].string[1:-1]

最后就是下载图片了,根据分页拼接图片url,然后下载下来就行。

def downloadPic(title, allPage, htmlMark):
    for number in range(1,int(allPage)+1):
        picUrl = f"https://img1.mmmw.net/pic/{htmlMark}/{number}.jpg"
        pic = getHtml(picUrl)
        with open(f"{title}/{number}.jpg", "wb+") as f:
            f.write(pic.content)
            print(f"{number}.jpg download successful!")

5、总结

总的来说,这个爬虫并不难,url非常有规律,还是比较好爬的,下面是测试时候,小小的爬了亿点点,各位同学学习之余也要注意身体。
Python:mm131图片爬虫实现_第4张图片
源码请移步:https://github.com/KingJeeWhy/mm131

你可能感兴趣的:(Python:mm131图片爬虫实现)