2017-12-06 16 views
0

検索エンジンから自分のローカルディレクトリにイメージを保存するはずのこのコードを以下に示します。ただし、それは16進ファイルとして保存されます。私はコードを混乱させて幸運になることができますが、ここの誰かが私に最善の解決策を与えることを願っています。CSVのキーワードリストから検索エンジンの最初のイメージを解析するPythonスクリプト

メモ帳++で16進ファイルを開くと、16進ファイルの最初の行に "‰PNG"と表示されます。私は手動でファイルの拡張子を変更し、正しい画像が表示されます。

これはこのコードでの私の最初の問題です。私はちょうどそれのよりよい理解を得ることを試みている。

私はまた、スクリプトに応じてデフォルトの1であるイメージの数を解析して返すために、キーワードのリストを投げたいと思っていました。 Pythonに検索クエリの列を読み込ませ、検索クエリとして画像ファイルを保存することは可能ですか?それが簡単な場合は、mysqlのworkbenchを使用してデータベースを操作します。私はこのスクリプトを実行したいカラムを持っていますが、その代わりにファイル名をローカルディレクトリに保存しながら返します。

たとえば、私の最初の検索はプリンタトナー製品である「HP C9730A」でした。パーツ番号のリストをcsvまたはjson配列として送信し、使用されたキーワードとまったく同じように保存された解析済みイメージを返すことはできますか?

<b>else</b> 'jpg' 

前に述べたように、Googleは私の例を使用しての最初の画像はPNGファイルですので、ファイル名は「HP C9730A.jpg」

になり、私は、スクリプト内の節は述べて気づきました。私のファイルが保存されていないのはなぜですか?

いずれにせよ、お手伝いできますか?私はjpgまたはpngイメージを保存するだけでなく、csvまたはjson配列を使用して多数の異なるキーワードを使用して可能なバッチ処理で検索キーワードとして保存します。実際のJPGまたはPNGファイルとして画像を保存するよう

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() 

答えて

0

は、完全な行は次のようになります。この

"+"。 "+拡張子"

を追加するように見えます:

save_path = os.path.join( "" save_directory、FILE_NAME + +拡張)

スクリプトによって約束された実際の拡張子に画像を保存する問題が修正されました。

2回目の更新:

import sys 

このインポートは、すでに私が見つけたスクリプトに含まれていました。私は

sys.argv[2] 

を返すことができます。このサイトで見つけたので、Pythonスクリプトに渡されたコマンドライン引数の-TheリストですSYSによります。私はそうのような実際の検索語と一緒にUUIDを返すようにスクリプトにこれを含める:

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

しかし、今、parse-するクエリのリストを持つテーブル上のMySQLワークベンチを通じて、このスクリプトを実行するためとして、私は」どれくらい時間がかかっているかわからない。どんな助けもありがとう。このスクリプトは、検索エンジンから離れずに、大量のクエリのリストで実行したいと考えています。

関連する問題