Python爬虫: 百度图片爬虫 (内附有“Forbid spider access”报错处理,翻页处理,正则表达式使用,百度图片objURL解密!有弹窗设计!爬好的图片直接下载到一个文件夹中!)

本文详细介绍了如何使用Python实现百度图片爬虫,包括获取图片URL、正则表达式筛选、解密加密网址及保存图片到本地。主要步骤包括:抓取数据包、解析JSON、解密图片链接和保存图片。同时,文中还讨论了爬虫过程中可能遇到的问题及解决方案,如Forbidspideraccess错误、网址解密等。
摘要由CSDN通过智能技术生成

这是一个百度爬虫的练习,博主也是个爬虫小白,这是一个学习成果分享!如果有哪里出现问题的望大家及时反馈哦!

码字不易,走过路过,给个赞吧xdm

这里是整段的源码:百度图片爬虫完整代码https://blog.csdn.net/weixin_56198196/article/details/120472183

下面我们一步步来看过程哈,一共分为4大步:

目录

1.抓数据包(存放图片信息的包),获取URL

2.采用正则表达式得到图片链接

3.网址获取(含解密)

4.将图片保存到本地


(注意:我把百度图片中以堆糖为源网页的图片保留了下来,其他的图片都过滤了,我在下面的代码中会说明如果不想滤掉其他的内容怎么做)

爬虫的过程就是模拟我们人浏览网页的过程,我们在写代码之前,首先要搞明白网站结构,找出数据储存在哪里,是什么格式。我们下载图片需要的是图片的下载网址,所以明确的目标就是找到图片网址存在了什么地方。

我们可以先随便输入一个词,进入页面,了解一下网站情况。这里我以输入关键词“史努比”为例。

1.抓数据包(存放图片信息的包),获取URL

进入到搜索结果页面,先刷新一下鼠标右键点击检查,选择检查中的网络(Network)选项卡→点击上方的“XHR”,出现情况如下图所示,这里的以acjson开头的东西就是存放图片下载链接的数据包,可以点击数据包,点击“响应”来查看,可以看到我们需要的图片下载网址:

点击数据包后,点击上方的标头,找到这个数据包的URL 

2.采用正则表达式得到图片链接

响应这里可以看到数据格式为json,采用正则表达式,这里可能会遇到这样几个问题:

①Forbid spider access

解决方法:在headers请求头那里多加一下请求标头里的东西

②要不要使用 “from urllib.parse import quote”对输入的中文主题转码

解决方法:不使用,我这里是没有用的。具体原因我也不太清楚。我一开始是用的,后来发现出错,就把这个删掉就好了。

③翻页怎么看

解决方法:我们打开网络选项卡后,点击XHR,然后下滑页面,发现会加载出更多文件(以acjson开头的),然后注意到url参数里的pn在变,而且是以30为幅度在变化,这里就使控制翻页的参数,可以构造for循环进行翻页

④关于params里面有个参数logid那里可以填成自己网页搜到的,目前我还不确定这个id是不是有时效的(因为我已经看到了很多个id)

import requests
import re
import PySimpleGUI as sg
import os

layout=[                                             #弹窗设计,让用户进行主题输入
    [sg.Text('请输入你要寻找的图片主题')],
    [sg.Input()],
    [sg.Text('请输入你需要的图片数(请填写阿拉伯数字,例如:1):')],
    [sg.Input()],
    [sg.Button('确认')]
    ]
window=sg.Window('百度图片下载',layout)
event,values=window.read()
window.close()

