[PYTHON] Zusammenfassung des mit einer Geschwindigkeit von einer Sekunde durchgeführten Bildcrawls

Überblick

Ich denke, Kaggle ist ein großer Datensatz, aber manchmal haben Sie nicht das Bild, das Sie suchen.

Durch Ausführen des in diesem Artikel geschriebenen Codes Bild kriechen,

Sie können es einfach und schnell tun. Dies ist eine kurze Zusammenfassung von Kitas Artikel und dem Beispiel von icrawler.

Google Edition

https://qiita.com/Yuki-Takatsu/items/3f30727d5b21a83ea4ed Ich habe dies als Referenz verwendet (Kopieren und Einfügen).

scrape_google.py


import requests
import random
import shutil
import bs4
import ssl
import os.path
ssl._create_default_https_context = ssl._create_unverified_context

def image(keyword):
    Res = requests.get("https://www.google.com/search?hl=jp&q=" + keyword + "&btnG=Google+Search&tbs=0&safe=off&tbm=isch")
    Html = Res.text
    Soup = bs4.BeautifulSoup(Html,'lxml')
    links = Soup.find_all("img")
    link = random.choice(links).get("src")
    return link

def download_img(url, file_name, save_dir, img_num):
    try: 
        r = requests.get(url, stream=True)
        if r.status_code == 200:
                with open( os.path.join( save_dir, file_name, str(img_num)+".png " ) , 'wb') as f:
                    r.raw.decode_content = True
                    shutil.copyfileobj(r.raw, f)
    except:
        pass 



if __name__ == "__main__":
    num = 10
    keyword = "cat"
    save_dir = 'data'

    data_list = keyword.split(' ')
    data = keyword.lower()
    file_name_dir = '_'.join(data_list)
    file_name_dir = file_name_dir.lower() 

    if not os.path.exists(save_dir): 
        os.mkdir(save_dir) 
    if not os.path.exists( os.path.join( save_dir, file_name_dir ) ): 
        os.mkdir( os.path.join( save_dir, file_name_dir ) ) 


    for i in range(int(num)):
        try:
            print(f'{i} th attempt for crawl...')
            link = image(data)
            download_img(link, file_name_dir, save_dir, i)
        except:
            pass


Yahoo Edition

https://qiita.com/ishiwara51/items/3979fbc1c69b4f8ee2d3 Ich habe hier darauf verwiesen (komplett kopiert).

scrape_yahoo.py


import os
import sys
import traceback
from mimetypes import guess_extension
from time import time, sleep
from urllib.request import urlopen, Request
from urllib.parse import quote
from bs4 import BeautifulSoup

MY_EMAIL_ADDR = ''

class Fetcher:
    def __init__(self, ua=''):
        self.ua = ua

    def fetch_img_direct(self, url):
        """
Extrahiert die Byte-Informationen des Bildes, das auf dem Yahoo-Bildsuchbildschirm angezeigt wird.
Streit:
            url:Die URL des Yahoo-Bildsuchbildschirms.

Rückgabewert:
            img_b_content:Eine Liste der Bytecodes für Website-Ressourcen.
            mime: CONTENT_Die durch TYPE angegebene Erweiterung.
        """
        req = Request(url, headers={'User-Agent': self.ua})
        try:
            with urlopen(req, timeout=3) as p:
                page_b_content = p.read()
                structured_page = BeautifulSoup(page_b_content.decode('UTF-8'), 'html.parser')
                img_link_elems = structured_page.find_all('img')
                img_urls = [e.get('src') for e in img_link_elems if e.get('src').startswith('http')]
                img_urls = list(set(img_urls)) #Es ist nicht bekannt, warum es eingestellt ist
        except:
            sys.stderr.write('Error in fetching {}\n'.format(url))
            sys.stderr.write(traceback.format_exc())
            return None, None

        img_b_content = []
        mime = []
        for i, img_url in enumerate(img_urls):
            req1 = Request(img_url, headers={'User-Agent': self.ua})
            try:
                with urlopen(req1, timeout=3) as p:
                    img_b_content.append(p.read())
                    mime.append(p.getheader('Content-Type'))
            except:
                sys.stderr.write('Error in fetching {}\n'.format(img_url))
                sys.stderr.write(traceback.format_exc())
                continue

        return img_b_content, mime

fetcher = Fetcher(MY_EMAIL_ADDR)



