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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1459閲覧

HTMLが取得できまない

fdd

総合スコア28

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/05 23:02

下記のサイトを参考にプログラムを作成。 主に動画を見て作業しました。
http://tomoprog.hatenablog.com/entry/2016/02/13/024004

ターミナルを用いて画像の取得を行おうとしています。しかしながら該当するURLをコピーペーストしても、HTMLが取得できませんでした。URLを確認してください。と表示されてしまします。
アドバイスお願いします。

python

1import os 2import sys 3import time 4import bs4 5import urllib.request 6 7def crawring(url, extensions): 8 """ 9 Content: 10 クローリング 11 Param: 12 url: クローリングするURL 13 extensions: 取得するリソースの拡張子(list) 14 """ 15 # 指定したURLのHTMLを取得 16 html = get_html_string(url) 17 if len(html) < 1: 18 print("HTMLが取得できませんでした。") 19 print("URLを確認してください。") 20 sys.exit(1) 21 22 # リソース取得 23 get_resource(html, extensions) 24 25def get_resource(html, extensions): 26 """ 27 Content: 28 リソース取得 29 Param 30 html: HTML 31 extensions 拡張子のリスト 32 """ 33 34 resource_list = [] 35 36 soup = bs4.BeautifulSoup(html) 37 for a_tag in soup.find_all("a"): 38 href_str = a_tag.get("href") 39 try: 40 (path, ext) = os.path.splitext(href_str) 41 if ext in extensions: 42 resource_list.append(href_str) 43 except: 44 pass 45 46 resource_list = sorted(set(resource_list), key=resource_list.index) 47 for resource in resource_list: 48 try: 49 print("download ---> [%s]" % os.path.basename(resource)) 50 request = urllib.request.urlopen(resource) 51 f = open(os.path.basename(resource), "wb") 52 f.write(request.read()) 53 except Exception as e: 54 print(e) 55 print("download failed ... [%s]" % os.path.basename(resource)) 56 finally: 57 time.sleep(3) 58 59def get_html_string(url): 60 """ 61 Content: 62 HTML取得 63 Param: 64 url HTMLを取得するURL 65 """ 66 decoded_html = "" 67 68 # HTMLを取得 69 try: 70 request = urllib.request.urlopen(url) 71 html = request.read() 72 except: 73 return decoded_html 74 75 # エンコードを取得 76 enc = check_encoding(html) 77 if enc == None: 78 return decoded_html 79 80 # HTMLをデコード 81 decoded_html = html.decode(enc) 82 83 return decoded_html 84 85def check_encoding(byte_string): 86 """ 87 Content: 88 文字コード確認 89 Param: 90 byte_string: バイト文字列 91 """ 92 encoding_list = ["utf-8", "utf_8", "euc_jp", 93 "euc_jis_2004", "euc_jisx0213", "shift_jis", 94 "shift_jis_2004","shift_jisx0213", "iso2022jp", 95 "iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_3", 96 "iso2022_jp_ext","latin_1", "ascii"] 97 98 for enc in encoding_list: 99 try: 100 byte_string.decode(enc) 101 break 102 except: 103 enc = None 104 105 return enc 106 107 108def check_args(): 109 """ 110 Content: 111 起動引数確認 112 """ 113 if len(sys.argv) == 3: 114 return True 115 else: 116 return False 117 118def print_usage(): 119 print("Usage: %s URL Extensions" % __file__) 120 print("URLにはクロールしたいウェブサイトのアドレスを指定してください。") 121 print("Extensionsにはクロールしたときに取得するファイルの拡張子を指定してください。") 122 print("Extensionsはカンマ区切りで複数指定できます。") 123 124def main(): 125 """ 126 Content: 127 main 128 """ 129 # 引数確認 130 if check_args() is False: 131 print_usage() 132 sys.exit(1) 133 134 url = sys.argv[1] 135 extensions = sys.argv[2].split(",") 136 137 # クロール開始 138 crawring(url, extensions) 139 140if __name__ == "__main__": 141 main()

補足情報
python3.6.6
mac OS Mojava

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

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

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

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

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

coco_bauer

2019/01/06 02:34

「該当するURLをコピーペースト」って、何をしているのですか? Pythonのプログラムが質問に書かれていますが、Pythonのプログラムと、URLをコピーペースト、の関係が判りません。「ターミナルを用いて画像の取得」というのも、どんな操作の事なのかが判りません。ターミナルでPythonのプログラムを実行しようとしているのですか???
can110

2019/01/06 02:36

具体的にプログラムの実行手順と与えた引数(URLと拡張子)を追記ください。
fdd

2019/01/06 03:53

URLは参考にしたサイトを指しています。pythonのプログラムはサイトに書いてあるweb_crawler.pyをさしています。web_crawler.pyにより、ターミナルから画像の取得ができると考え載せています。
fdd

2019/01/06 03:55

すみません。サイトのweb_crawler.pyをコピーペーストしただけなので実行手順は分かりません。
guest

回答2

0

作者です。

返信が遅くなりました。
2年以上前のプログラムが使われているようで嬉しいことです。

HTMLが取得できませんでした。URLを確認してください。
と表示されてしまいます。

上記のエラーが出た時にターミナルに入力したコマンドを教えていただけた方が解決が早そうです。

@firedfly さんから回答があったようですが、このプログラムは以下のように実行します。
python web_crawler.py "https://sample.com" .jpeg,.jpg
第1引数:集めたい画像が掲載されているページのURL
第2引数:集めたい画像の拡張子(カンマ区切りで複数指定できます)

プログラムでは以下の手順で画像を集めています。
0. 第1引数に指定したURLのhtmlを取得
0. htmlを解析し、aタグを集める
0. aタグのhref属性のURLに対してバイナリ形式でファイルに書き出す

上記の方法で画像ファイルを取得しているため、
aタグのhref属性に画像ファイルのURLが埋め込まれていないとうまく取得できません。

どのページにでも使えるというプログラムではなく、
ページによってはうまく取得できない場合もあるということです。

どこのサイトに対して画像を取得しようとしたのか教えていただければ、
このプログラムがこのまま使えるのか、改良が必要なのかもわかるかと思います。

また分からないことがあれば分かる範囲でお教えしますので、聞いてください。

よいプログラミングライフを!

投稿2019/01/26 06:36

TomoProg

総合スコア19

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

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

0

こんにちは。
ブログのコメントにしか書いてないですが、下の形式で実行します。

python web_crawler.py "任意のURL" .jpeg,.jpg

example

1python web_crawler.py "https://the-test-fun-for-friends.en.softonic.com/android?ex=BB-765.1" .jpeg,.jpg

以下、老婆心ながら忠告です。
下の認識です書きますので間違っていたら教えてください。

  • fddさんはプログラムを作成していない
  • 参考ブログのプログラムの実行手順がわからない

上の場合、ブログやGitHubで作成者に聞くのがいちばん良い、というのはわかりますか?
ソースコードをコピー&ペーストして「自分で作成したが、なぜか動かない」とここで質問すると
回答する側はいっしょうけんめいソースコードを解読して考えなければいけません。

以上です。

投稿2019/01/10 01:46

firedfly

総合スコア1131

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問