Hoje, o rastreamento da web é uma tecnologia bem conhecida, mas ainda existem muitas complexidades. Os rastreadores da web simples ainda são difíceis de competir com sites modernos desenvolvidos por várias tecnologias complexas, como treinamento de Ajax, xmlhttprequest, websockets, soquetes, etc.
Vamos aceitar nossas necessidades básicas no projeto Hubdoc como exemplo, no qual rastejamos o valor da fatura, a data de validade, o número da conta e, o mais importante: PDFs de contas recentes dos sites de bancos, serviços públicos e empresas de cartão de crédito. Para este projeto, comecei com uma solução muito simples (não usando o produto comercial caro que estamos avaliando por enquanto) - um projeto simples de rastreador que eu costumava fazer com o Perl no Messagelab/Symantec. Mas os resultados não estavam indo bem, e os spammers fizeram um site muito mais simples do que os bancos e serviços públicos.
Então, como resolver esse problema? Começamos principalmente com a excelente biblioteca de solicitações desenvolvida usando o Mikea. Faça uma solicitação no navegador e verifique quais cabeçalhos de solicitação foram enviados na janela da rede e copie esses cabeçalhos de solicitação para o código. Este processo é muito simples. É apenas para rastrear todas as solicitações do login para baixar o arquivo PDF e simular todas as solicitações desse processo. Para facilitar a manipulação de coisas semelhantes e para tornar os desenvolvedores da Web mais racionais ao escrever programas de crawler, exportei os resultados do HTML para o jQuery (usando a biblioteca leve do Cheatio), o que tornou o trabalho semelhante simples e tornou mais fácil o uso do seletor CSS para selecionar elementos em uma página. Todo o processo é envolvido em uma estrutura, o que também pode fazer trabalhos adicionais, como pegar certificados do banco de dados, carregar robôs individuais e se comunicar com a interface do usuário através do soquete.io.
Isso funciona para alguns sites da Web, mas é apenas um script JS, não o meu código Node.js, que é colocado em seu site por essas empresas. Eles podem caminhar os problemas restantes para lidar com a complexidade, dificultando muito o que fazer para obter o ponto de informação de login. Para alguns sites, tentei obtê -lo combinando -o com a biblioteca request () por alguns dias, mas ainda era em vão.
Depois de quase travar, descobri o Node-Phantomjs, uma biblioteca que me permite controlar o navegador Phantomjs Webkit sem cabeça do Node (Nota do tradutor: não esperava um substantivo correspondente. Sem cabeça significa que a página de renderização está concluída em segundo plano sem exibir o dispositivo). Parece uma solução simples, mas há alguns problemas que os fantasmas não podem evitar:
1. PhantomJs só pode dizer se a página foi carregada, mas você não pode determinar se há redirecionamento (redirecionamento) implementado por meio de JavaScript ou meta tags nesse processo. Especialmente quando o JavaScript usa o setTimeout () para atrasar as chamadas.
2. PhantOMJS fornece um gancho de PageloDoadded que permite lidar com os problemas mencionados acima, mas essa função só pode reduzir esse número quando você determina o número de páginas para carregar, reduzir esse número quando cada página é carregada e fornece processamento para possíveis tempos limite (porque isso nem sempre acontece), de modo que quando seu número é reduzido para 0, sua função de chamada pode ser chamada. Esse método pode funcionar, mas sempre faz as pessoas se sentirem um pouco como um hacker.
3. PhantOMJS requer um processo completo e independente para cada página rastrear, porque se esse não for o caso, é impossível separar cookies entre cada página. Se você estiver usando o mesmo processo Phantomjs, a sessão na página que foi conectada será enviada para outra página.
4. Incapaz de usar Phantomjs para baixar recursos - você só pode salvar a página como PNG ou PDF. Isso é útil, mas significa que precisamos recorrer para solicitar () para baixar o PDF.
5. Por causa dos motivos acima, tenho que encontrar uma maneira de distribuir cookies da sessão Phantomjs para a Biblioteca de Sessão de Request (). Basta distribuir a string document.cookie, analisá -la e injetar -a no pote de cookie de solicitação ().
6. Injetar variáveis na sessão do navegador não é fácil. Para fazer isso, preciso criar uma string para criar uma função JavaScript.
A cópia do código é a seguinte:
Robot.prototype.add_page_data = function (página, nome, dados) {
Page.Evaluate (
"function () {var" + nome + "= janela." + nome + "=" + json.stringify (dados) + "}"
);
}
7. Alguns sites são sempre preenchidos com código como console.log () e precisam ser redefinidos e saídas para o local que queremos. Para conseguir isso, eu fiz isso:
A cópia do código é a seguinte:
if (! console.log) {
var iframe = document.createElement ("iframe");
document.body.appendChild (iframe);
console = window.frames [0] .console;
}
8. Alguns sites são sempre preenchidos com código como console.log () e precisam ser redefinidos e saídas para o local que desejamos. Para conseguir isso, eu fiz isso:
A cópia do código é a seguinte:
if (! console.log) {
var iframe = document.createElement ("iframe");
document.body.appendChild (iframe);
console = window.frames [0] .console;
}
9. Não é fácil dizer ao navegador que cliquei na tag A. Para realizar essas coisas, adicionei o seguinte código:
A cópia do código é a seguinte:
var clickElement = window.clickElement = function (id) {
var a = document.getElementById (id);
var e = document.createevent ("mouseevents");
E.InitMouSeEvent ("Clique", verdadeiro, verdadeiro, janela, 0, 0, 0, 0, falsa, falsa, falsa, falsa, 0, nula);
a.dispatchEvent (e);
};
10. Também preciso limitar a simultaneidade máxima da sessão do navegador para garantir que não explodiremos o servidor. Mesmo assim, essa limitação é muito maior do que as soluções comerciais caras podem oferecer. (Nota do tradutor: isto é, a simultaneidade de uma solução comercial é maior que a desta solução)
Depois de todo o trabalho, tenho uma solução de rastreador relativamente decente para a solicitação Phantomjs +. Você deve fazer login com o Phantomjs antes de poder retornar à solicitação request (). Ele usará cookies definidos no Phantomjs para verificar a sessão logada. Esta é uma grande vitória, porque podemos usar o fluxo de solicitação () para baixar o arquivo PDF.
Todo o plano é tornar relativamente fácil para os desenvolvedores da Web entender como usar os seletores de jQuery e CSS para criar rastreadores para diferentes sites. Não provei com sucesso que essa ideia é viável, mas acredito que isso acontecerá em breve.