def url_brancher(word):
    """
Rufen Sie die URL des Yahoo-Bildsuchbildschirms für die Anzahl der Kombinationen von Suchbedingungen ab.

Streit:
        word :Suchbegriff.

Rückgabewert:
        urllist :Eine Liste der URLs auf dem Yahoo-Bildsuchbildschirm.
    """
    constant = "https://search.yahoo.co.jp/image/search?p={}&n=60".format(quote(word))

    values = [\
    ["", "small"],\
    ["", "red"],\
    ["", "face"]\
    ]
    """
    values = [\
    ["", "small", "medium", "large", "wallpaper", "widewallpaper"],\
    ["", "red", "orange", "yellow", "green", "teal", "blue", "purple", "pink", "white", "gray", "black", "brown"],\
    ["", "face", "photo", "clipart", "lineart"]\
    ]
    """
    urllist = []

    for i in range(len(values[0])):
        for j in range(len(values[1])):
            for k in range(len(values[2])):
                urllist.append(constant + "&dim={}".format(values[0][i]) + "&imc={}".format(values[1][j]) + "&ctype={}".format(values[2][k]))
    return urllist



def main(word):
    """
Speichern Sie die Bilddatei basierend auf den von Fetch erhaltenen Informationen.

Streit:
    word:Suchbegriff.

Rückgabewert:
    """
    data_dir = 'data/'
    if not os.path.exists(data_dir):
        os.makedirs(data_dir)

    yahoo_url_list = url_brancher(word)

    for i, yahoo_url in enumerate(yahoo_url_list):
        sleep(0.1)
        img, mime = fetcher.fetch_img_direct(yahoo_url)
        if not mime or not img:
            print('Error in fetching {}\n'.format(yahoo_url))
            continue

        for j, img_url in enumerate(img):
            ext = guess_extension(mime[j].split(';')[0])
            if ext in ('.jpe', '.jpeg'):
                ext = '.jpg'
            if not ext:
                print('Error in fetching {}\n'.format(img_url))
                continue

            result_file = os.path.join(data_dir, str(i) + str(j)+ ext)
            with open(result_file, mode='wb') as f:
                f.write(img_url)
            print('fetched', str(i) + str(j) + ext)



if __name__ == '__main__':
    word = 'cat'
    main(word)

icrawler edition

icrawler Eine Bibliothek, mit der Sie Bilder mit Google, Bing, Baidu und Flickr crawlen können. Aber vielleicht können Sie jetzt nicht einfach auf Google kriechen? ?? Ich konnte jedoch problemlos mit Bing, Baidu und Flickr kriechen. Bitte beachten Sie, dass Sie nur den API-Schlüssel für Flickr benötigen (keine Sorge, Sie können dies in ca. 2 Minuten tun.)

scrape_icrawler.py



import logging
import os.path as osp
from argparse import ArgumentParser

from icrawler.builtin import (BaiduImageCrawler, BingImageCrawler,
                              FlickrImageCrawler, GoogleImageCrawler,
                              GreedyImageCrawler, UrlListCrawler)


key_word = 'cat'
max_num = 200

def test_google():
    print('start testing GoogleImageCrawler')
    google_crawler = GoogleImageCrawler(
        downloader_threads=4,
        storage={'root_dir': 'images/google'},
        log_level=logging.INFO)
    search_filters = dict()
        # size='large',
        # color='orange',
        # license='commercial,modify',
        # date=(None, (2017, 11, 30)))
    google_crawler.crawl(key_word, filters=search_filters, max_num=max_num)


def test_bing():
    print('start testing BingImageCrawler')
    bing_crawler = BingImageCrawler(
        downloader_threads=2,
        storage={'root_dir': 'images/bing'},
        log_level=logging.INFO)
    search_filters = dict()
        # type='photo',
        # license='commercial',
        # layout='wide',
        # size='large',
        # date='pastmonth')
    bing_crawler.crawl(key_word, max_num=max_num, filters=search_filters)


def test_baidu():
    print('start testing BaiduImageCrawler')
    # search_filters = dict(size='large', color='blue')
    search_filters = dict()
    baidu_crawler = BaiduImageCrawler(
        downloader_threads=4, storage={'root_dir': 'images/baidu'})
    baidu_crawler.crawl(key_word, filters=search_filters, max_num=max_num)


def test_flickr():
    print('start testing FlickrImageCrawler')
    flickr_crawler = FlickrImageCrawler(
        apikey=None,
        parser_threads=2,
        downloader_threads=4,
        storage={'root_dir': 'images/flickr'})
    flickr_crawler.crawl(
        max_num=max_num,
        tags=key_word,
        tag_mode='all',
        )


def test_greedy():
    print('start testing GreedyImageCrawler')
    greedy_crawler = GreedyImageCrawler(
        parser_threads=4, storage={'root_dir': 'images/greedy'})
    greedy_crawler.crawl(
        'http://www.bbc.com/news', max_num=max_num, min_size=(100, 100))


