質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

355閲覧

画像のスクレイピングについて

taka-ken

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/04 07:12

前提・実現したいこと

Webから画像をスクレイピングしたいと思っております。

一通りできているコードを実装したところ、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

usage: google.py [-h] -t TARGET -n NUMBER [-d DIRECTORY] [-f FORCE] google.py: error: the following arguments are required: -t/--target, -n/--number

該当のソースコード

import argparse import json import os import urllib from bs4 import BeautifulSoup import requests class Google(object): def __init__(self): self.GOOGLE_SEARCH_URL = "https://www.google.co.jp/search" self.session = requests.session() self.session.headers.update( { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) \ Gecko/20100101 Firefox/10.0" } ) def search(self, keyword, maximum): print(f"Begining searching {keyword}") query = self.query_gen(keyword) return self.image_search(query, maximum) def query_gen(self, keyword): # search query generator page = 0 while True: params = urllib.parse.urlencode( {"q": keyword, "tbm": "isch", "ijn": str(page)} ) yield self.GOOGLE_SEARCH_URL + "?" + params page += 1 def image_search(self, query_gen, maximum): results = [] total = 0 while True: # search html = self.session.get(next(query_gen)).text soup = BeautifulSoup(html, "lxml") elements = soup.select(".rg_meta.notranslate") jsons = [json.loads(e.get_text()) for e in elements] image_url_list = [js["ou"] for js in jsons] # add search results if not len(image_url_list): print("-> No more images") break elif len(image_url_list) > maximum - total: results += image_url_list[: maximum - total] break else: results += image_url_list total += len(image_url_list) print("-> Found", str(len(results)), "images") return results def main(): parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS) parser.add_argument("-t", "--target", help="target name", type=str, required=True) parser.add_argument( "-n", "--number", help="number of images", type=int, required=True ) parser.add_argument( "-d", "--directory", help="download location", type=str, default="./data" ) parser.add_argument( "-f", "--force", help="download overwrite existing file", type=bool, default=False, ) args = parser.parse_args() data_dir = args.directory target_name = args.target os.makedirs(data_dir, exist_ok=True) os.makedirs(os.path.join(data_dir, target_name), exist_ok=args.force) google = Google() # search images results = google.search(target_name, maximum=args.number) # download download_errors = [] for i, url in enumerate(results): print("-> Downloading image", str(i + 1).zfill(4), end=" ") try: urllib.request.urlretrieve( url, os.path.join(*[data_dir, target_name, str(i + 1).zfill(4) + ".jpg"]), ) print("successful") except BaseException: print("failed") download_errors.append(i + 1) continue print("-" * 50) print("Complete downloaded") print("├─ Successful downloaded", len(results) - len(download_errors), "images") print("└─ Failed to download", len(download_errors), "images", *download_errors) if __name__ == "__main__": main()

試したこと

自分でサイトで調べて見たのですが、よい解決法が見つかりませんでした。

補足情報(FW/ツールのバージョンなど)

python初心者でして、今回teratailに投稿させていただきました。申し訳ございませんがよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/04 07:36

実行時に引数が必要というエラーに見えます。 コードの内容理解しながら書いていますか?
taka-ken

2019/08/04 08:51

requestsモジュールやbeautifulsoupモジュールでHTMLファイルの取得やデータの読み込みを行っている等、ある程度順を追って理解しているつもりではありますが、理解するのが精一杯の状況であります。
meg_

2019/08/04 09:43

1.エラーメッセージは上記で全てですか? 2.このプログラムを実行したときの方法(入力した文字列)を教えてください。(コマンドラインから? IDEから? その他?)
taka-ken

2019/08/04 09:52

1.お示ししたエラーが全てでございます 2.これはシェルスクリプト(google.py)として保存し、コマンドライン上でそのファイルがある階層まで移動し「python google.py」と打ち、実行致しました。すると上記のようなエラーが発生した次第です。
guest

回答2

0

コマンドライン引数が足りないからでしょう。

parser.add_argument で「required=True」となっているのに、引数がないためエラーが出ています。
「-d」オプションはデフォルト値があるのでエラーとなっていません。

※コマンドライン引数をチェックする処理を追加した方が良いでしょう

投稿2019/08/04 10:00

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka-ken

2019/08/04 11:59

教えていただいたように以下のように、コマンドライン引数を付け足しました。(日本人の画像を50枚) python google.py nihonzin 50 しかし、まったく同じエラーが出てしまいました。コマンドライン引数の書き方がいけないのでしょうか。調べたところどれもこの様な表記の仕方でした。
meg_

2019/08/04 12:41

引数は「-t TARGET -n NUMBER」のようにオプション指定をしてください。 parser.add_argumentのところでそのように設定されているからです。
taka-ken

2019/08/04 22:47

オプション指定したところ正常に実行されました! 大変ありがとうございました。
guest

0

ベストアンサー

python google.py -t nihonzin -n 50
では どうですか?

投稿2019/08/04 22:32

Reach

総合スコア733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka-ken

2019/08/04 22:44

おっしゃっていただいた方法で実行したところ、正常に画像のダウンロードができました! 大変ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問