我想做以下事情。登录网站,单击几个特定链接,然后单击下载链接。我想将它作为Windows上的计划任务或Linux上的cron作业运行。我对我使用的语言并不挑剔,但如果可能的话,我希望这样做不会在屏幕上显示浏览器窗口。
答案 0 :(得分:147)
以下是我所知道的无头浏览器列表:
通过模拟DOM支持JavaScript的无头浏览器通常会遇到一些使用更高级/模糊浏览器功能的网站的问题,或者具有视觉依赖性的功能(例如通过CSS位置等),所以同时使用纯JavaScript这些浏览器中的支持通常是完整的,实际支持的浏览器功能应该被视为仅部分浏览器。
(注意:这篇文章的原始版本只提到了HtmlUnit,因此注释。如果您知道其他无头浏览器实现并拥有编辑权限,请随时编辑此帖并添加它们。)
答案 1 :(得分:5)
查看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。
答案 2 :(得分:3)
查看适用于Windows,Mac OS X,Linux和其他* ix系统的PhantomJS,基于JavaScript的自动化框架。
使用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' Quickstart页面中的示例。您甚至可以使用render()方法将网页呈现为PNG,JPEG或PDF 。
答案 3 :(得分:2)
我曾经使用Internet Explorer ActiveX控件(WebBrowser,MSHTML)做到了这一点。您可以在不使其可见的情况下实例化它。
这可以用任何支持COM的语言(Delphi,VB6,VB.net,C#,C ++,...)来完成。
当然,这是一个快速而肮脏的解决方案,可能不适合您的情况。
答案 4 :(得分:2)
PhantomJS是一款无头的基于WebKit的浏览器,您可以使用JavaScript编写脚本。
答案 5 :(得分:1)
除了自动下载文件(因为这是一个对话框)之外,带有嵌入式webcontrol的win表单将执行此操作。
您可以查看Watin和Watin Recorder。他们可能会帮助C#代码登录到您的网站,导航到URL,甚至可能帮助自动化文件下载。
YMMV虽然。
答案 6 :(得分:1)
如果链接已知(例如,您不必在页面中搜索它们),那么您可以使用wget
。我相信它会在多次提取中进行状态管理。
如果你更有进取心,那么我会在Python 3.0深入研究新的好东西。他们将接口重新编写为HTTP堆栈,并且恕我直言,有一个very nice interface容易受到此类脚本的攻击。</ p>
答案 7 :(得分:1)
服务器上带有YUI的Node.js。观看此视频:http://www.yuiblog.com/blog/2010/09/29/video-glass-node/
这个视频中的人Dav Glass展示了他如何使用节点从Digg获取页面的示例。然后他将YUI附加到他抓住的DOM上,可以完全操纵它。
答案 8 :(得分:1)
如果您使用PHP - 请尝试http://mink.behat.org/
答案 9 :(得分:0)
答案 10 :(得分:0)
你也可以使用Live Http Headers(Firefox扩展)来记录发送到网站的标题(登录 - >链接 - >下载链接),然后使用fsockopen用php复制它们。您可能需要变量的只是您从登录页面收到的cookie的值。
答案 11 :(得分:0)
libCURL可以用来创建这样的东西。
答案 12 :(得分:0)
你能不能只使用下载管理器?
有更好的,但FlashGet具有浏览器集成,并支持身份验证。您可以登录,单击一堆链接并将其排队并安排下载。
您可以编写一些内容,例如,充当代理,捕获特定链接并将其排队等待以后下载,或者一个Javascript书签,修改链接以转到"http://localhost:1234/download_queuer?url=" + $link.href
并使该队列具有下载 - 但是您我将重新发明下载管理器轮,并通过身份验证可能会更复杂..
或者,如果你想要“登录,点击链接”位也要自动化 - 查看screen-scraping ..基本上你通过HTTP库加载页面,找到下载链接并下载它们。< / p>
稍微简化的例子,使用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)
在使用“username”和“password”的用户名/密码进行身份验证后,将下载example.com上的每个链接。当然,您可以使用BeautifulSoup's HTML选择器找到更具体的链接(例如,您可以找到“class”类的所有链接,或者以http://cdn.example.com
开头的URL。)
你几乎可以用任何语言做同样的事情..
答案 13 :(得分:0)
.NET包含System.Windows.Forms.WebBrowser。您可以创建此实例,将其发送到URL,然后轻松解析该页面上的html。然后,您可以关注您找到的任何链接等。
我只使用了这个对象,所以我不是专家,但如果你已经熟悉.NET,那么它可能值得研究。