def test_urllist():
    print('start testing UrlListCrawler')
    urllist_crawler = UrlListCrawler(
        downloader_threads=3, storage={'root_dir': 'images/urllist'})
    filelist = osp.join(osp.dirname(__file__), 'filelist_demo.txt')
    urllist_crawler.crawl(filelist)


def main():
    parser = ArgumentParser(description='Test built-in crawlers')
    parser.add_argument(
        '--crawler',
        nargs='+',
        # default=['google', 'bing', 'baidu', 'flickr', 'greedy', 'urllist'],
        default=['google', 'bing', 'baidu', 'flickr'],
        help='which crawlers to test')
    args = parser.parse_args()
    for crawler in args.crawler:
        eval('test_{}()'.format(crawler))
        print('\n')


if __name__ == '__main__':
    main()

Zusammenfassung

Es wäre schön, wenn Sie Bilder schnell crawlen und sammeln könnten, wenn Sie keinen großen Datensatz haben. Ich denke, es gibt andere gute Möglichkeiten und Bildquellen, also hoffe ich, dass ich andere ausprobieren kann.

Recommended Posts

Zusammenfassung des mit einer Geschwindigkeit von einer Sekunde durchgeführten Bildcrawls
Sammle Katzenbilder in Sekundenschnelle und ziele auf den Stamm der Cat Hills
[GoLang] Setzen Sie am Anfang des Kommentars ein Leerzeichen
Werfen Sie einen Blick auf die Verarbeitung von LightGBM Tuner
Aufgaben zu Beginn eines neuen Python-Projekts
Was ist ein empfohlener Motor? Zusammenfassung der Typen
Holen Sie sich UNIXTIME zu Beginn des heutigen Tages mit einem Befehl
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Eine grobe Zusammenfassung der Unterschiede zwischen Windows und Linux
Konvertieren Sie die vorliegenden Bilddaten (png) in ein .pbm-Bild
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Eine kurze Zusammenfassung von Linux
Das Bild ist Namekuji
Goldnadel für den Fall, dass sie zu einem Stein wird, wenn man sich die Formel der Bildverarbeitung ansieht
Eine Methode zum Konvertieren des Bildstils unter Beibehaltung der Farbe
Werfen wir einen Blick auf die Feature-Map von YOLO v3
[Statistik] Erfassen Sie das Bild der zentralen Polbegrenzungstheorie mit einem Diagramm
Berücksichtigen Sie die Verarbeitungsgeschwindigkeit, um den Bildpuffer mit numpy.ndarray zu verschieben
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
Ein Befehl zum einfachen Überprüfen der Netzwerkgeschwindigkeit auf der Konsole
Eine kurze Zusammenfassung der Python-Sammlung
Eine grobe Zusammenfassung der Geschichte des Betriebssystems
Ich habe die Quantenbits (Anfänger) kurz zusammengefasst.
Zur Zeit derjenige, der mit Django im Handumdrehen eine Homepage erstellt und diese auf Heroku veröffentlicht (Windows-kompatibel)
Die Geschichte des Exportierens eines Programms
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
[Mac] Erstellen Sie mit Docker eine Python 3.x-Umgebung mit der schnellsten Geschwindigkeit
[Große Abfrage] Laden Sie einen Teil der BQ-Daten mit hoher Geschwindigkeit in Pandas
Holen Sie sich zu jeder Tageszeit eine Datums- / Uhrzeitinstanz in Python
28.02.2014 Zusammenfassung der in #ssmjp, Teil 1, vorgestellten Inhalte
Ein Memorandum über die Geschwindigkeit der Diagonalisierung beliebigen Grades
Messen Sie die Assoziationsstärke in einer Kreuztabelle
Ruf Hallo, Reiwa! Am Anfang von Reiwa!
[Python] [Meta] Ist der Python-Typ ein Typ?
Eine kurze Zusammenfassung der Pinax-Übersicht #djangoja
Die zweite Nacht der Runde mit für
Ein Memo, das die Achsenspezifikation der Achse erklärt
Python-Grundkurs (Ende 15)
Holen Sie sich den Dateinamen des Verzeichnisses (glob)
Die Geschichte der Verarbeitung A von Blackjack (Python)
Beachten Sie den Abschluss eines zeitaufwändigen Befehls
Zusammenfassung der häufig mit asyncpg ausgeführten Vorgänge
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Ich möchte dem Anfang einer WAV-Datei 1 Sekunde lang Stille hinzufügen
Die epidemische Vorhersage des neuen Koronavirus wurde mit explosiver Geschwindigkeit im Internet veröffentlicht
[AWS Lambda] Erstellen Sie ein Bereitstellungspaket mit dem Amazon Linux Docker-Image