8

これは SO に関する私の最初の投稿なので、お手柔らかにお願いします。これがここに属しているかどうかさえわかりませんが、ここに行きます。

個人アカウントの 1 つの情報にアクセスしたいと考えています。Web サイトの記述が不十分で、情報が必要な日付を手動で入力する必要があります。それは本当に苦痛です。Perl をもっと学ぶための言い訳を探していたので、これは絶好の機会だと思いました。私の計画は、自分のアカウントにログインして情報を照会する Perl スクリプトを作成することでした。しかし、私はすぐに立ち往生しました。

my $ua = LWP::UserAgent->new;
my $url = url 'https://account.web.site';
my $res = $ua->request(GET $url);

結果の Web ページには、基本的に、私の Web ブラウザーはサポートされていないと表示されます。私はいくつかの異なる値を試しました

$ua->agent("");

しかし、何も機能していないようです。Google で調べてみるとこの方法が提案されていますが、Web サイトで悪意のある理由で perl が使用されているとも書かれています。Web サイトはこの方法をブロックしますか? 私がやろうとしていることは可能ですか?より適切な別の言語はありますか?私がやろうとしていることは合法ですか、それとも良い考えですか? たぶん、私は自分の努力を放棄する必要があります。

個人情報を漏らさないようにするために、ここに書いたコードは、私が使用しているコードとまったく同じではないことに注意してください。しかし、それがかなり明白だったことを願っています。

編集: FireFox では、JavaScript と CSS を無効にしました。「互換性のないブラウザ」エラーなしで問題なくログインできました。JavaScriptの問題ではないようです。

4

8 に答える 8

7

スクレイピングで別のウェブページを取得する

1 つの仮定を行う必要があります。同じ入力が与えられた場合、Web サーバーは同じ出力を返します。この仮定では、同じ入力を与えていないという結論に必然的に到達します。このシナリオには 2 つのブラウザ、つまり http クライアントがあります。必要な結果が得られるブラウザ (例: Firefox、IE、Chrome、または Safari) と、必要な結果が得られないブラウザ(例: 、LWP、wget、または cURL)。

最初に簡単な可能性を殺してください

その前に、最初に単純な UserAgent が同じであることを確認します。これを行うには、whatsmyuseragent.comを参照し、他のブラウザーのヘッダーにある UserAgent 文字列をその Web サイトが返すものに設定します。Firefox のWeb Developer's Toolbarを使用して、CSS、JavaScript、Java、およびメタリダイレクトを無効にすることもできます。これは、本当に単純なものを削除することで問題を追跡するのに役立ちます。

動作中のブラウザの複製を試みます

Firefox では、FireBugを使用して送信されたメッセージを分析できますREQUEST。FireBugのタブの下でこれを行うことができますNET。さまざまなブラウザーには、FireBug が FireFox で行うことを実行できるツールが必要です。ただし、問題のツールがわからない場合でも、以下で説明するようにtsharkまたはwiresharkを使用できます。tsharkwiresharkは、少なくとも私の経験ではエラーの余地が少ない低レベルで動作するため、常により正確であることに注意することが重要です。たとえば、ブラウザが実行しているメタ リダイレクトのようなものが表示されますが、これは FireBug が追跡できなくなることがあります。

機能する最初の Web 要求を理解したら、2 番目の Web 要求を最初の Web 要求に設定するために最善を尽くします。これは、リクエスト ヘッダーとその他のリクエスト要素を適切に設定することを意味します。これでもうまくいかない場合は、2 番目のブラウザが何をしているのかを知る必要があります。

トラブルシューティング

これをトラブルシューティングするには、両方のブラウザからのリクエストを完全に理解する必要があります。2 番目のブラウザーは、通常はトリッキーです。これらは、多くの場合、ライブラリーや非対話型のコマンド ライン ブラウザーであり、要求をチェックする機能がありません。彼らがリクエストをダンプする能力を持っている場合でも、とにかく単にそれらをチェックすることを選ぶかもしれません. これを行うには、wireshark と tshark スイートをお勧めします。これらはブラウザの下で動作するため、すぐに警告する必要があります。デフォルトでは、実際のネットワーク (IP) パケットとデータリンク フレームが表示されます。このようなコマンドを使用して、特に必要なものを除外できます。

