本文发布于1439天前,最后更新于 1439 天前,其中的信息可能已经有所发展或是发生改变。
前言
近期想要下载一组高清壁纸作为Visual Studio的背景,于是我想到了可以使用python脚本来完成这个任务,然后我就在网上随便找了一个已有的python脚本(https://blog.csdn.net/for_syq/article/details/93338582),但在使用时却发现百度设置了安全验证,导致无法抓取其html页面,不过我又想到了可以先用js将页面中的图片全部抓取出来,然后再利用python批量下载。
解决方法
以关键词为“自然风景壁纸精选”为例,搜索时,百度会反馈回以下页面
可以设置筛选来忽略掉一些不符合条件的图片,这里我选择筛选出1920x1200的大尺寸壁纸,设置完筛选后可以滚动鼠标让百度多生成出一些预览图,方便多抓取一些壁纸,如下:
接着调出控制台,准备获取图片链接
在控制台中输入以下代码:
for(var x in document.getElementsByClassName("imgitem")){console.log("data-objurl:\""+ document.getElementsByClassName("imgitem")[x].getAttribute("data-objurl")+"\"");}
按下回车后执行,会自动在控制台内输出已获取的图片链接
然后右键将控制台的输出结果另存为consoleLogs.log
文件,等下python文件会用到这个log文件
在consoleLogs.log
文件所在目录下新建一个python脚本,然后在脚本中输入以下代码
import requests
import os
import re
import sys
# 解析logs获取图片URL
re_url = re.compile(r'data-objurl:"(.*?)"')
def resolveImgUrl(logs):
imgUrls = [x for x in re_url.findall(logs)]
return imgUrls
def downImg(imgUrl, dirpath, imgName):
filename = os.path.join(dirpath, imgName)
try:
res = requests.get(imgUrl, timeout=15)
if str(res.status_code)[0] == "4":
print(str(res.status_code), ":" , imgUrl)
return False
except Exception as e:
print(" This is Exception:", imgUrl)
print(e)
return False
with open(filename, "wb") as f:
#部分文件下载过来时是空白的小方格,所以在这里加了一层过滤
if(len(res.content) > 100):
f.write(res.content)
else:
print("图片文件为空白,url:", imgUrl)
return False
return True
def mkDir(dirName):
dirpath = os.path.join(sys.path[0], dirName)
if not os.path.exists(dirpath):#判断是否存在文件夹
os.mkdir(dirpath)
return dirpath
def crawl_data(logs):
index = 0
count = 0
folderName=input('请输入用于保存图片的文件夹名称:')
dirpath = mkDir(folderName)
imgUrls = resolveImgUrl(logs)
if len(imgUrls) == 0: # 没有图片则结束
print(imgUrls)
return
for url in imgUrls:
index += 1
print("正在下载第 %s 张图片" % index)
if downImg(url, dirpath, str(count) + ".jpg"):
count += 1
print("下载完毕,共尝试下载%s张图片,成功下载了%s张图片"%(index,count))
if __name__ == '__main__':
with open(os.path.join(sys.path[0],"consoleLogs.log"), "r",encoding="utf8") as fLog: # 打开文件
logs = fLog.read() # 读取文件
crawl_data(logs)
运行后的结果如下:
结语
希望这篇文章能够帮到你,如有疑问欢迎在文章下方留言。
如果百度更换接口,这个方法就失效啦φ( ̄∇ ̄o)
不过应该可以使用一段时间