不想一张张看壁纸怎么办,不想一张张下载怎么办,来让我们用python解决一切,爬取一网站所有壁纸。
1.准备前期运行环境
·python运行环境,安装request模块 (这个问题需要自己去解决)
2.分析网页行为 [想直接点的,可以跳过这一节,copy-code-running]
·网站管理员禁用了F12
openB.png
·分析出网站图片地址
01.png
可以拿这个地址去新标签试一下,我们会发现请求到的是图片的缩略图,明显不是我们想要的
我们要拿到图片的真实地址
我们去看网站请求的资源
02.png
这个请求,站长做了验证,所以我们需手动赋值数据内容保存到本地备用
我们分析一下用了什么方式请求到的真实地址
03.png
·分析地址的构成规律
json文件中每一个item
t代表图片类型 type
x代表图片宽 width
i代表图片的id
y代表图片的高 height
很显然这个拼接规律是 其中的图片id和类型要替换
3.根据分析到的解决思路写代码
我没有做用户代理,没有按工程化流程来,没有做异常处理
只是简述了这个小demo的分析原理
测试的时候下载有点迟缓,不过不影响
import requests
import json
# 定义基本变量
urlbase = "https://w.wallhaven.cc/full/"
# json文件地址
filejson = "imgjson.json"
# 下载壁纸的路径 -请自行修改
filepath = "D:\\PycharmProjects\\robots\\bizhi\\"
# 保存的拼接字符串
Imgjson = []
def Concaturl(records):
for item in records:
imgType = "png" if item["t"] == "p" else "jpg"
imgid = item["i"]
concaturl = imgid[0:2] + "/wallhaven-" + imgid + "." + imgType
Imgjson.append(concaturl)
print("地址拼接完成,开始下载...")
def DownLoadImg():
i = 1
for img in Imgjson:
imgtype = "png" if img[-3:-2] else "jpg"
url = urlbase + img
ref = requests.get(url)
fh = open(filepath + str(i) + "." + imgtype + "", "wb")
fh.write(ref.content)
print("第" + str(i) + "张下载成功")
i += 1
print("全部下载成功")
if __name__ == '__main__':
f = open(filejson, "r")
load_dict = json.load(f)
records = load_dict["result"]["records"]
# 拼接好的字符串列表
Concaturl(records)
# 下载函数
DownLoadImg()
04.png
好看的壁纸就存下来啦,不用挑,也不用一个个下。人生路远,简单就好!