ホームページ >バックエンド開発 >PHPチュートリアル >クローラーを使用して Zhihu コンテンツのデータをクロールすると 403 の問題が発生するのはなぜですか?

クローラーを使用して Zhihu コンテンツのデータをクロールすると 403 の問題が発生するのはなぜですか?

WBOY
WBOYオリジナル
2016-08-17 10:01:254329ブラウズ

Zhihu でユーザーのフォロー情報 (A が誰をフォローしているかを確認するなど) をキャプチャし、ページ www.zhihu.com/people/XXX/followees からフォロワーのリストを取得したいと考えていますが、キャプチャ中に 403 の問題が発生しました。
1. クローラーはユーザーの注目情報を収集するためのみであり、学術研究を目的としたものではありません。
2. PHP を使用してリクエストを作成し、simple_html_dom を使用してドキュメントを解析します。フォロワー (フォロワー) リストでは、より多くのフォロワーを動的に読み込むために Ajax を使用する必要があるため、インターフェイス データを直接クロールして、より多くのフォロワーの読み込みが
http://www.zhihu を通じて行われることがわかります。 com/node/ProfileFolloweesListV2、投稿データには _xsrf、method、parmas が含まれているため、ログインしたままの状態で、投稿に必要なパラメーターを指定してこのリンクにリクエストを送信しましたが、403 でした。が返されます。 4. ただし、ログインをシミュレートする場合、いいねや感謝の数などのデータも解析できます。
5. リクエスト ヘッダーを設定するために、curl_setopt($ch, CURLOPT_HTTPHEADER, $header); を使用します。リクエストヘッダーはブラウザで送信したリクエストヘッダーと一致しますが、それでも 403 エラーが発生しました
6.curl リクエストヘッダーを出力して、ブラウザーによって送信されたリクエストヘッダーと比較しようとしましたが、正しい方法が見つかりませんでした (Baidu では、curl_getinfo() が対応するメッセージを出力するようです)
7. User-Agent または X-Requested-With が設定されていないため、多くの人が 403 に遭遇しましたが、私はリクエストを設定するときに設定しました。 5
8で説明したヘッダー。説明が不明瞭でコードを投稿する必要がある場合は、コードを投稿できます
9。このクローラーは卒業制作の一部であり、次の作品用にデータを取得する必要があります。データのクロールは純粋に学術研究のためです
返信内容:

サーバーにファイアウォール機能がある場合、プロキシ サーバーを多数設置しない限り、継続的なクロールが強制終了される可能性があります。または、最も簡単な方法は、adsl を使用して常にリダイヤルし、ip を変更することです。 まずブラウザを見つけて、リクエストの HTTP ヘッダーを調べてから、リクエストを取得します。 過去 2 日間で、Python を使用してユーザーのフォローとフォロワーを捕捉するクローラーを作成したばかりです。これは Python コードの一部です。コードを見てコードの問題を確認できます。

403 は、リクエスト中に一部のデータが誤って送信されたことを意味します。次のコードにはオープン テキストが含まれており、テキスト内のコンテンツ スタイルのスクリーンショットを撮って最後に追加しました。
りー それは、useragent、リファラー、トークン、クッキーにすぎません。 原因としては次の 2 つが考えられます:
  1. Cookie がない
  2. _xsrf または hash_id エラー
Zhihu は、「_xsrf」フィールドに小さな変更を加えました。これは、ホームページから取得された _xsrf 値ではなく、ログインに成功した後に Cookie を介して返される「_xsrf」値です。正しい値を取得します。そうでない場合は、常に 403 エラーが報告されます (Post が質問したときにこれを知りました。同様の問題が発生すると思うので、コードに直接アクセスしてください):

///
/ // 志胡の質問
///

/// 質問のタイトル
/// 詳細内容< ;/param>
/// ログイン後に取得されるCookie
public void ZhiHuFaTie(string question_title,string question_detail,CookieContainer cookie)
{
question_title="質問内容" ;
question_detail="質問の詳細な説明";

//Cookie を走査し、_xsrf の値を取得します
var list = GetAllCookies(cookie);
foreach (var item in list)
{
if (item.Name = = " _xsrf")
{
xsrf = item.Value;
Break;
}
}
//Post
var FaTiePostUrl = "zhihu.com/question/add" ;
var dd = topicStr.ToCharArray();
var FaTiePostStr = "question_title=" + HttpUtility.UrlEncode(question_title) + "&question_detail=" + HttpUtility.UrlEncode(question_detail) + "&anon=0&topic_ids=" + topicId + "&new_topics =&_xsrf ="+xsrf;
var FaTieResult = nhp.PostResultHtml(FaTiePostUrl, cookie, "http://www.zhihu.com/", FaTiePostStr);
}


///
// / トラバースCookieContainer
///

///
///
public static List (CookieContainer cc)
{
List lstCookies = new List();

ハッシュテーブル テーブル = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });

foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList )pathList .GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { }) ;
foreach (lstCookieCol.Values の CookieCollection ColCookies)
foreach (colCookies の Cookie c) lstCookies.Add(c);
}
return lstCookies;
} ヘッダーの X-Forwarded-For フィールドを変更して IP アドレスを偽装します。 なんという偶然でしょう、昨夜この問題に遭遇したばかりです。理由はたくさんあるかもしれませんが、参考までに、またアイデアを提供するために、私が遭遇したことだけをお話しします。私は新浪微博をクロールしてプロキシを使用しました。アクセス時にWebサイトが拒否されるため403が表示されます。ブラウザで同じことを行うと、いくつかのWebページを見るだけで403が表示されますが、何度か更新すれば問題ありません。コード内の実装では、複数回リクエストを実行します。 上記の回答を読んだ後、私はすぐに愕然としました。素晴らしい人はたくさんいますが、リー・カイフーに聞いてみることをお勧めします〜笑 インターフェイスがどのようにキャッチされるかについて話しましょう... Firebug でインターフェイスをキャッチできないのはなぜですか? Chrome のネットワークでもインターフェイスをキャッチできません
そういえば、フォロワーに直接リクエストすることで直接取得できます。 。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。