欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python 百度图片爬取

程序员文章站 2022-06-10 19:24:52
...

Python 百度图片爬取

还在为图片不够,一张张点下载发愁吗,这次我们图片一次爬到够!

这次的代码还是很常规的,只是链接的获取要有些技巧,直接代码解说。

"""这次从逻辑上层到逻辑底层讲解"""
if __name__=='__main__':
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
    Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362',
        'Referer':'https://www.baidu.com/?tn=18029102_3_dg'
        }#设置必不可少的请求头
    name=input('请输入你要爬取图片的相关名:')
    num=int(input('请输入你要爬取的页数:'))
    print('爬取图片中……')
    pictureSpider(name,num)#爬虫入口,等会你就知道为啥要传这两个参数了
    print('程序执行完毕')
"""有必要说的就是程序可以美观但是人机交互还是要有的,这是个好习惯,没有提示的话那连作为作者的我们也会抓瞎,不知道错从何来"""      

这次导入的模块只有 requests 和 json。这里就讲一下抓包时的小技巧吧,也可以说是习惯吧。总所周知,数据的传送一般都是靠数据包这种的存在,不可能什么东西都能在网站的源代码中获得,json就是一种数据的传输方式,这次的爬取中就直接避开了网站源码的分析,变成了json数据处理的训练。

"""代码很精简,也就表明,这里面调用的函数代码会比较长"""
def pictureSpider(name,num):
    pic_urls=get_detail_url(name,num) #这是用来获取百度图片的json数据包内容
    print('图片下载中……')
    for url in pic_urls:#逐一下载返回的图片链接内容
        downloads(url)

看看如何实现 get_detail_url 和 downloads 这两个函数吧

"""我们先从短的开始吧,都是些常规操作,要是你不熟悉的话可以把这个作为模板"""
def downloads(url):
    name=url.split('/')[-1]#截取图片链接最后的字段作为图片名
    response =requests.get(url,headers=headers)
    #最好想清楚图片要存在哪里,自行修改
    with open('E:/Photo/{}'.format(name),'wb')as f:
        f.write(response.content)
    print(url+'下载成功')

准备好接受轰炸了吗

def get_detail_url(name,num):
    pic_urls=[] #用于存储图片链接
    for i in range(num):#输入的数字最好别太大,说不定已经被你爬完了,我的建议是30以内,计算是这样也已经有近千张图片了,你可以自己算算每个json有多少张图片
        index=i*30 #只是个索引,要分析比较网站才能知道,所以爬虫重在实战
        #由于此处会报错,故跳过
        if index==180:#这里是我在爬取idol时遇到的问题,你也可以自己做出调整
            continue
        url='http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&is=&fp=result&word={}&pn={}&rn=30'.format(name,index)
  
        try:
            response=requests.get(url,headers=headers)
            #过滤无效网址
            if len(response.text)>5000: #为了判断是不是我们需要的json网址
                data=json.loads(response.text,strict=False) #strict的意思大家可以自己查查,关于json的操作还是挺重要的
                thumb_urls=[]
                for i in range(30): #你猜到了吧,每个json差不多是30张图片链接
"""json的网站分析的时候可以用到谷歌浏览器的插件,可以方便很多哦,就是JSON Viewer,不知道的小伙伴请自行百度"""                
                    thumb_url=data['data'][i]['thumbURL']
                    thumb_urls.append(thumb_url)
                pic_urls.extend(thumb_urls)
                print(url+'访问成功')
            else:
                continue
        except:
            continue
    print('图片数据爬取完毕')
    return pic_urls

其实写这篇文章前我代码还是定向爬取我自己idol的写真,可是呢之前发现还可以做到普适化,根据输入获取响应图片,就有了这篇文章。

开始的 url 是这样的:
http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj
&ct=201326592&is=&fp=result&queryWord=%E8%A5%BF%E9%87%8E%E4%B8%83%E6%BF%91&cl=2&lm=-1&ie=utf-8&oe=utf8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E8%A5%BF%E9%87%8E%E4%B8%83%E6%BF%91&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn={}&rn=30

看上去是不是没有上面的那么美观,上面展示的是我缩减后的网址。
网址有时候并不是全部都是关键信息,我们可以人为对网址进行精简。

熟悉编码的小伙伴就知道这些%什么的这些字符串就是一些中文的字符,只是换了个编码方式,比如:
“胡歌”编码后就是 %E8%83%A1%E6%AD%8C

http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&is=&fp=result&word={}&pn={}&rn=30
这个网址里面最有用的就是word这个关键词了吧,这就是你要搜索的图片名。

要是问怎么精简网址,当然是自己删一部分试罗,这种方式是比较快的,貌似也有些网址提供这种服务吧。
哈哈哈,这也印证那句“三分天注定,七分靠打拼”,努力固然重要,有时候还是要有些运气的。大家慢慢体会吧。
最后附上一张成果图吧!
喜欢就点个赞,关注一下吧!
Python 百度图片爬取