sudo tshark -i <interface> -f tcp -R "http.request" -V |
perl -ne'print if /^Hypertext/../^Frame/'

これにより、すべての TCP パケットがキャプチャされ、 のみが表示フィルター処理さhttp.requestsれ、次にレイヤー 4 HTTP のもののみが perl フィルター処理されます。表示フィルターに追加して、単一の Web サーバーのみを取得することもできます-R "http.request and http.host == ''"

2 つのリクエストが一致しているかどうか、Cookie、GET URL、ユーザー エージェントなど、すべてをチェックする必要があります。サイトが何か間抜けなことをしていないことを確認してください。

2010 年 1 月 23 日更新: 新しい情報に基づいて、Accept、およびAccept-LanguageAccept-Charsetおよびを設定することをお勧めしますAccept-Encoding。through でそれを行うことができます$ua->default_headers()。ユーザーエージェントにもっと多くの機能が必要な場合は、いつでもサブクラス化できます。私は GData API でこのアプローチを採用しました。github でUserAgent サブクラスの例を見つけることができます。

于 2010-01-23T21:18:21.607 に答える
4

おそらく、その種のWebサイト自動化を対象としたLWP::UserAgentのサブクラスであるWWW::Mechanizeを確認する必要があります。特に、agent_aliasメソッドを参照してください。

一部のWebサイトは、User-Agentに基づいて接続をブロックしますが、Perlを使用して任意の接続に設定できます。Webサイトが特定のブラウザによって通常生成される他のリクエストヘッダー(Acceptヘッダーなど)を探して、それらを含まない接続を拒否する可能性もありますが、探しているものがわかれば、それらのヘッダーを追加することもできます。 。

一般に、Webサイトが、サポートされているブラウザを別のクライアントが偽装するのを防ぐことはできません。何を探していても、最終的には複製することができます。

JavaScriptのサポートを探している可能性もあります。その場合、JavaScriptサポートを追加するWWW::MechanizeのサブクラスであるWWW::Scripterを見ることができます。それはかなり新しく、私はまだ試していません。

于 2010-01-23T20:55:47.160 に答える
2

このスレッドは、ほとんどの場合、ユーザー エージェントの変更に関するものではありません。

2 つのパスが表示されます。ブラウザで javascript と css をオフにして実験し、LWP::UserAgent に依存しながら HTTP::Request と HTTP::Response オブジェクトにアクセスする方法を学ぶか、WWW::Scripter に移動して javascript を使用します。

