导入必要的包(package)
若没有下列的包,可使用pip install 包名
命令安装
- re: 使用正则表达式
- requests: 向网站发出请求
- bs4: 解析网页内容
- time: 计算时间
1 | import re |
任务要求: 批量下载某网站的壁纸
访问壁纸网站
我选择的是壁纸质量高的wallpapers home点击此处访问,网站主页如下
寻找关键页面
点击主页上的View All Wallpapers注意网址变化
目标页面,出现了参数page=1
,每个页面有12张壁纸信息
查看页面请求头
寻找Host
信息和Headers
信息,使用开发者工具操作,如下
定位壁纸信息
选择元素,找到图片的准确信息,操作步骤如下图
找到壁纸信息
壁纸所在的div
标签的类名为class=pics
准确定位壁纸的地址
在上述页面中点击任意一张壁纸,会出现新页面,在新页面中将鼠标移至Download
处,选择分辨率1920x1080
,浏览器左下角将会出现壁纸的地址信息如下
任务分析
定制请求头和初始变量
1 | headers = { |
目标网页的网址规律
因为不仅仅抓取一个页面的壁纸,故可利用page
参数设置请求地址,查看页面数量可知一共有1502张页面,故可如下操作即可访问每个页面1
2
3
4
5for i in range(1502):
wallpaper_name = [] # 存储每张页面的壁纸名字
url = "https://wallpapershome.com/?page=" + str(i+1)
r = requests.get(url, headers=headers)
print("状态响应码:", r.status_code)
解析壁纸的地址信息
通过先前的壁纸的地址信息分析可知,每张壁纸存贮在地址https://wallpapershome.com/images/wallpapers/
下,壁纸格式形如分类-分辨率-清晰度-名字.jpg
,故利用获取到的壁纸名,再通过设定分辨率,组合可得到壁纸地址
创建一个处理壁纸名的函数1
2
3
4
5
6
7
8def handle_name(line):
sep = '-'
m = re.match('(.*)/(.*).html$', line)
name = m.group(2)
name = name.split('-')
name.insert(-2, size)
name = sep.join(name)
return name
再获取每页12张壁纸全名1
2
3
4soup = BeautifulSoup(r.content, 'lxml')
wallpaper_list = soup.find('div', class_='pics')
for j in range(12):
wallpaper_name.append(handle_name(wallpaper_list.contents[j].a.get('href')))
辅助信息
检测运行状态1
2
3print("正在下载第" + str(i+1) + "个页面")
cost = time.time() - start
print("已运行时间:" + str(cost) + '秒')
下载每张壁纸
1 | for j in range(12): |
运行效果如下
可能因为是国外网站的原因,下载速度慢得… -.- 部分运行结果如下1
2
3
4
5
6
7
8
9状态响应码: 200
正在下载第69个页面
已运行时间:3.5130293369293213秒
++++++++++++
状态响应码: 200
正在下载第70个页面
已运行时间:85.50803112983704秒
++
大量精美壁纸(free)收入囊中
岂不美哉,妈妈再也不用担心我没有壁纸换了(手动滑稽)