在无头服务器上自动执行网站上的任务

在无头服务器上自动执行网站上的任务

我想自动化一项只能在我的 debian 服务器上的网站(需要事先登录)上完成的任务。没有可用的公共 API,所以我无法使用。

有办法这样做吗?我考虑过基于文本的浏览器或类似的东西。

答案1

看看 WWW::Mechanize (示例位于http://search.cpan.org/dist/WWW-Mechanize/lib/WWW/Mechanize/Examples.pod)。它将您的网页作为对象,并使所有元素可以通过方法访问。

例如

$m->get("https://lists.ccs.neu.edu/bin/admindb/$listname");
$m->set_visible( $password );
$m->click;

(至少)还有 ruby​​ 和 python 的端口。

答案2

你可以运行在服务器上进行无头安装,例如通过使用 python 对操作进行编程py虚拟显示

pyvirtualdisplay允许您使用xvfb,xepherxvnc屏幕,以便您可以进行屏幕截图(或远程查看发生了什么)。


在 Ubuntu 12.04 上安装:

sudo apt-get install python-pip tightvncserver xtightvncviewer
sudo pip install selenium pyvirtualdisplay

并运行以下命令(这是使用较新的 Selenium2 API,旧的 API 仍然可用):

import subprocess
from pyvirtualdisplay import Display
from selenium import webdriver

def browse_it(port=None):
    browser = webdriver.Firefox()
    page = browser.get('http://unix.stackexchange.com/questions')
    for question in browser.find_elements_by_class_name('question-hyperlink'):
        print question.text
    if port:
        print '--------\nconnect using:\n  vncviewer ' + \
          'localhost:{}\nand click the xmessage to quit'.format(port)
        subprocess.call(['xmessage', 'click to quit'])
    browser.quit()

def browse_it_hidden(rfbport=5904):
    with Display(backend='xvnc', rfbport=str(rfbport)) as disp:
        browse_it(rfbport)

if __name__ == '__main__':
    browse_it_hidden()

xmessage可以防止浏览器退出,在测试环境中您不会希望出现这种情况。也可以browse_it()直接调用前台测试。

Selenium 的结果find_element.....()不提供诸如选择刚刚找到的元素的父元素之类的功能。您可能期望从 HTML 解析包中得到一些东西(我在某处读到这是故意的)。如果您抓取无法控制的页面,这些限制可能会有点麻烦。在测试您自己的网站时,只需确保您生成了要使用id或 unique进行测试的所有元素,class以便可以轻松选择它们。

答案3

您可以使用以下任一方法:

  • Perl 与 WWW::Mechanize 甚至使用他们的 HTTPClient 推出您自己的 Perl
  • 硒/网络驱动程序
  • Google Chrome 或 Firefox 扩展(现有的或您编写的)
  • 使用curl和wget的shell脚本(您需要保存并重新发送会话数据)
  • html单元
  • ...

基本上任何允许您查询网络资源的语言都可以......

相关内容