粗雑な Craigslist のテキスト広告では、3 ページにぎっしり詰め込まれた、ほとんどスペースのない JavaScript と CSS があり、さらに特殊なコードが読み込まれるため、comcast でアクセスすると、comcast ユーザーだけをターゲットにした特別な JavaScript が見つかります。最終ページに読み込まれました。彼らのやり方は、HTML 1.0 と 1.1 の違いを正当化するコードを HEAD に入れ、ロボットを壊そうとすることです。 isp をスヌープするための追加のコードと、誰が何を知っているか、確かに Cookie 情報 (LWP を遅くする方法を学び、コールバック コードを挿入して *shark のようにスヌープする方法を学ぶと、毎回 Cookie を出力できますが、perl 内で、サーバーの方法も参照してください「あなたの」ヘッダーと「あなたの」リクエストを変更しようとし続けます--再交渉」

CL は Alice の HEAD にランダムな ID 番号を入力し、赤い錠剤を飲み込むには HTTP リクエストが必要だとささやきます。舌の下に隠すのはやめてください。このようにして、ほとんどのロボットは窒息し、偽のサニタイズされたページ、つまり切り捨てられた「ホームページ」を受け入れます。また、ページから URL をスクレイピングした場合、LWP を使用して「クリック」することはできません。これは、ID を学習したことがなく、$ua->get( $ url&ID=9dd887f8f89d9" ); または、単純な get が &ID で機能する可能性があります。これはユーザー エージェント以上のものですが、それを行うことができ、必要なすべてのヘルプを得ることができます。

ご覧のとおり、最初のパスは、すべてをオフにして、元の URL ではなく、再ネゴシエートされたリクエストの URI を学習できるかどうかを確認することです。次に、javascript も WWW::Scripter も必要ありません。LWPがうまくいくようです。最初にdefault_headerのACCEPTを変更することについてもっと知りたいのですが、サーバーが、ああ、これとこれとこれをACCEPTすることを意味するかどうか、再ネゴシエートリクエストオブジェクトで赤い丸薬を飲み込みます。リクエストとレスポンスの会話にコールバックを挿入することで、それをスヌープできます。

2 番目のパスである WWW::Scripter は、レッド ピルを飲み込み、アリスのラビット ホール (別名マトリックス) を下ることに決めた場合にのみ使用できます。perl の哲学は、一生懸命働く前に他の可能性を使い果たすことを指示します。そうでなければ、101 の http 前提条件を学習できなかったので、より大きなハンマーにエスカレートすることは、それか、アスピリンのために酸を落とすことでしょうか?

于 2012-01-16T20:46:05.107 に答える
0

私はいくつかの異なる値を試しました

$ua->agent("");

しかし、何も機能していないようです。

では、あなたが試したことは何だったのか教えてください。

私が通常行うことは、タイプすることです

javascript:prompt('your agent string is',navigator.userAgent)

通常のブラウザの URL バーに移動し、Enter キーを押して、表示される内容をカット アンド ペーストします。確かにwiresharkを使用して実際のパケットを監視するのはやり過ぎですか? アクセスしようとしている Web サイトは、Perl を使用していることを知る方法がありません。聞くことを期待していることを何でも伝えてください。

于 2010-01-24T08:26:00.087 に答える
0

リファラー部分を追加すると、うまくいきました:

$req = HTTP::Request->new(GET => $url);
$req->header(Accept => "text/html, */*;q=0.1", referer => 'http://google.com');
$res = $ua->request($req);
print $res->status_line;
于 2014-04-06T07:42:30.787 に答える
0

Perl スクリプトは、参照している Firefox ブラウザと同じマシンで実行されていますか? サブネットまたは着信 IP アドレスに基づくフィルタリングである可能性があります。あなたの URL は https であるため、サーバーが期待しているブラウザに PSK (事前共有キー) または証明書がロードされている可能性もあります。社内のイントラネット サイト以外ではほとんどありません。

于 2011-08-01T23:17:15.200 に答える
0

ツール: TamperData と LiveHTTPHeaders を備えた Firefox、Devel::REPL、LWP。

分析: ブラウザーで Javascript と Java をオフにし、対象の Web サイトからすべての Cookie を削除し、TamperData のログ記録を開始して、Web サイトにログインします。TamperData のログ記録を停止し、ログイン プロセス中に行った可能性のある多くの要求を見直します。最初のリクエスト (意図的に行ったリクエスト) を見つけて、その詳細を確認します。

実験: を開始re.plし、ブラウザの対話の再作成を開始します。

use LWP::UserAgent;

my $ua = LWP::UserAgent->new(
  agent      => $the_UA_of_the_browser,
  cookie_jar => HTTP::Cookies->new(hide_cookie2 => 1),
);
$ua->default_headers(HTTP::Headers->new(
  %the_headers_sent_by_the_browser,
));

my $r = $ua->get($the_URL);
$r->content($r->decoded_content); print $r->as_string;

これがステップ 1 です。どこかで応答が一致しない場合は、何かが間違っています。$r->request通常[1] 、Firefox が送信したリクエストを見て比較することで、何を見つけることができます。重要なことは、魔法はなく、サーバーが知っていることはすべて知っているということです。同じ要求のように見えても同じ応答が得られない場合は、何かを見逃しています。

通常、最初のページに到達するだけでは十分ではありません。フォームを ( で) 解析しHTML::Form、リダイレクトをたどる必要があります (上記で構成したように、UA は自動的にそれを行いますが、時にはそれをオフにして手動で行うことをお勧めします)。ごくわずかなヒントからのログイン シーケンス。幸運を。

[1]: LWP の Cookie 実装の特定のバグの場合を除いて、ここでは詳しく説明しません。それでも、探しているものがわかっている場合は、それを見つけることができます。

于 2010-02-03T17:50:03.047 に答える
0

私はちょうど何かに気づきました。この行:

my $res = $ua->request(GET $url);

私のマシンではまったく動作しません。しかし、次のように変更することで機能するようになりました。

my $res = $ua->get($url);
于 2013-09-28T19:01:45.480 に答える