前言

近期想要下载一组高清壁纸作为Visual Studio的背景,于是我想到了可以使用python脚本来完成这个任务,然后我就在网上随便找了一个已有的python脚本(https://blog.csdn.net/for_syq/article/details/93338582),但在使用时却发现百度设置了安全验证,导致无法抓取其html页面,不过我又想到了可以先用js将页面中的图片全部抓取出来,然后再利用python批量下载。

百度的安全验证

解决方法

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

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

接着调出控制台,准备获取图片链接

在控制台中输入以下代码:

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)

运行后的结果如下:

结语

希望这篇文章能够帮到你,如有疑问欢迎在文章下方留言。

说点什么
欢迎大家加入讨论(评论规则还在编写,咕咕咕)
由于博主学业繁忙,新评论可能需要很长时间才能过审,还请见谅
头像
支持Markdown语法
在"利用js与python批量下载百度图片中的壁纸"已有2条评论
Loading...