爬虫,爬取百度图片,自定义关键字,数量,格式,大小

  合适麻烦多多关照i👍👍😊

爬虫爬取图片需要满足以下几个条件:

  1. 爬取目标网站允许爬虫访问:有些网站会设置反爬虫机制,如robots.txt文件,限制爬虫访问。在爬取图片之前,需要确保目标网站允许爬虫访问。可以通过查看robots.txt文件或者网站的使用协议来确定是否可以爬取。

  2. 爬虫代码:需要编写合适的爬虫代码来实现图片的爬取。爬虫代码通常使用Python等编程语言来实现,使用第三方库(如BeautifulSoup、Scrapy等)来解析网页、获取图片链接,并使用HTTP请求来下载图片。

  3. 图片链接提取:在爬虫代码中,需要通过解析网页的HTML结构,提取出图片的链接。这可以通过使用正则表达式、XPath、CSS选择器等方式来实现。

  4. 图片下载:获取到图片链接后,需要通过HTTP请求下载图片并保存到本地或者存储到数据库中。可以使用Python的requests库来发送HTTP请求,并使用PIL或者OpenCV等库来保存下载的图片。

  5. 存储与处理:爬取的图片可以保存在本地文件系统中,也可以存储在数据库中。如果需要对图片进行后续处理,如压缩、裁剪等,可以使用相应的图像处理库来实现。

需要注意的是,在进行图片爬取时,应遵守法律和道德规范,不要侵犯他人的版权和隐私。同时,也要注意爬取速度,避免对目标网站造成过大的负载压力。

这篇代码,需要注意的是,要在当然目录下先建一个保存照片的文件夹,当然,你也可以修改一下,让代码先判断是否存在该文件夹,不存在就先进行创建,这些就看你自己的想法拉

具体代码如下:

import requests
import os
import re
import io
from PIL import Image


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

    :param keyword: str,搜索关键词。
    :param num_images: int,要下载的图片数量。
    :param save_dir: str,图片保存的目录。
    :param image_format: str,图片格式,默认为 'jpg'。
    :param max_size: tuple,限制图片的最大尺寸,格式为 (width, height)。
    """
    # 设置请求头
    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
                # 打开图片并获取尺寸
                image = Image.open(io.BytesIO(image_data))
                width, height = image.size
                # 如果指定了最大尺寸并且图片尺寸超过了最大尺寸,则跳过该图片
                if max_size and (width > max_size[0] or height > max_size[1]):
                    continue
                # 保存图片
                with open(os.path.join(save_dir, f'{n:06d}.{image_format}'), '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('请输入要下载的图片数量:')
    image_format = input('请输入要下载的图片格式(默认为 jpg):') or 'jpg'
    max_width = input('请输入图片的最大宽度(默认为不限制):') or None
    max_height = input('请输入图片的最大高度(默认为不限制):') or None
    if max_width and max_height:
        max_size = (int(max_width), int(max_height))
    else:
        max_size = None
    num_images = int(num_images)
    # 构造保存图片的目录
    save_dir = os.path.join('.', 'images', keyword)
    # 调用函数进行图片下载
    get_images_from_baidu(keyword, num_images, save_dir, image_format, max_size)

运行结果就是这样

### 使用Python实现基于关键词的网页内容爬取 为了使用 Python 实现基于关键词的网页内容爬取,通常会采用如下方式构建程序逻辑: 定义目标网站和所需参数。对于百度搜索引擎而言,每一页大约展示十条新闻摘要[^1]。 创建 `crawl_latest_news` 函数用于封装整个爬取流程。此函数接收两个主要参数:一个是作为查询条件的关键字 (`keyword`);另一个是指定要获取的最大记录数目 (`num_news`)。该函数内部通过循环调用来模拟多页浏览行为,并逐步累积符合条件的结果列表直到满足数量需求或者遍历完毕所有可用页面为止。 ```python def crawl_latest_news(keyword, num_news): news_list = [] num_pages = num_news // 10 + (1 if num_news % 10 != 0 else 0) # 计算需要请求的页面数 for page in range(num_pages): html = search_baidu(keyword, page * 10) if html: page_news = parse_search_results(html) news_list.extend(page_news) if len(news_list) >= num_news: break else: print(f"无法获取第 {page+1} 页的搜索结果") return news_list[:num_news] ``` 其中涉及到几个辅助功能模块: - **search_baidu**: 负责向指定URL发送HTTP GET 请求并返回响应体中的HTML 文本字符串; - **parse_search_results**: 对于给定 HTML 片段解析提取有用信息片段如标题、链接地址等形成结构化对象加入最终输出队列中去。 值得注意的是,在实际开发过程中还需要考虑异常处理机制以及遵守robots协议等方面的要求以确保项目稳定性和合法性[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值