起因

LOC的大佬们最近开始疯狂的爬取mm131,作为一个Python初心者,作为技术上的学习,也要与时俱进,简单写了一个图片下载爬虫,看到大佬们似乎是做了一个typechoo的对接接口,我这边回头有空也搞一个wordpress的接口(只在博客内发布),之前写过一个新浪远程上传的接口,由于种种原因,新浪已经不支持外链了,因此这个wordpress接口可能就有时间再做了,不然做出来也是个摆设,没地方放。

代码解析

网址不发了,直接讲,或者大家直接百度谷歌都可以搜得到。
打开网站,总共有如下六个分类

mm131.jpg
mm131.jpg

每个分类下面都有一堆的图集,有N个分页的图集,但是第一页跟第二页的地址还不太一样,这点跟192tt做的很相似,感觉这几个站长是不是都是用的同一套程序,如果是的话可以通杀了。。。
首先遍历图集的地址,到目前更新文章截止,一共大概5000多套
按分类给他搞一个分类循环

1
2
3
4
list = {'xinggan':6,'qingchun':1,'xiaohua':2,'chemo':3,'qipao':4,'mingxing':5}
# list = {'mingxing':5}
for key in list:
getPageUrl(key,list[key])

解析图片url,用正则获取就行,用bs4取到末页的地址,然后遍历循环取图集地址

1
2
3
4
5
6
7
try:
i.find('img').get('src')
except Exception as e:
for s in i.find_all('a'):
endPage = s.get('href')
endPage = rex('list_%s_(\d+).html'%num,endPage)
continue

获取图集地址

1
2
3
4
5
6
7
8
9
10
nextUrl = "%s/list_%s_%s.html"%(url,num,i+2)
response = requests.get(nextUrl, headers=headers)
response.encoding = 'gb2312'
soup = BeautifulSoup(response.text, 'html.parser')
for i in soup.find('dl', {'class': 'public-box'}).find_all('dd'):
try:
i.find('img').get('src')
except Exception as e:
continue
print(i.find('a').get('href'))

需要注意的是,mm131的图片是有防盗链的,根据referer判断,随便找一个图集的地址设置上即可

1
2
3
4
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
'referer': "http://www.mm131.com/xinggan/4995.html",
}

线程池应用

之前的爬虫除了Scrapy搞出来的之外都是单线程的爬虫,优点是比较稳定,但是缺点也很明显,太慢了,mm131这个站的图大都比较小,如果是一张一张下载确实是不太划算,于是搞了个线程池。
Python的线程池很简单,只需要引入 threadpool 即可,如果报错,请 pip install threadpool,

1
2
3
4
5
6
7
8
9
10
# 引入threadpool
import threadpool
# 创建线程池,设置为12线程,可以根据自身情况修改
pool = threadpool.ThreadPool(12)
# 创建callback函数,参数1 getSingleData 是需要调用的函数名,list是函数getSingleData的参数,该方法适用于单个参数的函数,list是一个一维数组或对象
pageTask = threadpool.makeRequests(getSingleData, list)
# 执行线程池
[pool.putRequest(req) for req in pageTask]
# 等待完成后退出
pool.wait()

演示和下载

演示图

多线程演示.jpg
多线程演示.jpg
下载结果.jpg
下载结果.jpg

下载

演示代码不全,直接上地址
https://github.com/ai0by/ai0by-spider/tree/master/mm131