Automatizar tarefas em um site em um servidor sem cabeçalho

3

Eu quero automatizar uma tarefa que só pode ser feita em um site (com login anterior) no meu servidor Debian. Não há uma API pública disponível, por isso não posso usar uma.

Existe uma maneira de fazer isso? Pensei em um navegador baseado em texto ou algo semelhante.

    
por Leandros 24.05.2013 / 13:07

3 respostas

2

Você pode executar o Selênio em uma instalação sem cabeça em seu servidor, por exemplo, programando as ações em python usando pyvirtualdisplay .

pyvirtualdisplay permite que você use a tela xvfb , xepher ou xvnc para fazer captura de tela (ou dar uma olhada remota para ver o que está acontecendo).

Na instalação do Ubuntu 12.04:

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

e execute o seguinte (isso é usando a mais nova API do Selenium2, a API mais antiga ainda está disponível):

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()

O xmessage impede que o navegador saia, em ambientes de teste você não deseja isso. Você também pode chamar browse_it() diretamente para testar em primeiro plano.

Os resultados de find_element.....() do Selenium não fornecem itens como selecionar o elemento pai de um elemento que você acabou de encontrar. Algo que você pode esperar de pacotes de análise HTML (eu li em algum lugar isso é de propósito). Essas limitações podem ser um pouco trabalhosas se você fizer uma raspagem de páginas sobre as quais não tem controle. Ao testar seu próprio site, certifique-se de gerar todos os elementos que deseja testar com um id ou exclusivo class para que eles possam ser selecionados sem problemas.

    
por 24.05.2013 / 13:13
4

Dê uma olhada em WWW :: Mechanize (exemplos em link ). Leva sua página como objeto e torna todos os elementos acessíveis através de métodos.

Por exemplo

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

Também há portas para (pelo menos) ruby e python.

    
por 24.05.2013 / 13:12
1

Você pode usar um dos seguintes:

  • Perl com WWW :: Mechanize ou até mesmo você mesmo usando o seu HTTPClient
  • Selênio / WebDriver
  • um Google Chrome ou extensão do Firefox (existente ou um que você escreve)
  • um script de shell usando curl e wget (você precisará salvar e reenviar os dados da sessão)
  • HtmlUnit
  • ...

Basicamente, qualquer idioma que permita consultar um recurso em rede faria ...

    
por 24.05.2013 / 14:15