検索エンジンから自分のローカルディレクトリにイメージを保存するはずのこのコードを以下に示します。ただし、それは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()