Der icrawler der Python-Bibliothek ist nützlich zum Sammeln von Bilddaten für maschinelles Lernen. Im offiziellen Beispiel kann er wie unten gezeigt sehr einfach installiert und implementiert werden.
pip install icrawler
or
conda install -c hellock icrawler
from icrawler.builtin import GoogleImageCrawler
google_crawler = GoogleImageCrawler(storage={'root_dir': 'your_image_dir'})
google_crawler.crawl(keyword='cat', max_num=100)
Auf diese Weise erhalten Sie ein Bild in nur drei Zeilen.
Die folgenden zwei Punkte wurden hinzugefügt, um die Verwendung zu vereinfachen. ①. Ich möchte mehrere Suchwörter angeben (extern) ② Ich möchte keine doppelten Bilder
Beschreiben Sie für (1) das Suchwort zeilenweise in einer externen Textdatei und implementieren Sie es durch Lesen. In Bezug auf (2) wird die URL des Bildes im Dateinamen automatisch übersprungen, wenn dasselbe Bild gespeichert wird.
filesystem.py
class FileSystem(BaseStorage):
"""Use filesystem as storage backend.
The id is filename and data is stored as text files or binary files.
"""
def __init__(self, root_dir):
self.root_dir = root_dir
def write(self, id, data):
filepath = osp.join(self.root_dir, id)
folder = osp.dirname(filepath)
if not osp.isdir(folder):
try:
os.makedirs(folder)
except OSError:
pass
mode = 'w' if isinstance(data, six.string_types) else 'wb'
# with open(filepath, mode) as fout:
# fout.write(data)
try:
with open(filepath, mode) as fout:
fout.write(data)
except FileNotFoundError:
pass
Daher werde ich zuerst die unten stehende Implementierung veröffentlichen.
img_collection.py
import base64
from icrawler import ImageDownloader
from six.moves.urllib.parse import urlparse
from icrawler.builtin import BaiduImageCrawler
from icrawler.builtin import BingImageCrawler
from icrawler.builtin import GoogleImageCrawler
import argparse, os
parser = argparse.ArgumentParser(description='img_collection')
parser.add_argument('--output_dir', default="",type=str, help='')
parser.add_argument('--N', default=10, type=int, help='')
parser.add_argument('--engine', choices=['baidu',"bing","google"],default="bing",type=str, help='')
args = parser.parse_args()
class Base64NameDownloader(ImageDownloader):
def get_filename(self, task, default_ext):
url_path = urlparse(task['file_url'])[2]
if '.' in url_path:
extension = url_path.split('.')[-1]
if extension.lower() not in [
'jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif', 'ppm', 'pgm'
]:
extension = default_ext
else:
extension = default_ext
# works for python 3
filename = base64.b64encode(url_path.encode()).decode()
return '{}.{}'.format(filename, extension)
def get_crawler(args, dir_name):
if args.engine == "baidu":
crawler = BaiduImageCrawler(downloader_cls=Base64NameDownloader,storage={'root_dir': dir_name })
elif args.engine == "bing":
crawler = BingImageCrawler(downloader_cls=Base64NameDownloader,storage={'root_dir': dir_name })
elif args.engine == "google": # dont work
crawler = GoogleImageCrawler(storage={'root_dir': dir_name })
return crawler
if __name__=="__main__":
# read ini file.
with open('./setting.txt', mode='r', encoding = "utf_8") as f:
read_data = list(f)
print("SELECTED ENGINE : "+args.engine)
for i in range(len(read_data)):
print("SEARCH WORD : "+read_data[i].replace('\n', ''))
print("NUM IMAGES : "+str(args.N))
dir_name = os.path.join(args.output_dir, read_data[i].replace('\n', '').replace(' ', '_'))
#init crawler
crawler = get_crawler(args, dir_name)
crawler.crawl(keyword=read_data[i], max_num=args.N)
Erstellen Sie settings.txt in derselben Hierarchie wie img_collection.py. Hierin wird ein Suchwort beschrieben, und im folgenden Beispiel werden drei Arten von Suchwörtern angegeben, und es ist nicht erforderlich, jedes der drei Wörter auszuführen.
setting.txt
Katze
Katze erwachsen
Katzenkind
Geben Sie in settings.txt so viele Suchwörter ein, wie Sie möchten, und führen Sie Folgendes aus --N: Obergrenze der erfassten Bilder (Max1000. Tatsächlich können 1000 Bilder aufgrund von Kommunikation oder Vorhandensein / Fehlen von Seiten nicht erfasst werden.) --output_dir: Pfad des Ausgabeverzeichnisses ausgeben --engine: Suchmaschine. Wählen Sie aus Bing und Baidu. Google funktioniert jetzt nicht.
python img_collection.py --N 1000 --output_dir D:\hogehoge\WebCrawler\out --engine bing
Selbst wenn die Anzahl der erfassten Blätter mit 1000 angegeben ist, scheinen aufgrund von Kommunikationsfehlern tatsächlich etwa 600 übrig zu sein. Vorerst können Sie viele Bilder von Katzen bekommen. Das Verzeichnis wird für jedes Suchwort aufgeteilt. Wenn Sie die Bilder jedoch in einem Verzeichnis zusammenfassen, werden die doppelten Bilder grundsätzlich zusammengeführt, da die Dateinamen in Konflikt stehen.
Webcrawler haben heikle Rechte. Behandeln Sie sie daher entsprechend dem Verwendungszweck entsprechend.
Recommended Posts