文章摘要
前言 近期想要下载一组高清壁纸作为Visual Studio的背景,于是我想到了可以使用python脚本来完成这个任务,然后我就在网上随便找了一个已有的python脚本( https://blog.csdn.net/for_syq/article/details/93338582 ),但在使用时却发现百度设置了安全验证,导致无法抓取其html页面,不过我又想到了可以先用js将页面中的图片全部抓取出…
前言 近期想要下载一组高清壁纸作为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) 运行后的结果如下: 结语 希望这篇文章能够帮到你,如有疑问欢迎在文章下方留言。前言
近期想要下载一组高清壁纸作为Visual Studio的背景,于是我想到了可以使用python脚本来完成这个任务,然后我就在网上随便找了一个已有的python脚本(https://blog.csdn.net/for_syq/article/details/93338582),但在使用时却发现百度设置了安全验证,导致无法抓取其html页面,不过我又想到了可以先用js将页面中的图片全部抓取出来,然后再利用python批量下载。

解决方法
以关键词为“自然风景壁纸精选”为例,搜索时,百度会反馈回以下页面

可以设置筛选来忽略掉一些不符合条件的图片,这里我选择筛选出1920x1200的大尺寸壁纸,设置完筛选后可以滚动鼠标让百度多生成出一些预览图,方便多抓取一些壁纸,如下:

接着调出控制台,准备获取图片链接
在控制台中输入以下代码:
按下回车后执行,会自动在控制台内输出已获取的图片链接

然后右键将控制台的输出结果另存为consoleLogs.log文件,等下python文件会用到这个log文件

在consoleLogs.log文件所在目录下新建一个python脚本,然后在脚本中输入以下代码
运行后的结果如下:


结语
希望这篇文章能够帮到你,如有疑问欢迎在文章下方留言。
本文采用 CC BY-NC-SA 4.0 协议进行授权,如无注明均为原创,转载请注明出处。
标题:利用js与python批量下载百度图片中的壁纸作者:九仞之行链接:http://dev.styunlen.cn/archives/post-886.html
