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

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

ただいまの
回答率

87.48%

Pythonのrequests.get()関数でアクセスできないサイトがあります.

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,522

score 1

前提・実現したいこと

Pythonのrequests.get()関数でWebページをダウンロードしたいのですが,
エラーになるわけでもなくアクセスできないサイトがあります.

具体的にはこちらの通販サイトから,
https://www.asos.com/fila/fila-mini-dress-with-drawstring-waist-and-logo-front/prd/13843263

以下にある商品価格を取得したいと思っております.
<span data-id="current-price" data-bind="text: priceText(), css: {'product-price-discounted' : isDiscountedPrice }, markAndMeasure: 'pdp:price_displayed'" class="current-price product-price-discounted">£36.00</span>

どのようにすればよいでしょうか?
また,requests以外で使えるモジュールはありますか?

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

timeoutを設定した時のみ以下のエラーが出ますが,それ以外の時はずっと実行中になってしまいます.

---------------------------------------------------------------------------
timeout                                   Traceback (most recent call last)
C:\Anaconda\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    383                     # otherwise it looks like a programming error was the cause.
--> 384                     six.raise_from(e, None)
    385         except (SocketTimeout, BaseSSLError, SocketError) as e:

C:\Anaconda\lib\site-packages\urllib3\packages\six.py in raise_from(value, from_value)

C:\Anaconda\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    379                 try:
--> 380                     httplib_response = conn.getresponse()
    381                 except Exception as e:

C:\Anaconda\lib\http\client.py in getresponse(self)
   1320             try:
-> 1321                 response.begin()
   1322             except ConnectionError:

C:\Anaconda\lib\http\client.py in begin(self)
    295         while True:
--> 296             version, status, reason = self._read_status()
    297             if status != CONTINUE:

C:\Anaconda\lib\http\client.py in _read_status(self)
    256     def _read_status(self):
--> 257         line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
    258         if len(line) > _MAXLINE:

C:\Anaconda\lib\socket.py in readinto(self, b)
    588             try:
--> 589                 return self._sock.recv_into(b)
    590             except timeout:

C:\Anaconda\lib\site-packages\urllib3\contrib\pyopenssl.py in recv_into(self, *args, **kwargs)
    308             else:
--> 309                 return self.recv_into(*args, **kwargs)
    310 

C:\Anaconda\lib\site-packages\urllib3\contrib\pyopenssl.py in recv_into(self, *args, **kwargs)
    306             if not util.wait_for_read(self.socket, self.socket.gettimeout()):
--> 307                 raise timeout('The read operation timed out')
    308             else:

timeout: The read operation timed out

During handling of the above exception, another exception occurred:

ReadTimeoutError                          Traceback (most recent call last)
C:\Anaconda\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    448                     retries=self.max_retries,
--> 449                     timeout=timeout
    450                 )

C:\Anaconda\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    637             retries = retries.increment(method, url, error=e, _pool=self,
--> 638                                         _stacktrace=sys.exc_info()[2])
    639             retries.sleep()

C:\Anaconda\lib\site-packages\urllib3\util\retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
    366             if read is False or not self._is_method_retryable(method):
--> 367                 raise six.reraise(type(error), error, _stacktrace)
    368             elif read is not None:

C:\Anaconda\lib\site-packages\urllib3\packages\six.py in reraise(tp, value, tb)
    685             raise value.with_traceback(tb)
--> 686         raise value
    687 

C:\Anaconda\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    599                                                   body=body, headers=headers,
--> 600                                                   chunked=chunked)
    601 

C:\Anaconda\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    385         except (SocketTimeout, BaseSSLError, SocketError) as e:
--> 386             self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
    387             raise

C:\Anaconda\lib\site-packages\urllib3\connectionpool.py in _raise_timeout(self, err, url, timeout_value)
    305         if isinstance(err, SocketTimeout):
--> 306             raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
    307 

