目标检测-爬虫-利用百度识图的方法来批量的爬取图片生产数据集

13 篇文章 1 订阅
7 篇文章 37 订阅

在百度图识图爬取自己想要的数据集

1. 问题描述

最近在做一个关于垃圾的目标检测问题,在部署训练时需要大量的各种各样的垃圾数据集,那么我想到了网上搜索+拍照+爬虫的方式来获取数据集,而在我的上一篇博客 目标检测-用爬虫爬取百度图库获得自己想要的图片数据集-python代码,给出了利用百度图库关键字爬取图片的方法。但是经过测试,爬到的数据很多是不能用的,图像千奇百怪,每100张大概只有20张左右是有效的。于是想到了利用百度识图来搜取相关的数据集。

2.准备工作

因为用到了 selenium模块,所以需要用到webdriver,这里我的是谷歌浏览器,所以用的是chromedriver 模块。

2.1chromedriver配置

1).打开chrome 输入 “chrome://version/”来查看chrome版本 如图我的是83.0
在这里插入图片描述
2).访问此网站 谷歌浏览器驱动 然后选择合适版本的driver

比如找到我的83
在这里插入图片描述
点击进入找到对应的系统,比如我是在linux系统下就选择linux,如下
在这里插入图片描述

点击notes.txt就可查看其对应的版本号
如果符合就可以下载了,下载到自己指定位置然后就可以进行配置了。(这里后面会讲)

2.2项目构成

– -- --识图项目文件夹
|–seed_imgs
| --similar_search-result
|–baidu_image_search_demo.py
seed_imgs_dir中放一些收集所有想要用来搜索相似图片的原始图片
similar_search-result为空,为识图的存储结果

3.该工具代码

该工具百度网盘地址:[百度识图爬虫工具] ac13

为防止百度云失效,你只需按如上项目构成方式搭建项目即可。主要的py代码如下

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 15 20:24:25 2019

这是一个借助百度识图功能获取大量相似图片的示例程序

如果你不了解百度识图,不妨尝试使用下:
https://graph.baidu.com/pcpage/index?tpl_from=pc

本程序的大致思路如下:
seed_imgs中放置想要搜索相似图的原始图片
程序将会依次获取seed_imgs中的图片作为搜索种子,
借助爬虫来模拟使用百度识图的过程,达到自动化搜索大量相似图片的目的
搜索的结果将会保存在similar_search_result中

使用方法如下:
1.准备种子图片
收集所有想要用来搜索相似图片的原始图片,放置在seed_imgs中
2.使本地图片可以被url访问
将seed_imgs中的图片做成可供外界访问的url形式,你可以使用任何可能的方法
例如我的解决办法是将这些图片上传到github上,将github作为一个临时的图床使用
根据你制作的图床的url前缀,修改变量base_url
3.安装chromedriver
教程: https://www.jb51.net/article/162903.htm
查看谷歌浏览器版本命令: chrome://version/
下载链接(需选择对应版本) http://chromedriver.storage.googleapis.com/index.html
4.运行本程序,耐心等待

