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

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

如果你复制了此代码,能不能给我点个赞!
本代码非原创,网上搜集了一些资料,经过本人调整后能跑通!
感谢原作者的大部分功劳!由于我这也是n手资料,所以我也不知道原作者是谁。。。

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.该工具代码

该工具百度网盘地址:百度识图爬虫工具 密码: f2us

为防止百度云失效,你只需按如上项目构成方式搭建项目即可。主要的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 一般就成功了 慢慢等就行
完成
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ai_faker/article/details/107919205
今日推荐