利用js与python批量下载百度图片中的壁纸
本文发布于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)

运行后的结果如下:

结语

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

评论

  1. Styunlen
    Windows Edge 88.0.705.63
    4 年前
    2021-2-08 14:33:53

    如果百度更换接口,这个方法就失效啦φ( ̄∇ ̄o)

    • Styunlen
      Styunlen
      Windows Edge 88.0.705.63
      4 年前
      2021-2-08 14:34:55

      不过应该可以使用一段时间

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
Source: https://github.com/zhaoolee/ChineseBQB
Source: https://github.com/zhaoolee/ChineseBQB
Source: https://github.com/zhaoolee/ChineseBQB
颜文字
Emoji
小恐龙
花!
滑稽大佬
演奏
程序员专属
上一篇
下一篇