Python脚本,用于从CSV

时间:2017-12-06 23:38:21

标签: python json web-scraping beautifulsoup mysql-workbench

我在下面有这个代码,它应该从搜索引擎中保存我的本地目录中的图像。它确实如此,它将其保存为hex文件。我可以搞乱代码并获得幸运,但我希望这里有人能给我最好的解决方案。

如果我在记事本++中打开hex文件,我会注意到hex文件的第一行显示“‰PNG”。我手动更改了文件扩展名,并显示正确的图像。

这是我对此代码的第一个问题。我只是想更好地了解它。

我还想输入一个关键词列表来解析并返回任意数量的图像,默认值为1根据脚本。是否有可能告诉python读取一列搜索查询并将图像文件保存为搜索查询?如果它更容易,我使用mysql工作台来处理我的数据库。我有一个列,我想要执行此脚本,但可能会返回文件名,同时将其保存到本地目录。

例如,我的首次搜索是“HP C9730A”,它是一种打印机碳粉产品。如何发送部件号列表,可能是csv或json数组,并返回保存的解析图像,与所使用的关键字完全相同?所以文件名是“HP C9730A.jpg”

我注意到脚本中的子句声明:

<b>else</b> 'jpg'

使用我之前提到的示例在Google上的第一张图片是PNG文件。这就是为什么我的文件没有保存?

无论哪种方式,你能帮忙吗?我不仅要保存jpg或png图像,还要将它们保存为搜索关键字,并使用csv或json数组进行批量处理,并使用许多不同的关键字。

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

1 个答案:

答案 0 :(得分:0)

至于将图像保存为实际的jpg或png文件,看起来像添加此

  

&#34; +&#34;。&#34; +扩展&#34;

整行现在看起来像这样:

  

save_path = os.path.join(save_directory,file_name +&#34;。&#34; + extension)

解决了将脚本保存在实际扩展名中的问题。

第二次更新:

import sys

此导入已包含在我找到的脚本中。我通过这个网站发现我可以返回

sys.argv[2]

所以根据 sys ,它是 - 传递给Python脚本的命令行参数列表。我将其包含在脚本中,以便将uuid与实际搜索词一起返回,如下所示:

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

但是现在,至于通过mysql workbench在一个包含要解析的查询列表的表上运行这个脚本 - 我不确定需要花多长时间来解决这个问题。任何帮助,将不胜感激。我想在一大堆查询中运行这个脚本,而不会被踢出搜索引擎。