Python爬取百度图片(高清原图)

今日目标如题,爬取百度的图片,高清原图,而不是缩略图:https://image.baidu.com/

百度图片网站的坑比较多,可能大多数人一看网站发现是动态时就会立马去Network里面找数据了,然后发现里面存的都是缩略图,怎么办?进JS找,然后断点调试等等。。。 这是确实是个办法,但对于我们这种不懂JS的小白根本就不懂呀! 那还有没有其他办法呢? 当然是有的,今天我会分享其中一个稍微简单点的办法,加上我前两篇写的跟今天写的如果都学会的话,基本90%的图片都能顺利扒下来,剩下的10%就是那些需要登录和VIP了。

好,话不多说,直接开搞(上图):

在这里插入图片描述
不知道大伙有没有发现两张哪里不一样呢?

是的,网址不一样,第一张图片的网址一眼看不到边,第二张图片的网址则是比较正常的网址长度,但是呈现出来的内容确实一模一样的----由此便可以看出:第一张图片的网址加了很多不必要的东西,而这些东西对用户是没有影响的,是给爬虫增加爬取难度的。

既然看到不同了,那要怎么知道哪些是可以用的,哪些是不可以用的呢?

在这里插入图片描述
看图,框框里面的东西很明显是没有什么用的,既然没用就可以去掉,同理,可以一步一步去掉无用的,剩下的就是我们要找的真正的网址。

既然网址找到了,那么如何找到图片呢,我们打开网页源代码,发现都是JS代码,怎么搞?JS咱没玩过啊。
其实这也是百度搞的一个坑,我们需要的图片链接就在网页源代码里面,那么要如何找到我们需要的东西呢?很简单,看图片的格式,然后去网页源代码里面找就可以了
在这里插入图片描述
在这里插入图片描述
同一张图片,里面有蛮多size,选择你想要的就可以了,我选择的是原图

既然图片链接找到了,那就代表网站分析完毕,直接上代码就行了:

import re
import requests


url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&word=高清壁纸&pn=0'

headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3760.400 QQBrowser/10.5.4083.400',
}

res = requests.get(url,headers=headers).text
for img in re.findall('"objURL":"(.*?)",',res):
    print(img)
output:
http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1306/21/c1/22386490_1371808534385.jpg
http://b-ssl.duitang.com/uploads/item/201312/27/20131227233312_feEjH.jpeg
http://up.enterdesk.com/edpic/8c/d2/d9/8cd2d9421559855d153e872faf514137.jpg
http://01.minipic.eastday.com/20171011/20171011095832_49d23dd458b7446249d84fda3d4ea1c1_2.jpeg
http://up.enterdesk.com/edpic/f1/63/4d/f1634dc19bcaae62e769b3d9315cf194.jpg
http://a.hiphotos.baidu.com/zhidao/pic/item/e824b899a9014c08be3151a4087b02087bf4f4ad.jpg
http://up.enterdesk.com/edpic/2d/a3/18/2da318335152ebe82061e55afa883be5.jpg
http://up.enterdesk.com/edpic/58/bf/e9/58bfe913ea48cdb2b4174432cd103583.jpg
http://b.hiphotos.baidu.com/zhidao/pic/item/63d0f703918fa0ece9221cfe279759ee3c6ddb58.jpg
http://b.zol-img.com.cn/desk/bizhi/start/3/1379385428221.jpg
...

因为位置的特殊性,只好使用re正则表达式,轻松匹配到图片链接。

这里有个小问题,百度图片有很多格式的,jpg,jpeg,png等等,所以为了更加完善点,咱们使用os模块匹配图片后缀,全部代码:

import re
import requests
import os 


def get_url(word):
    url = f'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&word={word}&pn=0'
    # pn代表翻页,每30张图片为1页  0   30   60   90 ....
    headers = {
    
    
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3760.400 QQBrowser/10.5.4083.400',
    }

    res = requests.get(url,headers=headers).text
    for img in re.findall('"objURL":"(.*?)",',res):
        print(img)   

        image = requests.get(img,headers=headers)
        file_name = img.split("/")[-1]   #使用图片链接后缀作为图片名称
        with open("./images/"+str(file_name),"wb") as f:
            f.write(image.content)

if __name__ == "__main__":
    word = input("请输入您要采集的图片名称:")
    get_url(word)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

搞定!有啥不理解的可以在下方留言!大家伙一起交流交流!!

猜你喜欢

转载自blog.csdn.net/weixin_51211600/article/details/108991396