下記のサイトを参考にプログラムを作成。 主に動画を見て作業しました。
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