"""
import os
import cv2
import time
import requests
import numpy as np
from selenium import webdriver


# TODO: set parameters
# These two parameters needs to be modified according to your actual situation.
chrome_driver_path = '/home/cheng/Downloads/chromedriver'
base_url = 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3402176288,1135588067&fm=26&gp=0.jpg'

home_page = 'https://graph.baidu.com/pcpage/index?tpl_from=pc'
seed_imgs_dir = 'seed_imgs'
save_dir = 'similar_search_result'



def prepare_seed_imgs():
    seed_imgs_url_list = []
    save_dir_list = []
    for file_name in os.listdir(seed_imgs_dir):
        cur_url = base_url + file_name
        seed_imgs_url_list.append(cur_url)
        
        base_file_name = file_name[:-4]
        cur_save_dir = os.path.join(save_dir, base_file_name)
        if not os.path.exists(cur_save_dir):
            os.mkdir(cur_save_dir)
        save_dir_list.append(cur_save_dir)
    return seed_imgs_url_list, save_dir_list


def search_similar_images(browser, image_url, max_page):
    print("start find similar image of {}".format(image_url))
    
    search_failed = True
    try_num = 0
    while(search_failed):
        if try_num >= 3:
            break
        try:
            browser.get(home_page)
            
            # 拖拽图片到此处或粘贴图片网址
            url_upload_textbox = browser.find_element_by_css_selector('#app > div > div.page-banner > div.page-search > div > div > div.graph-search-left > input')
            url_upload_textbox.send_keys(image_url)
        
            # 识图一下
            search_image_button = browser.find_element_by_css_selector('#app > div > div.page-banner > div.page-search > div > div > div.graph-search-center')
            search_image_button.click()
        
            # 等待百度识图结果
            time.sleep(15)
        
            # 切换到当前窗口(好像可有可无)
            browser.current_window_handle
        
            # 测试是否成功
            graph_similar = browser.find_element_by_class_name('graph-similar-list')
            
            # 运行到这里说明模拟使用百度识图功能成功,页面已正常加载
            search_failed = False
        except Exception as e:
            #print("ERROR:" + traceback.format_exc())
            print("ERROR: error when request baidu image search.")
        finally:
            try_num += 1

    if search_failed:
        print("give up current image")
        return []

    # 动态加载max_page次页面
    download_page = 0
    print("dynamic loading web page...")
    while download_page < max_page:
        # 模拟向下滑动滚动条动态加载
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        # 等待滚动条10s
        time.sleep(10)
        download_page += 1

    # 解析页面中的所有url
    graph_similar = browser.find_element_by_class_name('graph-similar-list')
    left_column = graph_similar.find_element_by_css_selector('div > div:nth-child(1)')
    middle_column = graph_similar.find_element_by_css_selector('div > div:nth-child(2)')
    right_column = graph_similar.find_element_by_css_selector('div > div:nth-child(3)')

    left_column_imgs = left_column.find_elements_by_tag_name('a')
    middle_column_imgs = middle_column.find_elements_by_tag_name('a')
    right_column_imgs = right_column.find_elements_by_tag_name('a')
    
    url_list = []
    for img_box in left_column_imgs:
        img_url = img_box.find_element_by_tag_name('img').get_attribute('src')
        url_list.append(img_url)
    for img_box in middle_column_imgs:
        img_url = img_box.find_element_by_tag_name('img').get_attribute('src')
        url_list.append(img_url)
    for img_box in right_column_imgs:
        img_url = img_box.find_element_by_tag_name('img').get_attribute('src')
        url_list.append(img_url)
        
    total_imgs_num = len(left_column_imgs) + len(middle_column_imgs) + len(right_column_imgs)
    print("totally fing {} images.".format(total_imgs_num))
    return url_list


def download_search_images(url_list, cur_save_dir):
    print("start downloading...")
    for img_url in url_list:
        try:
            response = requests.get(img_url, timeout=1)
        except Exception as e:
            print("ERROR: download img timeout.")
        
        try:
            #imgDataNp = np.fromstring(response.content, dtype='uint8')
            imgDataNp = np.frombuffer(response.content, dtype='uint8')
            img = cv2.imdecode(imgDataNp, cv2.IMREAD_UNCHANGED) 
            
            img_name = img_url.split('/')[-1]
            save_path = os.path.join(cur_save_dir, img_name)
            cv2.imwrite(save_path, img)
        except Exception as e:
            print("ERROR: download img corruption.")



if __name__ == "__main__":
    browser = webdriver.Chrome(executable_path=chrome_driver_path)
    browser.set_page_load_timeout(30)

    seed_imgs_url_list, save_dir_list = prepare_seed_imgs()
    
    for idx, seed_url in enumerate(seed_imgs_url_list):
        print(idx)
        
        # 获取百度识图结果
        url_list = search_similar_images(browser, seed_url, max_page=30)
        
        if len(url_list) == 0:
            continue
        
        # 下载图片
        cur_save_dir = save_dir_list[idx]
        download_search_images(url_list, cur_save_dir)
        

打开后进入py文件有几个需要改的地方

chrome_driver_path = '/home/cheng/Downloads/chromedriver'
base_url = 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3402176288,1135588067&fm=26&gp=0.jpg'

home_page = 'https://graph.baidu.com/pcpage/index?tpl_from=pc'
seed_imgs_dir = 'seed_imgs'
save_dir = 'similar_search_result'

chrome_driver_path 改成之前我们下载的地址。
seed_imgs_dir中放一些收集所有想要用来搜索相似图片的原始图片
base_url将seed_imgs中的图片做成可供外界访问的url形式,你可以使用任何可能的方法,例如我的解决办法是将这些图片上传到csdn上,将csdn作为一个临时的图床使用,根据你制作的图床的url前缀,修改变量base_url。

4.耐心等待

本程序运行时间有一定的延迟,请耐心等待
在这里插入图片描述
我自己等了大概3分钟。。。反正只要出现 start 和 dynamic loading web page 一般就成功了 慢慢等就行
完成
在这里插入图片描述

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
好的,下面是一个简单的 Python 爬虫教程,可以批量爬取指定网站的图片: 首先,我们需要安装 requests 和 BeautifulSoup 这两个库。可以通过以下命令进行安装: ``` pip install requests pip install beautifulsoup4 ``` 接下来,我们需要编写代码。以下是一个示例代码,可以爬取指定网站的图片并保存到本地: ```python import requests from bs4 import BeautifulSoup import os # 爬取图片的网站 url = "https://www.example.com/" # 请求头,模拟浏览器访问 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(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 创建保存图片的文件夹 if not os.path.exists("images"): os.makedirs("images") # 遍历所有的图片标签,获取图片链接并保存到本地 for img in soup.find_all("img"): img_url = img.get("src") if img_url.startswith("http"): response = requests.get(img_url) with open("images/" + os.path.basename(img_url), "wb") as file: file.write(response.content) print("已保存图片:", img_url) ``` 在上述代码中,我们首先定义了要爬取的网站的 URL。然后,我们使用 requests 库发送一个 GET 请求,获取网页的 HTML 内容。接着,我们使用 BeautifulSoup 库对 HTML 进行解析,获取所有的图片标签。最后,我们使用 requests 库再次发送 GET 请求,获取图片的二进制数据,并保存到本地的 images 文件夹中。 注意,这里我们使用了一个 if 判断来过滤掉非 HTTP 开头的图片链接,以避免出现下载错误的情况。 为了更好的用户体验,代码中还加入了一些注释,方便大家理解。 希望这个简单的 Python 爬虫教程能对你有所帮助!
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值