我希望实现以下功能:登录一个网站,点击一些特定的链接,然后点击下载链接。我想在Windows上作为计划任务或在Linux上作为cron job运行。语言不是很重要,但如果可能的话,我希望能够在屏幕上不显示浏览器窗口的情况下运行。
我希望实现以下功能:登录一个网站,点击一些特定的链接,然后点击下载链接。我想在Windows上作为计划任务或在Linux上作为cron job运行。语言不是很重要,但如果可能的话,我希望能够在屏幕上不显示浏览器窗口的情况下运行。
以下是我所知道的一些无头浏览器列表:
请看twill,这是一种非常便捷的脚本语言,正好符合您的需求。以下是示例:
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。
请查看基于 JavaScript 的自动化框架 PhantomJS,可在 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快速入门页面的示例。您甚至可以使用render()方法将页面渲染为PNG、JPEG或PDF格式。
我曾经使用Internet Explorer ActiveX控件(WebBrowser, MSHTML)来实现此功能。您可以在不可见的情况下实例化它。
任何支持COM的语言都可以实现,如Delphi、VB6、VB.net、C#、C++等。
当然,这只是一种快速而不太完美的解决方案,可能并不适合您的情况。
在服务器上使用Node.js和YUI。看看这个视频:http://www.yuiblog.com/blog/2010/09/29/video-glass-node/
这个视频中的Dav Glass演示了他如何使用node从Digg获取页面的示例。然后,他将YUI附加到他抓取的DOM上,并完全操纵它。
除了自动下载文件(因为那是一个对话框),带有嵌入式 WebControl 的窗体将会做到这一点。
您可以查看 Watin 和 Watin Recorder。它们可能会帮助您使用 C# 代码登录到您的网站,导航到 URL,甚至可能帮助自动化文件下载。
但是,您的情况可能会有所不同。
wget
。我相信它会在多次获取之间执行状态管理。你不能只用一个下载管理器吗?
有更好的选择,但FlashGet具有浏览器集成功能,并支持身份验证。你可以登录,点击一堆链接并将它们排队并安排下载。
你可以编写一个作为代理的程序,捕获特定链接并将它们排队以供稍后下载,或者编写一个JavaScript书签工具,修改链接以转到"http://localhost:1234/download_queuer?url=" + $link.href
,然后将其排队下载 - 但这样做就相当于重新发明了下载管理器的轮子,而且在进行身份验证时可能会更加复杂。
或者,如果你希望“登录,点击链接”部分也自动化 - 可以研究一下屏幕抓取..基本上,你通过一个HTTP库加载页面,找到下载链接并下载它们。
以下是使用Python的简化示例:
import urllib
from BeautifulSoup import BeautifulSoup
src = urllib.urlopen("http://%s:%s@example.com" % ("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)
这将使用“用户名”和“密码”进行身份验证,下载example.com上的每个链接。当然,您可以使用BeautifulSoup的HTML选择器查找更具体的链接(例如,您可以查找所有带有“download”类的链接或以http://cdn.example.com
开头的URL)。
您几乎可以在任何语言中执行相同的操作。