web-dev-qa-db-ja.com

curlを使用してWebリクエストを自動化しますか?

職場で使用しなければならない「コーポラティブ」システムがいくつかあります。それらのいくつかは、フレーム、ポップアップなどで、ひどいです。

Curlなどを使っていくつかのことを自動化することを考えていました。ログインが必要です。ハイパーリンクをクリックし、データを設定して、投稿を行います。

カールを使用することは可能ですか?それとも、Seleniumのようなものを使用した方が良いでしょうか?

はい、カールで完全に可能です。最も重要なことは、curlを--cookie-jarで使用する間にCookieを保存して再ロードすることです。必要に応じてフォームデータを投稿することもできます。私は通常、ライブHTTPヘッダーと呼ばれるFirefoxアドオンを使用して、Webサイトをナビゲートしたときに何が起こるかをキャプチャします。ヘッダーだけでなく、フォームの投稿も記録します。これは、curlで何をするかを理解するときに非常に役立ちます。私はさまざまなcurl呼び出しを自動化するbashスクリプトを記述し、パイプと一時ファイル(mktemp提供)を使用してWebページでいくつかの制限された処理を実行していますが、多くのWebページ処理を実行する必要がある場合は、通常Perlに切り替えますLibWWW。

13
penguin359

ページのコンテンツをダウンロードする単純なケースでは、curlまたはwget。どちらもHTTP経由でファイルをダウンロードするように設計されたコマンドラインツールであり、多くのオプションがあります。あなたの場合、これらのツールをブラウザのように見せる必要があるでしょう。 lutzkyの回答 および penguin359の回答 は、その点で役立ついくつかのcurlおよびwgetオプションについて言及しています。

ログインが必要な場合は、最初にWebブラウザで手動でログインしてから、WebブラウザーのCookieをエクスポートします(Firefoxの allcookies または Export Cookies などの拡張機能が役立ちます)。

一部のページのコンテンツまたは投稿フォームを解析する必要がある場合、 curlやwgetよりも優れたツールが必要になる場合があります。 LWP(libwww)およびHTML::TreeBuilder(HTML-Tree)またはPython標準ライブラリ(特にhttplib および htmllib)。

Webサイトとの複雑な相互作用の場合、参照はPerlのWWW :: Mechanize です。 。このPerlライブラリは、Webブラウザと同じようにWebサイトと対話するための高度な関数を定義します。これには、POST、フォーム、Cookieは含まれますが、JavaScriptは含まれません。 Perlがお茶ではない場合、このライブラリには、Python mechanizeなど、他の言語で同様の機能を備えた模倣品がありますおよびRuby Mechanize

最後に、Javascriptが必要な場合、通常のアプローチは、ブラウザー自動化フレームワークによって駆動されるWebブラウザーを使用することです。 Seleniumおよび Watir が一般的な選択肢です。また参照 JavaScriptでポストペイントされたコンテンツを含むWebページをフェッチできるSeleniumRC以外の優れたツールはありますか?

私のお気に入りはwgetです。その例を挙げます。やりたいことは、ブラウザセッションをできるだけ忠実に複製することなので、関連するコマンドライン引数を使用します。必要なものは、サイトがブラウザをどれだけ徹底的にチェックするかによって異なります。通常、--referer(シック)で十分ですが、--user-agentおよび--load-cookiesも必要になる場合があります。

この手法は基本的にブラウザーのなりすましです。wgetをブラウザーとしてサイトに表示しようとしています。直面する最大の問題はCAPTCHAです。これは、指定したサンプルサイトにはありません。また、サイトのタイミングポリシー(この場合は45秒)を遵守してください。遵守しないと、ブロックされる可能性があります。

たぶん ない 異なるセッション間で同じファイルをダウンロードすることが可能-サイトは特定のファイルへのダウンロード権限を特定のセッションに付与します。

6
lutzky