爬虫,爬取百度图库指定的照片数量,并下载

搜索图片但是没有办法下载,或者说下载的格式不是自己想要的,又或者说下载的清晰度被吞了,那就用爬虫吧,爬虫可以为你解决这些问题,另外用爬虫爬取也是有缺点的,因为下载的图片就像开盲盒,你不知道下载的是什么样的照片

爬取百度图片需要遵循一些基本的步骤,以下是一个简单的爬虫框架例子,用于爬取百度图片:

  1. 确定目标网页:首先,你需要确定你要爬取的目标网页。对于百度图片,你可以尝试爬取其搜索结果页面。
  2. 分析网页结构:使用浏览器的开发者工具(如Chrome的开发者工具)来查看网页的HTML结构,了解图片的URL是如何嵌入到网页中的。
  3. 编写爬虫代码:使用Python的爬虫库(如requests和BeautifulSoup)来编写代码,从目标网页中提取图片URL。

以下是一个示例代码框架,你可以根据实际情况进行修改和扩展:

import requests  
from bs4 import BeautifulSoup  
  
def fetch_baidu_image_urls(keyword, page_num=1, num_images=10):  
    # 构造请求URL  
    base_url = 'https://image.baidu.com/search/acjson'  
    params = {  
        'word': keyword,  
        'pn': page_num,  # 页码从1开始  
        'rn': num_images  # 每页图片数量  
    }  
    headers = {  
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'  
    }  
    response = requests.get(base_url, headers=headers, params=params)  
    response.encoding = 'utf-8'  # 设置编码为utf-8,以正确解析返回的HTML内容  
    if response.status_code == 200:  # 检查请求是否成功  
        soup = BeautifulSoup(response.text, 'html.parser')  # 使用BeautifulSoup解析HTML内容  
        # 提取图片URL  
        img_tags = soup.find_all('img')  # 查找所有img标签  
        image_urls = []  
        for img in img_tags:  
            if 'src' in img.attrs:  # 检查img标签是否有src属性(即图片URL)  
                image_urls.append(img['src'])  # 将图片URL添加到列表中  
        return image_urls  # 返回提取到的图片URL列表  
    else:  
        print(f'请求失败,状态码:{response.status_code}')  
        return None  # 请求失败时返回None  
  
if __name__ == '__main__':  
    keyword = 'cat'  # 搜索关键词,例如“猫”  
    page_num = 1  # 起始页码,可以根据需要修改  
    num_images = 10  # 要下载的图片数量,可以根据需要修改  
    image_urls = fetch_baidu_image_urls(keyword, page_num, num_images)  
    if image_urls:  
        print(f'提取到的图片URL数量:{len(image_urls)}')  # 输出提取到的图片URL数量  
        for url in image_urls:  
            print(url)  # 输出单个图片URL  
    else:  
        print('无法提取到图片URL')

请注意,爬取百度图片可能需要处理一些反爬策略,例如动态加载、JavaScript渲染等。此外,根据法律法规和网站的使用条款,确保你的爬虫行为是合法和合规的。

当然例子只是例子,真正写的时候需要做出一些改变的,下面是我个人写的一个例子

import requests
import os
import re
# 指定关键词和要下载的图片数量

def get_images_from_baidu(keyword, num_images, save_dir):
    """
    从百度图片下载指定关键词的图片,并保存到指定目录中。

    :param keyword: str,搜索关键词。
    :param num_images: int,要下载的图片数量。
    :param save_dir: str,图片保存的目录。
    """
    # 设置请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    # 设置请求的 URL
    url = 'https://image.baidu.com/search/acjson?'
    # 初始化计数器
    n = 0
    # 每页显示的图片数量
    rn = 30
    # 计算需要请求的页数
    page_num = (num_images + rn - 1) // rn
    # 循环遍历每一页,获取图片链接并下载保存
    for pn in range(0, rn * page_num, rn):
        # 请求参数
        params = {
            'tn': 'resultjson_com',
            'logid': '7603311155072595725',
            'ipn': 'rj',
            'ct': 201326592,
            'is': '',
            'fp': 'result',
            'queryWord': keyword,
            'cl': 2,
            'lm': -1,
            'ie': 'utf-8',
            'oe': 'utf-8',
            'adpicid': '',
            'st': -1,
            'z': '',
            'ic': '',
            'hd': '',
            'latest': '',
            'copyright': '',
            'word': keyword,
            's': '',
            'se': '',
            'tab': '',
            'width': '',
            'height': '',
            'face': 0,
            'istype': 2,
            'qc': '',
            'nc': '1',
            'fr': '',
            'expermode': '',
            'force': '',
            'cg': '',
            'pn': pn,
            'rn': rn,
            'gsm': '1e',
            '1618827096642': ''
        }
        # 发送请求
        response = requests.get(url=url, headers=headers, params=params)
        # 检查响应是否成功
        if response.ok:
            print('Request success.')
        # 解析响应数据并提取图片链接
        response.encoding = 'utf-8'
        html = response.text
        image_url_list = re.findall('"thumbURL":"(.*?)",', html, re.S)
        # 如果指定的目录不存在,则创建目录
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        # 下载并保存图片
        for image_url in image_url_list:
            if n >= num_images:
                break
            try:
                image_data = requests.get(url=image_url, headers=headers).content
                with open(os.path.join(save_dir, f'{n:06d}.jpg'), 'wb') as fp:
                    fp.write(image_data)
                n += 1
            except (requests.RequestException, IOError) as e:
                print(f'Error occurred when downloading image: {e}')
    print(f'Successfully downloaded {n} images to {save_dir} directory.')


if __name__ == "__main__":
    # 从终端获取用户输入的关键词和要下载的图片数量
    keyword = input('请输入要搜索的图片关键词:')
    num_images = input('请输入要下载的图片数量:')
    num_images = int(num_images)
    # 构造保存图片的目录
    save_dir = os.path.join('.', 'images', keyword)
    # 调用函数进行图片下载
    get_images_from_baidu(keyword, num_images, save_dir)

最后运行的结果是这样的

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值