1. ホーム
  2. python

[解決済み] python requests.get は常に 404 を返します。

2022-02-07 04:29:41

質問

リクエストの送信を試してみたいのですが、このようになります。 ウェブサイト :

requests.get('https://rent.591.com.tw')

で、いつも

<Response [404]>

これはよくある問題だと思い、別の方法を試してみましたが、やはりダメでした。 しかし、他のすべてのウェブサイトは大丈夫です。

何か提案はありますか?

解決方法は?

ウェブサーバーはブラックボックスです。彼らは、あなたのリクエスト、一日の時間、月の満ち欠け、あるいは彼らが選ぶ他の基準に基づいて、どんな有効なHTTPレスポンスでも返すことが許されているのです。もし他のHTTPクライアントが一貫して異なるレスポンスを返してきたら、Pythonが送るリクエストと他のクライアントが送るリクエストの間にどんな違いがあるのかを探ってみてください。

つまり、必要なのは

  • 作業依頼のすべての側面を記録する
  • 失敗したリクエストのすべての側面を記録する
  • 失敗したリクエストをより動作中のリクエストに近づけるために、どのような変更が可能かを試し、それらの変更を最小にします。

私は通常、リクエストに http://httpbin.org のエンドポイントを取得し、リクエストを記録し、そして実験する。

について requests のように、自動的に設定されるヘッダーがいくつかあり、これらの多くは通常、変更する必要がないと思われます。

  • Host ;これ 必須 を連絡先のホスト名に設定することで、異なるサイトを適切にマルチホストすることができます。 requests はこれを設定します。
  • Content-LengthContent-Type に渡す引数から設定されます。 requests . もしこれらが一致しない場合は、以下のように requests (ただし multipart/* リクエストで、これは Content-Type ).
  • requests : これはクライアントに管理を任せる
  • Connection これらは、最初のGETリクエスト時や、サイトに最初にログインした後に設定されることが多いようです。クッキーの取得には Cookies オブジェクト と、ログインしていること(ブラウザと同じ方法でクレデンシャルを提供)。

それ以外のものは公平に扱われますが、もし requests.Session() がデフォルト値を設定している場合、多くの場合、そのデフォルト値は問題ではありません。とはいえ、私は通常、User-Agentヘッダーから始めて、そこから上へ上へと作業を進めます。

この場合、サイトがユーザーエージェントでフィルタリングしているため、ブラックリスト化しているように見えます。 requests に設定し、それを ほとんどすべての値 はすでに動作しています。

Python

次に >>> requests.get('https://rent.591.com.tw', headers={'User-Agent': 'Custom'}) <Response [200]> ブラウザではない . requests は単なるHTTPクライアントであり、ブラウザはもっともっと多くのことを行います。ブラウザは HTML を解析して画像、フォント、スタイル、スクリプトなどの追加リソースを探し、それらの追加リソースもロードして、スクリプトを実行します。スクリプトは、ブラウザの表示内容を変更したり、追加のリソースを読み込んだりすることができます。もし requests の結果は、ブラウザで見るものと一致しませんが ブラウザが行う最初のリクエストは の場合、ブラウザが他にどんなリソースを読み込んでいるかを把握し、追加で requests 必要に応じて もし、すべてがうまくいかなければ、次のようなプロジェクトを使用します。 requests これを使えば、実際のヘッドレスブラウザである Chromium ブラウザで URL を実行することができます。

連絡しようとしているサイトは、追加のAJAXリクエストを requests-html このサイトからデータをスクレイピングしようとしている場合は、そのことを考慮してください。

次に、よくできたサイトでは、次のようなセキュリティのベストプラクティスが使用されています。 CSRFトークン これは、正しい順序でリクエストを行い (例えば、ハンドラへの POST の前にフォームを取得するための GET リクエスト)、クッキーを処理するか、サーバがあるリクエストから別のリクエストに渡されることを期待する余分な情報を抽出することを要求します。

最後になりますが、サイトがスクリプトのリクエストをブロックしている場合、おそらくスクレイピングを禁止する利用規約を実施しようとしているか、あるいはむしろあなたに使ってもらいたいAPIがあるためでしょう。いずれにせよ、そのサイトをスクレイピングし続ければ、より効果的にブロックされる可能性があることを考慮に入れて、チェックしてみてください。