Python3クローラーは、非同期要求データを取得する問題を解決します

目次

 

問題の説明

ソリューション

オプション1

オプションII


問題の説明

データ詳細ページをクロールする場合、コメント数(コメント数)をクロールする必要がありますが、コメント数と詳細ページのデータは同期して要求されません。データは後で詳細ページに読み込まれます。urllib.request.openurlを使用する場合ページを直接フェッチすると、ページをフェッチしたときに、ページにコメントの数が入力されていないため、コメントデータを取得できません。

ソリューション

オプション1

コメントの数は、詳細ページのデータがページに読み込まれた後なので、一定時間待ってから、コメントデータも読み込まれてページに入力されるまで待ってから、ページを取得すると、ページのコメントを取得できます。データは利用できますか?

セレンを使用する:selenium-python中国語のドキュメント

  • Seleniumは元々自動テストツールであり、リクエストがJavaScriptコードを直接実行できないという問題を解決するためにクローラーで使用されていました。Seleniumは基本的にブラウザーを駆動し、ジャンプ、入力、クリック、ドロップダウンなどのブラウザー操作を完全にシミュレートします。 、Webページのレンダリング結果を取得するには、複数のブラウザーをサポートします

しかし、私のニーズでは、これで問題を解決することはできますが、時間がかかりすぎて、プログラムのパフォーマンスに影響を与える可能性があります。データフィールドのみをリクエストする必要があります。リクエストの待機時間が短すぎると、データがリクエストされる前に切断される可能性があります。リクエストの設定時間が長すぎると、プログラムが大幅に遅くなる可能性があります。それで、基本的な紹介や他の人の操作を読んだ後、自分のプログラムでも使ってみましたが、設定するものが多すぎて断固として諦めました。

オプションII

コメント数のリンクを個別にロードしてコメント数を取得することも、私自身の問題を解決する方法です。このようなデータリクエストリンクでデータをリクエストできる場合もありますが、リクエストしたリンクは前の手順と非常に関連しているため、ここではできません。詳細ページにデータが読み込まれていない場合、データをリクエストできません。 、しかし、ログインページに直接傍受されました。そこでは、リクエストの詳細ページのリンクを、コメントの数をリクエストするヘッダーにカプセル化して、通常のデータリクエストに偽装する必要があります。

もちろん、これは私が多くの方法を試した後に行われることを知っており、誰かにアドバイスを求めた後に学びました。同僚は収集プラットフォームの視覚化インターフェイスを使用してデータを収集しましたが、コードを使用してデータを収集するように求められました。問い合わせの結果、要求された非同期リンクを要求ヘッダーに追加する必要があることがわかりました。

最初に、私はこれを使用しました:


import urllib.request


def getcommentcount(preurl,suburl):
    headers = {"User-Agent",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}
    prevheaders = {"Referer",preurl}
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    opener.addheaders = [prevheaders]
    urllib.request.install_opener(opener)
    file = urllib.request.urlopen(suburl)
    data = file.read()
  

しかし、プログラムは非常に不安定で、エラーを報告し続けます

Python ValueError: Invalid header name b'Https://I.Learn.Hello.Com/Detail.Htm?CourseId=117292'

着信preurlは実際には次のようになります。

https://i.learn.hello.com/detail.htm?courseId=117292

質問をブラウザに投稿して、他の人の言うことを確認してくださいPython ValueError:無効なヘッダー名b ':authority

自分のプログラムでも上記の解決策を試しましたが、問題は解決しませんでした。インターネット上の誰もが上記の方法で1つのパラメータを設定しただけなので、ヘッダーの設定方法が間違っているのではないかと思い始め、2つ設定しました。 、それで私はヘッダーを設定する別の方法を見つけました。

def getcommentcount(url,suburl):
    req = urllib.request.Request(suburl)
    req.add_header("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36")
    req.add_header("Referer",url)
    file = urllib.request.urlopen(req)
    data = file.read()

この設定の後、問題は解決され、エラーは報告されません。その理由は、クローラーに慣れてきたらゆっくりと調べていきます。

おすすめ

転載: blog.csdn.net/someby/article/details/105056151