前言

前几天一直在搞js,还有一些项目需要学习的内容,不免感到有些枯燥乏味。良辰之际,想写篇文章来梳理一下自己惆怅的心情,却又不知道如何下笔,而且找图也麻烦。哎?找图? 嘿嘿,然后猛的一下 (很快昂) 想起了自己以前初学时有个小目标还没实现,就是自己写个脚本把一个地方的图片全都下载下来,不用自己操心动手的那种。然后就开始了这段写爬虫之旅

exe文件

在windows下双击该文件即可运行,下载链接看下面

下载链接:阿里云盘
下载链接:蓝奏云(密码:fhr5)

源码

这个我是跟着直觉写的,仅供参考,如果有什么好的修改建议也欢迎提出!

  • 运行环境:python3以上
  • 需要安装的模块:bs4,requests
  • 别人的都是三条建议的,我再混多一条

目前发现第五个选项(收藏总数榜)有bug
其他bug暂未发现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

q = '''
前言 :输入数字选对应网址

1 : 最新的(https://wallhaven.cc/latest)

2 : 最火的(https://wallhaven.cc/hot)

3 : 排行榜(https://wallhaven.cc/toplist)

4 : 随机的(https://wallhaven.cc/random)

5 : 收藏总数榜(https://wallhaven.cc/search?categories=000&purity=000&topRange=3d&sorting=favorites&order=desc%3D&)

提示:有默认选项的可直接回车

'''
live = '''
***************************************************
く__,.ヘヽ. / ,ー、 〉
\ ', !-─‐-i / /´
/`ー' L//`ヽ、
/ /, /| , , ',
イ / /-‐/ i L_ ハ ヽ! i
レ ヘ 7イ`ト レ'ァ-ト、!ハ| |
!,/7 '0' ´0iソ| |
|.从" _ ,,,, / |./ |
レ'| i>.、,,__ _,.イ / .i |
レ'| | / k_7_/レ'ヽ, ハ. |
| |/i 〈|/ i ,.ヘ | i |
.|/ / i: ヘ! \ |
kヽ>、ハ _,.ヘ、 /、!
!'〈//`T´', \ `'7'ーr'
レ'ヽL__|___i,___,ンレ|ノ
ト-,/ |___./
'ー' !_,.:
********** 资料收集完毕,程序开始执行 *************
'''
done = '''
****************************
* 程序执行完毕! *
* *
* Created by Jason *
****************************
'''
'''内置网址供选择,也可自定义输入站内网址'''
import os,requests,bs4,time
def choose(j):
global m
if j == '1':
m = 'https://wallhaven.cc/latest'
elif j == '2':
m = 'https://wallhaven.cc/hot'
elif j == '3':
m = 'https://wallhaven.cc/toplist'
elif j == '4':
m = 'https://wallhaven.cc/random'
elif j == '5':
m = 'https://wallhaven.cc/search?categories=000&purity=000&topRange=3d&sorting=favorites&order=desc&'
j = input(q + '请按指示输入数字:')
if j:
choose(j)
else:
print('\n请输入正确的数字\n')
exit(0)
k = input('\n[$][选填]你希望从第几页开始爬取(默认为第一页):')
l = input('\n[$]你希望爬到第几页结束:')
i = input('\n[$]请输入要保存的绝对路径(默认为桌面):') #默认会路径C:\\Users\\$用户名\\desktop\\wallpaper\
'''操作目录'''
try:
os.chdir(i)
download_path = os.path.join(os.getcwd(),'wallpaper\\')
print(download_path)
except:
os.chdir('C:\\Users\\{}\\desktop'.format(os.getlogin()))
download_path = os.path.join(os.getcwd(),'wallpaper\\')
if not os.path.exists(download_path):
os.mkdir(download_path) #如果没有wallpaper文件夹,则自动创建
print('\n[+]当前下载目录为{}'.format(download_path))
print(live)
'''定义下载函数'''
def download(newUrl):
os.chdir(download_path)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'}
r = requests.get(newUrl,headers=headers,stream=True)
soup = bs4.BeautifulSoup(r.text,'html.parser')
src = soup.findAll('a',attrs={'class':'preview'})
for line in src:
u = line.get('href')
r = requests.get(u,stream=True,headers=headers)
soup = bs4.BeautifulSoup(r.text,'html.parser') #解析html页面
link = soup.findAll('img',attrs={"id":"wallpaper"}) #寻找所有属性为id=wallpaper的img标签
for j in link:
p = j.get('src') #提取图片中的src链接
print('\r[*]已找到图片链接{}'.format(p))
if p[-3] == 'p': #判断图片格式
q = requests.get(p,stream=True,headers=headers) #stream=True时,会先等下面二进制传输遍历完了再进行二进制传输,图片不容易崩
filename = p.split('/')[-1]
try:
if not os.path.isfile(filename):
with open(download_path+filename,'wb') as g:
for k in q.iter_content(10000): #以二进制方式进行传输,边下载边存硬盘
g.write(k)
print("\r[*]正在爬取图片{}".format(filename),end="")
print('\r[+]爬取成功,图片名:{}\n\n'.format(filename),end="")
else:
print('\r[-]图片已存在,跳过\n')
except:
pass
elif p[-3] == 'e':
q = requests.get(p,stream=True,headers=headers)
filename = p.split('/')[-1]
try:
if not os.path.isfile(filename):
with open(download_path+filename,'wb') as g:
for k in q.iter_content(10000):
g.write(k)
print("\r[*]正在爬取图片{}".format(filename),end="")
print("\r[+]爬取成功,图片名:{}\n\n".format(filename),end="")
else:
print('\r[-]图片已存在,跳过\n')
except:
print('\r[-]{}爬取失败'.format(q))
else:
q = requests.get(p,stream=True,headers=headers)
filename = p.split('/')[-1]
try:
if not os.path.isfile(filename):
with open(download_path+filename,'wb') as g:
for k in q.iter_content(10000):
g.write(k)
print("\r[*]正在爬取图片{}".format(filename),end="")
print("\r[+]爬取成功,图片名:{}\n\n".format(filename),end="")
else:
print('\r[-]图片已存在,跳过\n')
except:
print('\r[-]{}爬取失败'.format(q))
'''从第几页下载,要下载几页'''
if k:
for i in range(int(k),int(l)):
newUrl = m + '?page=' + str(i)
download(newUrl)
if int(k) + i == int(l):
print('\n'+done)
else:
print('\n[+]第{}页爬取完成,开始爬取第{}页\n'.format(i,i+1))
time.sleep(1)
print(done)
else:
for i in range(1,int(l)):
newUrl = m + '?page=' + str(i)
download(newUrl)
if i + 1 == int(l):
print('\n'+done)
else:
print('\n[+]第{}页爬取完成,开始爬取第{}页\n'.format(i,i+1))
time.sleep(1)