ReadTimeoutError: HTTPSConnectionPool(host='www.asos.com', port=443): Read timed out. (read timeout=10)

During handling of the above exception, another exception occurred:

ReadTimeout                               Traceback (most recent call last)
<ipython-input-16-e3d95d8c78cb> in <module>
      1 url = 'https://www.asos.com/fila/fila-mini-dress-with-drawstring-waist-and-logo-front/prd/13843263'
----> 2 res = requests.get(url, timeout = 10)

C:\Anaconda\lib\site-packages\requests\api.py in get(url, params, **kwargs)
     73 
     74     kwargs.setdefault('allow_redirects', True)
---> 75     return request('get', url, params=params, **kwargs)
     76 
     77 

C:\Anaconda\lib\site-packages\requests\api.py in request(method, url, **kwargs)
     58     # cases, and look like a memory leak in others.
     59     with sessions.Session() as session:
---> 60         return session.request(method=method, url=url, **kwargs)
     61 
     62 

C:\Anaconda\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    531         }
    532         send_kwargs.update(settings)
--> 533         resp = self.send(prep, **send_kwargs)
    534 
    535         return resp

C:\Anaconda\lib\site-packages\requests\sessions.py in send(self, request, **kwargs)
    644 
    645         # Send the request
--> 646         r = adapter.send(request, **kwargs)
    647 
    648         # Total elapsed time of the request (approximately)

C:\Anaconda\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    527                 raise SSLError(e, request=request)
    528             elif isinstance(e, ReadTimeoutError):
--> 529                 raise ReadTimeout(e, request=request)
    530             else:
    531                 raise

ReadTimeout: HTTPSConnectionPool(host='www.asos.com', port=443): Read timed out. (read timeout=10)

該当のソースコード

url = 'https://www.asos.com/fila/fila-mini-dress-with-drawstring-waist-and-logo-front/prd/13843263'
res = requests.get(url, timeout = 10)

試したこと

申し訳ないのですが,初心者で試行錯誤の余地がないため,これといって試すことのできたものはありません.
urllib.requests()も同様に使えませんでした.

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

Python 3, chromeでJupyterLabを用いています.
同じウィンドウ上の別のタブでは当該URLを開くことは可能でした.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • javahack

    2020/06/09 08:17

    スクレイピング対策しているということは、規約で禁止している可能性があります。(軽く探してみましたが規約は見つけられませんでした。)
    規約で禁止している行為を繰り返した場合、最悪訴えられることもありますので、注意してください。

    キャンセル

  • kuuuuu

    2020/06/09 13:10

    ご指摘ありがとうございます.規約をよく読んでからまた考え直すことにいたします.

    キャンセル

回答 2

checkベストアンサー

+1

とりあえずはこのサイトはスクレイピング対策されているみたいで、requestでそのまま取得しようとすると応答しない仕様になっているみたいですので、ユーザーエージェントの偽装が必要でした。

ユーザーエージェントを偽装することでアクセスはできたのですが、中のHTMLも結構複雑で、私も初心者のため、価格をうまく取得することはできませんでしたので、サンプルコードは提示てきません、申し訳ないです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/06/09 03:51

    なるほど,ユーザーエージェントという概念を初めて知りました.
    おかげで私もアクセス出来るようになったのですが,F12で表示されるテキストと,requests.get()で取得したテキストがなぜか部分的に異なるようですね...ほしい部分の属性が分かるといいのですが...

    キャンセル

0

ユーザーエージェントの変更によってアクセス自体は可能.

ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 safari/537.36'
headers = {'User-Agent': ua}
url = 'https://www.asos.com/fila/fila-mini-dress-with-drawstring-waist-and-logo-front/prd/13843263'
res = requests.get(url, headers=headers, timeout = 10)
res.raise_for_status()

しかし,ダウンロードしたHTMLテキストと,ホームページ上で「右クリック→検証」で表示されるテキストがなぜか異なるため,欲しい情報をbs4で取得することはできなかった.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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