目次
問題の説明
データ詳細ページをクロールする場合、コメント数(コメント数)をクロールする必要がありますが、コメント数と詳細ページのデータは同期して要求されません。データは後で詳細ページに読み込まれます。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()
この設定の後、問題は解決され、エラーは報告されません。その理由は、クローラーに慣れてきたらゆっくりと調べていきます。