私は次のことをしたいと思います。 Webサイトにログインし、いくつかの特定のリンクをクリックしてから、ダウンロードリンクをクリックします。これをWindowsのスケジュールされたタスクまたはLinuxのcronジョブとして実行したいと思います。使用する言語については気にしませんが、可能であればブラウザウィンドウを画面に表示せずに実行したいと思います。
私が知っているヘッドレスブラウザのリストは次のとおりです。
エミュレートされたDOMを介してJavaScriptをサポートするヘッドレスブラウザーは、より高度な/あいまいなブラウザー機能を使用するサイトや、視覚的な依存関係(CSS位置など)を持つ機能を持つサイトに問題があるため、これらの純粋なJavaScriptサポートはブラウザは一般に完全であるため、実際にサポートされているブラウザ機能は部分的なものと見なされる必要があります。
(注:この投稿のオリジナルバージョンはHtmlUnitのみに言及していたため、コメントです。他のヘッドレスブラウザーの実装を知っており、編集権限がある場合は、この投稿を編集して追加してください。)
twill を確認してください。これは、探しているものにぴったりの非常に便利なスクリプト言語です。 examples から:
setlocal username <your username>
setlocal password <your password>
go http://www.slashdot.org/
formvalue 1 unickname $username
formvalue 1 upasswd $password
submit
code 200 # make sure form submission is correct!
より柔軟性を求めている場合は、 Python API もあります。
PhantomJS 、JavaScriptベースの自動化フレームワークをご覧ください。Windows、Mac OS X、Linux、その他の* ixシステムで使用できます。
PhantomJSを使用すると、次のようなことができます。
console.log('Loading a web page');
var page = new WebPage();
var url = "http://www.phantomjs.org/";
page.open(url, function (status) {
// perform your task once the page is ready ...
phantom.exit();
});
またはページのタイトルを評価します:
var page = require('webpage').create();
page.open(url, function (status) {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
});
PhantomJSのクイックスタート ページの例。 ページをPNG、JPEG、またはPDFにレンダリングrender() メソッドを使用することもできます。
私はかつてInternet Explorer ActiveXコントロール(WebBrowser、MSHTML)を使用してこれを行いました。表示せずにインスタンス化できます。
これは、COMをサポートする任意の言語(Delphi、VB6、VB.net、C#、C++など)で実行できます。
もちろん、これは手っ取り早い解決策であり、状況によっては適切ではないかもしれません。
PhantomJSは、JavaScriptを使用してスクリプトを作成できる、ヘッドレスWebKitベースのブラウザーです。
サーバー上のYUIを使用したNode.js。このビデオを確認してください: http://www.yuiblog.com/blog/2010/09/29/video-glass-node/
このビデオの男Dav Glassは、ノードを使用してDiggからページを取得する方法の例を示しています。その後、彼は掴んだDOMにYUIを添付し、完全に操作できます。
PHP-try http://mink.behat.org/ を使用する場合
ファイルの自動ダウンロード(ダイアログボックス)を除き、webcontrolが組み込まれたwinフォームがこれを行います。
Watin および Watin Recorder を見ることができます。 Webサイトへのログイン、URLへのナビゲート、さらにはファイルのダウンロードの自動化を可能にするC#コードが役立ちます。
しかし、YMMV。
リンクが既知の場合(たとえば、ページを検索する必要がない場合)、おそらく wget
を使用できます。私はそれが複数のフェッチにわたって状態管理を行うと信じています。
あなたがもう少し進取的であるなら、私は Python 3. の新しい利点を掘り下げるでしょう。彼らはHTTPスタックへのインターフェースをやり直し、私見では、このタイプのスクリプトの影響を受けやすい very Nice interface を持っています。
libCURL を使用して、このようなものを作成できます。
ダウンロードマネージャーだけを使用することはできませんか?
より良いものがありますが、FlashGetにはブラウザ統合があり、認証をサポートしています。ログインし、多数のリンクをクリックしてキューに入れ、ダウンロードをスケジュールできます。
たとえば、特定のリンクをキャッチして後でダウンロードするためにキューに入れるプロキシとして機能するもの、またはリンクを変更して"http://localhost:1234/download_queuer?url=" + $link.href
に移動してダウンロードをキューに入れるJavascriptブックマークレットを作成できますが、 download-manager-wheelを再発明し、認証によりさらに複雑になる可能性があります。
または、「ログイン、リンクのクリック」ビットも自動化する場合は、 screen-scraping を調べます。基本的には、HTTPライブラリ経由でページをロードし、ダウンロードリンクを見つけてダウンロードします。 。
Pythonを使用した少し単純化した例:
import urllib
from BeautifulSoup import BeautifulSoup
src = urllib.urlopen("http://%s:%[email protected]" % ("username", "password"))
soup = BeautifulSoup(src)
for link_tag in soup.findAll("a"):
link = link_tag["href"]
filename = link.split("/")[-1] # get everything after last /
urllib.urlretrieve(link, filename)
「username」と「password」のユーザー名/パスワードで認証した後、example.com上のすべてのリンクをダウンロードします。もちろん、 BeautifulSoup's HTMLセレクターを使用して、より具体的なリンクを見つけることができます(たとえば、「download」クラスのすべてのリンク、またはhttp://cdn.example.com
で始まるURLを見つけることができます)。
ほとんどすべての言語で同じことができます。
.NETには System.Windows.Forms.WebBrowser が含まれます。このインスタンスを作成してURLに送信し、そのページのhtmlを簡単に解析できます。その後、見つけたリンクなどをたどることができます。
私はこのオブジェクトを最小限しか使用していないため、専門家ではありませんが、既に.NETに精通している場合は、おそらく検討する価値があるでしょう。
また、ライブHttpヘッダー(Firefox拡張機能)を使用して、サイトに送信されるヘッダーを記録し(ログイン->リンク->ダウンロードリンク)、次にfsockopenを使用してphpで複製できます。おそらく変化させる必要があるのは、ログインページから受け取るCookieの値だけです。