我想做以下事情。登录网站,单击几个特定链接,然后单击下载链接。我想将其作为Windows上的计划任务或Linux上的cron作业运行。我对所使用的语言不挑剔,但我希望在不可能的情况下在屏幕上不显示浏览器窗口的情况下运行。
Answers:
以下是我了解的无头浏览器的列表:
通过模拟DOM具有JavaScript支持的无头浏览器通常会遇到一些使用更高级/晦涩的浏览器功能的站点的问题,或者具有具有视觉依赖性(例如通过CSS位置等)的功能的站点,因此这些站点中的纯JavaScript支持浏览器通常是完整的,实际支持的浏览器功能应仅视为部分功能。
(注意:本文的原始版本仅提及HtmlUnit,因此提及。如果您知道其他无头浏览器实现并具有编辑权限,请随时编辑并添加它们。)
查看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。
看看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的“快速入门”页面中的示例。您甚至可以使用render()方法将页面呈现为PNG,JPEG或PDF。
我曾经使用Internet Explorer ActiveX控件(WebBrowser,MSHTML)做到了这一点。您可以实例化它而不使其可见。
可以使用任何支持COM的语言(Delphi,VB6,VB.net,C#,C ++等)来完成此操作
当然,这是一个快捷的解决方案,可能不适用于您的情况。
除了自动下载文件(即是一个对话框)外,带有嵌入式Web控件的Win窗体都可以执行此操作。
您可以看一下Watin和Watin Recorder。他们可能会帮助您使用C#代码来登录您的网站,导航到URL,甚至可能帮助自动下载文件。
YMMV虽然。
如果链接是已知的(例如,您不必在页面上搜索它们),则可以使用wget
。我相信它将对多个访存进行状态管理。
如果您比较进取,那么我将深入研究Python 3.0中的新功能。他们将接口重命名为HTTP堆栈,恕我直言,它的接口非常好,容易受到此类脚本的影响。
服务器上带有YUI的Node.js。观看此视频:http : //www.yuiblog.com/blog/2010/09/29/video-glass-node/
该视频Dav Glass中的家伙展示了一个示例,说明了他如何使用节点从Digg中获取页面。然后,他将YUI附加到他抓取的DOM上,并且可以完全操纵它。
如果您使用PHP,请尝试http://mink.behat.org/
您不仅可以使用下载管理器吗?
有更好的选择,但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选择器找到更具体的链接(例如,您可以找到所有带有“下载”类或以开头的URL的链接http://cdn.example.com
)。
您几乎可以使用任何一种语言来做同样的事情。
.NET包含System.Windows.Forms.WebBrowser。您可以创建一个实例,将其发送到URL,然后轻松解析该页面上的html。然后,您可以跟踪找到的所有链接,等等。
我只是很少使用此对象,所以我不是专家,但是如果您已经熟悉.NET,那么可能值得研究。