実現したいこと
・ポケモンの画像をスクレイピングにて取得したい
前提
初歩的な質問となってしまい、申し訳ありません。
現在pythonのスクレイピングを勉強しています。
google colabにてポケモンの画像データをスクレイピングで取得するというコードをネット記事を参考にしながら作成中です。
コードの作成中に以下のエラーメッセージが発生しました。
・作成したコード
python
1```python 2from bs4 import BeautifulSoup 3import urllib.error 4import urllib.request 5import time 6import re 7import os 8 9#画像の保存場所 10from pathlib import Path 11dst_path = Path('img') 12dst_path.mkdir(exist_ok=True) 13dst_path = Path('img/pokemon') 14dst_path.mkdir(exist_ok=True) 15download_dir = 'download/pokemon' 16 17#ユーザーエージェント設定(コピペOK) 18ua = 'Mozilla/5.0(Macintosh; Intel Mac Os X 10_12_3)' 19'AppleWebKit/537.3.(KHTML,Like Gecko)' 20'Chrome/55.0.2883.95 Safari/537.36' 21 22#画像のURLにアクセスして保存する関数 23def download_img(url,dst_path): 24 try: 25 data = urllib.request.urlopen(url).read() 26 with open(dst_path,mode='wb') as f: 27 f.write(data) 28 29 except urllib.error.URLError as e: 30 print("エラーが発生しました。") 31 print(e) 32 33#001~898までのリストを作成 34number_list = {'{:03}'.format(i) for i in range(1,898)} 35 36#欲しい情報があるURLの取得 37url_list = ['https://zukan.pokemon.co.jp/detail/{0}.htm'.format(number) for number in number_list] 38 39#繰り返し処理 40for url in url_list: 41 time.sleep(0.5) 42 43 #URLのHTMLから画像のURLを取得(Chrome上でCtrl + U した情報) 44 req = urllib.request.Request(url,headers = {'User-Agent':ua}) 45 html = urllib.request.urlopen(req) 46 soup = BeautifulSoup(html,"html.parser") 47 48 #画像のURLを取得 49 images = str(soup.find("meta",property="og:image")) 50 target = '"' 51 idx = images.find(target) 52 images = images[idx+1:] 53 box_end = images.index('"') 54 images_url = images[0:box_end] 55 56 #ナンバーを取得 57 number = str(soup.find("meta",property="og:url")) 58 59 #開始位置 60 target = '"' 61 idx = number.find(target) 62 number = number[idx+1:] 63 box_start = number.index('detail/') 64 65 #終了位置 66 box_end = number.index('.htm') 67 68 number = number[box_start+7:box_end-1] 69 70 #名前を取得 71 name = str(soup.find("meta",property="og:title")) 72 73 #開始位置 74 target = '"' 75 idx = name.find(target) 76 name = name[idx+1:] 77 78 #終了位置 79 box_end = name.index('|') 80 81 name = name[:box_end] 82 83 #保存ファイル名の設定 84 dst_path = os.path.join(download_dir + '/' + str(number) + '.png') 85 86 #画像保存 87 download_img(images_url,dst_path) 88 89 print(name + "!ゲットだぜっ!") 90 91print("処理が完了しました。")
### 発生している問題・エラーメッセージ --------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[12], line 63 60 box_start = number.index('detail/') 62 #終了位置 ---> 63 box_end = number.index('.htm') 65 number = number[box_start+7:box_end-1] 67 #名前を取得 ValueError: substring not found
試したこと
63 box_end = number.index('.html')の括弧内の文字を変えてみたりしましたが変化がありませんでした。
box_end = number.index('.html')
は、
box_end = number.index('.htm')
ではないでしょうか。

他所様のサーバーにアクセスする際は、頻度が適切になるようにしないと大きな迷惑をかけます。
大量にダウンロードする場合はまずはローカルで動くようにして、その後「適切な頻度調整が出来る実装にしてから」
やりましょう。
box_end = number.index('.htm')にしてみましたが、エラーコードの構文に変化はありませんでした。
アドバイスありがとうございます。
サーバに負荷をかけないように5つの画像分で処理ができるかを確認してから実行しようと思います。

いえ、ローカルで確認してください。絶対に迷惑かけないようにしてくださいね。
はい、ローカル環境で確認を行っていきます。
なるほど、
<meta property="og:url" content="https://zukan.pokemon.co.jp/detail/0001">
となっているので、box_end は不要だと思います。
#終了位置
##box_end = number.index('.htm') # 不要
number = number[box_start+7:]
ありがとうございます。
コードを修正していただいたおかげで処理自体は最後まで行われたのですが、フォルダ内に画像が保存されませんでした。
原因が分かりましたら教えていただけると幸いです。
何度もごめんなさい、ダブルクォート以降にも文字列がありますので、正しくは以下の様になります。
#終了位置
box_end = number.index(target)
number = number[box_start+7:box_end]
何度もありがとうございます。
上記の通りにコードを修正したところ、
box_end = number.index(target)の部分に
ValueError: substring not found
のエラーコードが表示されました。
number.index(target)をname.index(target)にしたりしましたが、改善されませんでした。
何度もお手数おかけしますが、解法が分かりましたら教えていただけると幸いです。
こちらで試すかぎり、画像ファイルが download/pokemon/ 以下に保存されます。(0001.png, 0002.png, ...)
コードを再度入力して試したところ正常に動作することが確認できました。
何度も質問に答えていただきありがとうございます。助かりました。

回答1件
あなたの回答
tips
プレビュー