python爬取图片

本文介绍了如何使用Python爬取网页图片,包括分析网页结构,获取每页图片URL,避免重复下载,以及解决图片格式问题。通过正则表达式提取图片链接,并按特定步长下载不同页面的图片。

一、网页分析:

我们爬取某网站图片时总是爬取不到所有的图片,只会爬取到一页的内容,这是为什么呢?

原因就是该网页提供的html页面使用了Ajax与javascript的交互实现,因此我们爬取时有困难。
在后几篇文章中会介绍,今天我们给出某网站爬取图片的网址:

https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=0&gsm=50&ct=&ic=0&lm=-1&width=0&height=0
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=20&gsm=3c&ct=&ic=0&lm=-1&width=0&height=0
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=40&gsm=50&ct=&ic=0&lm=-1&width=0&height=0

上面的url分别是第1页、第2页、第3页的,我们还是用老方法先得到这些url,
然后再获取每页的图片。

二、获取每页的url

我们的目的不是获取某一类的图片,而是获取我们想要的任何种类,任何数量的图片,所以我们可以对url进行拼接。通过输入想要的内容达到目的。

获取我们想要的种类图片:picture = input("图片类型为:\n")
获取每页的url:pn = 20*(i-1)
把上面的两个键值对存储在字典kw里,在我们发送get请求时传入即可。

正则表达式获取我们下载图片的内容:
“objURL”:“(.*?)”
在这里插入图片描述
符合该表达式的内容有61个,通过分析,第一个是没用的。

所以剩下的60个就是我们所需图片的内容,我们找到对应的链接,查看是否可以得到相应的图片内容,答案是肯定的。
但是我们又发现一个问题:第1、2、3;第4、5、6;……每三个objurl的链接获取到的内容一样(即步长为3),所以为了避免重复,我们只获取pn=0,pn=60,pn=120……这些链接的内容即可。

以上我们就获取到了所有我们想要每个图片的url。

import requests
import re
picture = input("图片类型为:\n")
headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
        }

"""
获取所有图片的url
"""
detail_urls = []
for i in range(1,5,3): #获取1-4页的图片,步长为3
    kw = {
            "word":picture,
            "pn":20*(i-1), #每页的url的规律
            }
    url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8'
    response = requests.get(url,headers=headers,params=kw)
    content = response.content.decode('utf8')
    detail_url = re.findall('"objURL":"(.*?)"',content,re.DOTALL)
    detail_urls.append(detail_url)

三、下载图片:

for page in detail_urls:
    for url in page:
        try:
            response = requests.get(url,headers=headers)
            content = response.content
            path = r'E:\Spyder\图片爬虫\图片' #图片保存位置
            with open(r'{}\{}.jpg'.format(path,i),'wb') as f:
                f.write(content)
        except:
            continue

四、图片格式的问题:

我们知道图片格式有很多种,我们获取的格式不一定只有jpg格式,但不影响大的情况的话,
我们一般都采用上面的方式。
***如果对获取到的图片保存原来的格式的话,
我们需要进行另一种处理方式,而不能使用上面的方式。***

方法:判断图片链接的后几位【后几位就为图片的格式】

i = 0
for detail_url in detail_urls:
    try:
        response = requests.get(detail_url,headers=headers)
        content = response.content
        if detail_url[-3:] == 'jpg':
            with open(r'E:\Spyder\图片爬虫\图片\{}.jpg'.format(i),'wb') as f:
                f.write(content)
        elif detail_url[-4:] == 'jpeg':
            with open(r'E:\Spyder\图片爬虫\图片\{}.jpeg'.format(i),'wb') as f:
                f.write(content)
        elif detail_url[-3:] == 'png':
            with open(r'E:\Spyder\图片爬虫\图片\{}.png'.format(i),'wb') as f:
                f.write(content)
        elif detail_url[-3:] == 'bmp':
            with open(r'E:\Spyder\图片爬虫\图片\{}.bmp'.format(i),'wb') as f:
                f.write(content)
        else:
            continue
    except:
        continue
    i+=1
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪宝儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值