[success]首先先申明一下,这个爬壁纸其实是需要会员的,因为你是否可以下载是在服务器那边判断的,我这边也没有办法,不过它这个终身的vip只要30元,所以还是挺划算的,这里我打算把它大概2400多张4K动漫壁纸都下下来,为了让我们看起来更友好,我们每隔一秒下一张吧。[/success]
好了,现在开干!
这里我还是直接贴代码,其他的东西也没什么好解释的。
# -*- coding:UTF-8 -*-
import requests, json, os, time
from threading import Thread
from bs4 import BeautifulSoup
from contextlib import closing#这个是图片下载的库
class img(object):
def __init__(self):
self.target = "http://pic.netbian.com/4kdongman/"
self.urls = []
self.names = []
self.headers = {'Cookie':'你的cookie数据'}
def geturl(self):
for index in range(1, 116):
if index != 1:
target = self.target + 'index_' + str(index) + '.html'
else:
target = self.target
req = requests.get(url=target)
req.encoding = 'GBK'
bf = BeautifulSoup(req.text, 'lxml')
bf = bf.find_all("div", class_='slist')[0].find_all('a')
for each in range(len(bf)):
text = bf[each].attrs['href']
self.names.append(text[8:text.find('.')])
self.urls.append("http://pic.netbian.com/downpic.php?id=" + text[8:text.find('.')])
def download(self, url, name): # 这里就是下载图像的函数,配合多线程使用,使下载速度加倍
print ('正在下载:%s' % name)
if not os.path.exists('img'): # 这里是创建文件夹
os.makedirs('img')
# 这里就是换一个路径,下载到img下
with closing(requests.get(url=url, stream=True, headers=self.headers)) as r: # 这里就是下载图片的代码了
with open('img/%s.jpg' % name, 'ab+') as f: # 这里是保存图片
for chunk in r.iter_content(chunk_size=1024): # 下面都是下载图片数据的代码,所以不解释
if chunk:
f.write(chunk)
f.flush()
def moredown(self):
self.geturl()
threads = [] # 这里我们使用多线程,要把这些线程放到列表里
for i in range(len(self.urls)): # 我们要下多少图片就开多少线程
t = Thread(target=self.download(self.urls[i], self.names[i])) # 把函数加到线程里面
t.start() # 开始线程
threads.append(t) # 把线程都加到列表里面,方便后面判断是否下载完毕
time.sleep(1)
for t in threads:
t.join() # 这里就是等待线程结束的代码
print ("下载完成")
if __name__ == "__main__":
a = img()
a.moredown()
实际效果如上图,这次爬2400多张图片每张大小大概为4M可能会下大概9G的数据,如果那边的服务器不把我封掉的话。。这个就真的非常爽了
几分钟后:好吧我承认我还是太天真了,原来这个会员虽然是永久的但是每天只能下200张图片,所以这次只爬了197张大概721M左右。
所以,我还要继续盘它,我们这次爬那些不要钱的动漫壁纸,大概也有2000多张,这次我就对他不客气了,不延时直接下,看一下总共多大。
等了20多分钟,终于把所有图片都爬完了,没想到别人的服务器居然没有封我,这次总共爬了2098张图片,大概有1个G吧。
好了,到这里就结束了,下次我还要继续接着爬4k的壁纸,一天下两百多张还是挺不错的。