2017-12-06 2 views
0

Ich habe diesen Code unten, der ein Bild in meinem lokalen Verzeichnis von einer Suchmaschine speichern soll. Es tut, aber es speichert es als Hex-Datei. Ich kann mich mit dem Code herumschlagen und Glück haben, aber ich hoffe, dass jemand hier mir die beste Lösung geben kann.Python-Skript zum Analysieren des ersten Bildes der Suchmaschine aus der Liste der Schlüsselwörter in CSV

Wenn ich die Hex-Datei in Notepad ++ öffne, bemerke ich die erste Zeile der Hex-Datei sagt "‰ PNG". Ich habe die Dateierweiterung manuell geändert und das korrekte Bild wird angezeigt.

Das ist meine erste Ausgabe mit diesem Code. Ich versuche nur, es besser zu verstehen.

Ich wollte auch eine Liste von Schlüsselwörtern werfen zu parsen und zurückgeben, welche Anzahl von Bildern, Standard ist 1 nach dem Skript. Ist es möglich, python zu sagen, dass es eine Spalte mit Suchabfragen durchlesen und die Bilddateien als Suchabfrage speichern soll? Wenn es einfacher ist, verwende ich mysql workbench, um an meiner Datenbank zu arbeiten. Ich habe eine Spalte, in der ich dieses Skript ausführen möchte, aber möglicherweise den Dateinamen zurückgeben, während es in einem lokalen Verzeichnis gespeichert wird.

Zum Beispiel meine erste Suche war für "HP C9730A", die ein Drucker Toner Produkt ist. Wie kann ich eine Liste von Teilenummern senden, kann es ein CSV- oder JSON-Array sein und die analysierten Bilder genauso wie die verwendeten Schlüsselwörter zurückgeben? So bemerkte Dateiname wäre „HP C9730A.jpg“

ich die Klausel im Skript heißt es:

<b>else</b> 'jpg' 

Das erste Bild auf Google mein Beispiel mit wie bereits erwähnt ist eine PNG-Datei. Ist das der Grund, warum meine Datei nicht gespeichert wird?

Wie auch immer, können Sie helfen? Ich nicht nur JPG-oder PNG-Bilder zu speichern, sondern speichern Sie sie auch als Suchbegriffe mit möglichen Batch-Verarbeitung mit CSV oder JSON-Array mit vielen verschiedenen Keywords.

import argparse 
import json 
import itertools 
import logging 
import re 
import os 
import uuid 
import sys 
from urllib2 import urlopen, Request 

from bs4 import BeautifulSoup 


def configure_logging(): 
    logger = logging.getLogger() 
    logger.setLevel(logging.DEBUG) 
    handler = logging.StreamHandler() 
    handler.setFormatter(
     logging.Formatter('[%(asctime)s %(levelname)s %(module)s]: %(message)s')) 
    logger.addHandler(handler) 
    return logger 

logger = configure_logging() 

REQUEST_HEADER = { 
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"} 


def get_soup(url, header): 
    response = urlopen(Request(url, headers=header)) 
    return BeautifulSoup(response, 'html.parser') 

def get_query_url(query): 
    return "https://www.google.co.in/search?q=%s&source=lnms&tbm=isch" % query 

def extract_images_from_soup(soup): 
    image_elements = soup.find_all("div", {"class": "rg_meta"}) 
    metadata_dicts = (json.loads(e.text) for e in image_elements) 
    link_type_records = ((d["ou"], d["ity"]) for d in metadata_dicts) 
    return link_type_records 

def extract_images(query, num_images): 
    url = get_query_url(query) 
    logger.info("Souping") 
    soup = get_soup(url, REQUEST_HEADER) 
    logger.info("Extracting image urls") 
    link_type_records = extract_images_from_soup(soup) 
    return itertools.islice(link_type_records, num_images) 

def get_raw_image(url): 
    req = Request(url, headers=REQUEST_HEADER) 
    resp = urlopen(req) 
    return resp.read() 

def save_image(raw_image, image_type, save_directory): 
    extension = image_type if image_type else 'jpg' 
    file_name = uuid.uuid4().hex 
    save_path = os.path.join(save_directory, file_name) 
    with open(save_path, 'wb') as image_file: 
     image_file.write(raw_image) 

def download_images_to_dir(images, save_directory, num_images): 
    for i, (url, image_type) in enumerate(images): 
     try: 
      logger.info("Making request (%d/%d): %s", i, num_images, url) 
      raw_image = get_raw_image(url) 
      save_image(raw_image, image_type, save_directory) 
     except Exception as e: 
      logger.exception(e) 

def run(query, save_directory, num_images=100): 
    query = '+'.join(query.split()) 
    logger.info("Extracting image links") 
    images = extract_images(query, num_images) 
    logger.info("Downloading images") 
    download_images_to_dir(images, save_directory, num_images) 
    logger.info("Finished") 

def main(): 
    parser = argparse.ArgumentParser(description='Scrape Google images') 
    parser.add_argument('-s', '--search', default='bananas', type=str, help='search term') 
    parser.add_argument('-n', '--num_images', default=1, type=int, help='num images to save') 
    parser.add_argument('-d', '--directory', default='/Users/Images/', type=str, help='save directory') 
    args = parser.parse_args() 
    run(args.search, args.directory, args.num_images) 

if __name__ == '__main__': 
    main() 

Antwort

0

Wie für die Bilder als tatsächliche jpg oder png-Dateien zu speichern, sieht aus wie das Hinzufügen dieser

"+". "+ Erweiterung"

Die vollständige Reihe nun wie folgt aussieht :

save_path = os.path.join ("" save_directory, datei_name + + extension)

behebt das Problem beim Speichern des Bildes in der tatsächlichen Erweiterung wie vom Skript versprochen.

Zweite Update:

import sys 

dieser Import wurde bereits im Skript enthalten ich gefunden habe. Ich fand über diese Seite, die ich

sys.argv[2] 

So nach sys zurückkehren kann die -Das Liste der Befehlszeilenargumente zu einem Python-Skript übergeben.Ich schloss diese an das Skript die UUID neben den tatsächlichen Suchbegriffe zurückzukehren wie so:

file_name = uuid.uuid4().hex + "-" + sys.argv[2] 

Aber jetzt, wie auf einem Tisch dieses Skript durch MySQL Workbench ausgeführt wird, die eine Liste von Abfragen muss parse- I‘ Ich bin mir nicht sicher, wie lange es dauern wird, bis ich das herausgefunden habe. Jede Hilfe wäre willkommen. Ich möchte dieses Skript auf einer großen Liste von Abfragen ausführen, ohne von der Suchmaschine gekickt zu werden.

Verwandte Themen