爬取mm131网站的图片,并且保存到本地
python3.7 requests.2.22.0 BeautifulSoup4 4.8.2
从网站的sitemap.xml中可以看到最新更新的都是在**https://www.mm131.net/xinggan/**后面,并且是有规律的变化,这样写爬虫倒是方便了很多。这边我们仅为学习,只爬取最新的几条就行。
随便打开一个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。
直接把图片url放地址栏搜索,发现会不给源图片
打开F12继续看,找到了一个叫uaredirect.js的文件
大概意思是对请求头的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/';
}
}
};
首先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!")
总的来说,这个爬虫并不难,url非常有规律,还是比较好爬的,下面是测试时候,小小的爬了亿点点,各位同学学习之余也要注意身体。
源码请移步:https://github.com/KingJeeWhy/mm131