更换所有图片名

图片下载了之后看见图片全都是一些奇怪的名字,不好看,得排一下序才好看点,所以我又写了个排序的脚本(排序顺序:自然数 1~n)

  • 使用方法:
  1. 将图片文件存放路径复制到运行的代码框内
  2. 耐心等待即可

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
import os
from glob import glob
gps = input('请输入你存放图片的路径:')
os.chdir(gps)
lists = glob('*') #遍历目录下的所有图片文件
num=1
path = os.getcwd() + '\\\\'
for i in range(len(lists)):
if lists[i].split('-')[0] == 'wallhaven':
if lists[i].split(".")[1] == 'png':
os.rename(os.path.join(path,lists[i]),os.path.join(path,str(num)+".png"))
print('\n[+]图片更名成功,图片名为{}.png\n'.format(num))
num+=1
elif lists[i].split(".")[1] == 'jpg':
os.rename(os.path.join(path,lists[i]),os.path.join(path,str(num)+".jpg"))
print('\n[+]图片更名成功,图片名为{}.jpg'.format(num))
num+=1

图片分类

大致判断图片是否为手机端的图片(宽度<1080)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'''思路:先枚举文件,然后cv2.imread()后再shape[1:2][0]读取宽度,宽度小于1920则操作,最后shutil.move(src,dst)移动'''
import glob,os,cv2,shutil,threading
src = input('请输入你需要移动的文件路径')
dst = input('\n请输入你移动文件的目标路径')
os.chdir(src)
all = glob.glob('*')
def main(all):
for j in range(len(all)):
try:
file = all[j]
print('\r[*]{} is working...'.format(file),end="")
width = cv2.imread(str(file)).shape[1:2][0]
if width < 1080:
shutil.move(str(file),'{}'.format(dst))
print('\n[+]' + file + ' move success!\n')
except:
print('[-]' + file + '\tfalse\n')
threading.Thread(target=main,args=(all,)).start()