我想自动化一项只能在我的 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
,xepher
或xvnc
屏幕,以便您可以进行屏幕截图(或远程查看发生了什么)。
在 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单元
- ...
基本上任何允许您查询网络资源的语言都可以......