url='https://image.baidu.com/search/acjson'
for i in range(0,180,30):
    params={
        'tn': 'resultjson_com',
        'logid': '5280191307193676757',  #不知道这里的logid有没有时效
        'ipn': 'rj',
        'ct': '201326592',
        'fp': 'result',
        'queryWord': values[0],       #你要查询的主题词
        'cl': '2',
        'lm': '-1',
        'ie': 'utf-8',
        'oe': 'utf-8',
        'st': '-1',
        'ic': '0',
        'word': values[0],           #你要查询的主题词
        'face': '0',
        'istype': '2',
        'nc': '1',
        'pn': i,                     #这里可以构造翻页
        'rn': '30',
        'gsm': 'b4'
    }
    headers={                            #遇到Forbid spider access就在请求头多加一些东西,试了一下'Accept-Encoding'是关键
        # 'Accept': 'text/plain, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        # 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        # 'Connection': 'keep-alive',
        'Cookie': 'BDqhfp=%E5%8F%B2%E5%8A%AA%E6%AF%94%26%260-10-1undefined%26%263746%26%264; BIDUPSID=5A04241009FD166564DACF4050551F2D; PSTM=1611376447; __yjs_duid=1_2de46e288096c13a7edea3d05a5204421620544039468; BAIDUID=F163DBC1DF098AF604AE753E72659BAA:FG=1; BDUSS=Tczc3RnamRhaUhicm5rfm83V3pkMTBySUd1Z0V4Q25mbXhYdElRemJHdVktVnRoRVFBQUFBJCQAAAAAAQAAAAEAAACR090iR3JpZmZleTUxMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhsNGGYbDRhN; BDUSS_BFESS=Tczc3RnamRhaUhicm5rfm83V3pkMTBySUd1Z0V4Q25mbXhYdElRemJHdVktVnRoRVFBQUFBJCQAAAAAAQAAAAEAAACR090iR3JpZmZleTUxMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhsNGGYbDRhN; BAIDUID_BFESS=F163DBC1DF098AF604AE753E72659BAA:FG=1; BDORZ=AE84CDB3A529C0F8A2B9DCDD1D18B695; userFrom=cn.bing.com; IMG_WH=573_756; H_WISE_SIDS=110085_178384_179349_181588_182531_183327_183611_183750_184578_185029_185517_185653_185750_186317_186411_187020_187195_187206_187292_187450_187663_187670_187928_8000097_8000100_8000126_8000140_8000150_8000169_8000177_8000185; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; firstShowTip=1; cleanHistoryStatus=0; indexPageSugList=%5B%22%E5%8F%B2%E5%8A%AA%E6%AF%94%22%2C%22%E6%B5%B7%E8%B4%BC%E7%8E%8B%22%2C%22%E8%8A%B1%E6%9C%B5%22%2C%22undertale%22%2C%22python%22%2C%22%E8%8A%B1%E7%AE%80%E7%AC%94%E7%94%BB%22%2C%22%E5%90%8C%E5%9E%8B%E4%B8%96%E4%BB%A3%E4%BA%A4%E6%9B%BF%22%2C%22%E6%A8%9F%E7%A7%91%E8%8A%B1%22%2C%22%E6%A8%9F%E7%A7%91%E8%8A%B1%E7%9A%84%E8%A7%A3%E5%89%96%22%5D; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; ab_sr=1.0.1_MTY1OTI2YjEyMzViNzQyYWVhZjdhZWQxNzc0YjE1NzA2NGEyZmMwZGEwNzRmMWVjZGM3N2IzMDlkYjViZWVlOGYyNTllZDMzZjgwZGMxZWZhOWFiMmEyYjg0NjgyYzgwYjk0Y2QxYWVmM2E1ZTFiZjkyYTNlOGYzMDg1MWVjNjUyODViYzMyZjc2Mjk2OGFmZmZjZTkwNjg3OWI4NjhjZjdiNzJmNTY3NTIyZjg2ODVjMzUzNTExYjhiMjkxZjEx; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm',
        'Referer': 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111110&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8F%B2%E5%8A%AA%E6%AF%94&oq=%E5%8F%B2%E5%8A%AA%E6%AF%94&rsp=-1',
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Mobile Safari/537.36 Edg/93.0.961.52'
    }
    html=requests.get(url,params=params,headers=headers)
    fin=re.compile(' "objURL":"(.*?)"', re.I|re.S)      #利用正则表达式进行文本匹配
    filter='ssl.duitang.com'
    results=fin.findall(html.text)

 3.网址获取(含解密)

这里最大的问题就是网址的筛选,我们会得到好多的url,如图(我汇总了一下)

 选用哪一个呢??我查看了很多博主的文然后发现大家都选择了objURL,说这个是原图(emm)

但是我们发现,这不是常规的网址,这是被加密的,所以,不要高兴太早,要解密...

解密代码如下(参考:百度图片爬虫解密万分感谢这位博主)

在选择objURL的基础上,我有筛选了一下图片都的原网页来源,我发现如果不过滤的话会有一些广告图片插进来,再加上我个人平常搜图会用堆糖,所以这里就设计了一下。

不想要过滤的,直接删掉filter和if条件判断

def  baidtu_uncomplie(url):                                 #因为要获取的是objURL所以这里找了一个百度解密
    res = ''
    c = ['_z2C$q', '_z&e3B', 'AzdH3F']
    d= {'w':'a', 'k':'b', 'v':'c', '1':'d', 'j':'e', 'u':'f', '2':'g', 'i':'h', 't':'i', '3':'j', 'h':'k', 's':'l', '4':'m', 'g':'n', '5':'o', 'r':'p', 'q':'q', '6':'r', 'f':'s', 'p':'t', '7':'u', 'e':'v', 'o':'w', '8':'1', 'd':'2', 'n':'3', '9':'4', 'c':'5', 'm':'6', '0':'7', 'b':'8', 'l':'9', 'a':'0', '_z2C$q':':', '_z&e3B':'.', 'AzdH3F':'/'}
    if(url==None or 'http' in url):
        return url
    else:
        j= url
        for m in c:
            j=j.replace(m,d[m])
        for char in j:
            if re.match('^[a-w\d]+$',char):
                char = d[char]
            res= res+char
        return res

4.将图片保存到本地

具体保存路径大家可以自行修改

    results=fin.findall(html.text)
    num=1
    for r in results:
        if filter in baidtu_uncomplie(r) and num <= int(values[1]):
            pic_url=baidtu_uncomplie(r)
            filename=f"C:\{values[0]}"
            if not os.path.exists(filename):        #创建文件夹来保存图片,文件夹路径大家可以自行修改哈
                os.mkdir(filename)
            with open(f"{filename}/{num}.jpg",'wb') as f:        #二进制文件的保存方法
                f.write(requests.get(pic_url).content)

            num+=1

sg.popup('已完成!图片文件夹已经放入C盘!') 

感谢所有看到这里的uu们!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值