参考地址:python爬取pexels高清壁纸
- 高清图片地址:https://www.pexels.com/zh-cn/
- 支持中英文查询
- 使用selenium仿浏览器发起请求
- 分页请求获取图片地址,存入本地文件夹
1. 代码如下:
import requests
import re
import time
from selenium import webdriver
import os
from urllib import parse
# 创建文件夹
def makedir(filePath):
E = os.path.exists(filePath)
if not E:
os.makedirs(filePath)
os.chdir(filePath)
print('文件夹<' + filePath + '>创建成功!')
else:
print('文件夹已存在!')
def start():
start_time = time.time()
# 1. 查询关键字:可以中文,可以英文
searchKey = '苹果'
# 2. 创建当前问关键字对应的文件夹
makedir('F:\python\pic' + '\\' + searchKey + '\\')
urlStr = 'https://www.pexels.com/zh-cn/search/' + parse.quote(searchKey) + '/?page={}'
# 3. 定义查询页数
urls = [
urlStr.format(str(i)) for i in range(1, 3)]
print('待处理地址有:' + str(urls))
# UAC伪装,防止被服务器识别
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
ua = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
# 4. 遍历每一个网址,拿到对应图片url地址(仿谷歌浏览器去请求)
# 存储下载地址的列表
imgList = []
for url in urls:
try:
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
web = webdriver.Chrome(options=options)
web.get(url)
# 由于这个动态加载的网页,使用selenium获取网页源代码
wb_resp = web.page_source # 返回源代码
# 打开的网页要及时关闭
web.close()
# 使用正则表达式在we_resp中匹配找到下载地址,并且返回一个可以迭代的对象
download_link = re.findall('data-big-src="(?P<src>.*?)"', wb_resp)
# imgList追加合并
imgList.extend(download_link)
print('地址[' + url + ']已经完成图片url的获取')
except ConnectionError:
web.close()
print("谷歌浏览器打开地址[" + url + ']出错')
print('待下载图片为:' + str(len(imgList)) + '个')
# 5. 遍历所有的下载地址,下载每一张图片
for link in imgList:
# 其中的一个下载地址:https://images.pexels.com/photos/1580271/pexels-photo-1580271.jpeg?auto=compress&cs=tinysrgb&h=750&w=1260
# 使用get方式来下载图片
image_resp = requests.get(link, headers=ua)
# 为了避免命名重复导致报错,使用其中的一直在变化的一串数字来作为文件名
image_name = link.split("?")[0].split("/")[-1]
# 文件名称
# 创建Bytes形式的图片文件,把数据写入图片文件中,保存在文件中,打开方式为二进制写模式
with open(r"f:\python\pic\\" + searchKey + '\\' + image_name, mode="wb") as f:
f.write(image_resp.content)
# 关闭
image_resp.close()
# 结束时间
print('全部图片已完成下载,总耗时为:' + str(time.time() - start_time))
if __name__ == '__main__':
start()
2. 控制台运行日志如下
: