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

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

ただいまの
回答率

87.34%

画像スクレイピングを行う際の、適切なアクセスの間隔とそのタイミング(コードのどの部分に入れたらよいか)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,834

score 12

疑問点

あるホームページで公開されている複数の画像を自動でダウンロードするコードを作成し、動作は問題ありません。

一方ネットや書籍を見ると、スクレイピング先に負担をかけないためにアクセスするごとにtime.sleep()を用いて何秒か間隔をあけることが必要とありました。
そこで、抽出したうちの1つのurlにアクセスして画像を保存し、次のurlにアクセスする前にtime.sleep(1)として間隔をあけるようにしました(下記ソースコードの最後)。
このタイミングは問題ないでしょうか。加えて、下記コード5行目のforループ中でlinks変数から.getを用いて画像urlを取得するタイミングでも入れたほうがよいでしょうか
(ホームページへのアクセスが発生するのはrequest.get()でhtmlを取得した時で、links.get("href")でresponse変数に代入したローカル?のhtmlデータからurlを取り出す時には発生しないと考えているので、入れる必要はないと考えています)。

また、本コードではtime.sleep()の間隔を1秒としていますが(ネットで見かけるコードではそうしていることが多かったため)、より適切な間隔があればご教示いただきたいです。

以上よろしくお願いします。

#対象のurlからHTMLを取得し、画像のurlを抽出、urlリストに格納
   response = requests.get("対象のurl")
   soup = BeautifulSoup(response.content,'lxml')
   links = soup.findAll('a',href=re.compile('〇〇〇'))

   for link in links:
      url = link.get('href')
      url_list += [url]
      #time.sleep(1)←このタイミングでもtime.sleep()を入れるべきでしょうか。

#抽出したurlにアクセスして画像を保存
   length = len(url_list)
   l_list = range(0,length)

   for r in l_list:
      nem = urllib.request.urlopen(url_list[r]).read()
      with open("#画像の保存先", "wb") as f:
         f.write(nem)
      time.sleep(1)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

(ホームページへのアクセスが発生するのはrequest.get()でhtmlを取得した時で、links.get("href")でresponse変数に代入したローカル?のhtmlデータからurlを取り出す時には発生しないと考えているので、入れる必要はないと考えています)。

その考え方で良いと思います。

ただし下のforの中でリクエストが飛ぶので、その間に一回は待つようにした方が良いでしょう(間に書くか、一番下のsleepをブロックの中の一番上に移すなど)。

また、本コードではtime.sleep()の間隔を1秒としていますが(ネットで見かけるコードではそうしていることが多かったため)、より適切な間隔があればご教示いただきたいです。

「お作法」なので決まった数字はありません。常識的な範囲で。


まず法律上の問題をクリアできるかと(けっきょくなんともいえないことも多いように思いますが)、スクレイピング行為自体が相手に嫌がられていないか(サービスによっては規約で禁止されていることもあるし、そうでなくても自動アクセスを弾くようなサイトもあるのでそういうときは遠慮するとか)が一番の関心事なので、その点は別途ご確認お願いします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/13 00:14

    ご回答いただきありがとうございます。スッキリしました。コードを書く以前の問題も忘れないようにしたいです。

    キャンセル

  • 2019/10/13 00:21

    もう一個ほぼ同内容の質問があるみたいですが、こちらでまとめて解決した扱いにするのであれば、
    ・自分の回答をBAにして自己解決にできるので、そうする
    ・回答を編集してこちらの質問宛にリンクを張る
    ようにお願いします。

    キャンセル

  • 2019/10/13 00:26

    ご指摘ありがとうございます。
    別質問はこちらのurlを貼り、自己解決としました。
    失礼しました。

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • Pythonに関する質問
  • 画像スクレイピングを行う際の、適切なアクセスの間隔とそのタイミング(コードのどの部分に入れたらよいか)