Descrição de métodos (v1)
Esta API de JavaScript é considerada obsoleta, recomendamos usar a API versão 2
Observe que alguns métodos exigem o uso da palavra-chave yield
yield this.request()
yield this.request(method, url, queryParams, opts)
Obtenção de resposta HTTP por solicitação, os seguintes argumentos são especificados:
method- método da solicitação (GET, POST...)url- link para a solicitaçãoqueryParams- hash com parâmetros get ou hash com o corpo da solicitação postopts- hash com opções da solicitação
Se o método POST for utilizado, o corpo da solicitação pode ser enviado de duas formas:
- apenas listando os nomes das variáveis e seus valores em
queryParams. Por exemplo:
{
key: set.query,
id: 1234,
type: 'text'
}
- através da variável body em
opts. Por exemplo:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ condição1, condição2, ...] - array de condições para verificar o conteúdo recebido; se a verificação falhar, a solicitação será repetida com outro proxy.
Recursos:
- uso de strings como condições (busca por ocorrência de string)
- uso de expressões regulares como condições
- uso de funções de verificação personalizadas, para as quais são passados os dados e os cabeçalhos da resposta
- é possível definir vários tipos diferentes de condições simultaneamente
- para negação lógica, coloque a condição em um array, ou seja,
check_content: ['xxxx', [/yyyy/]]significa que a solicitação será considerada bem-sucedida se os dados recebidos contiverem a substring xxxx e, ao mesmo tempo, a expressão regular /yyyy/ não encontrar correspondências na página
Para uma solicitação bem-sucedida, todas as verificações especificadas no array devem passar
Exemplo (os comentários indicam o que é necessário para que a solicitação seja considerada bem-sucedida):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //esta expressão regular deve ser acionada na página recebida
['XXXX'], //esta substring não deve estar presente na página recebida
'</html>', //esta substring deve estar presente na página recebida
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //esta função deve retornar true
]
});
opts.decode
decode: 'auto-html' - detecção automática de codificação e conversão para utf8
Valores possíveis:
auto-html- baseado em cabeçalhos, tags meta e conteúdo da página (opção recomendada ideal)utf8- indica que o documento está na codificação utf8<encoding>- qualquer outra codificação
opts.headers
headers: { ... } - hash com cabeçalhos, o nome do cabeçalho é definido em letras minúsculas, pode-se especificar inclusive cookie
Exemplo:
headers: {
accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
cookie: 'a=321; b=test',
'user-agent' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
opts.headers_order
headers_order: ['cookie', 'user-agent', ...] - permite redefinir a ordem de classificação dos cabeçalhos
opts.recurse
recurse: N - número máximo de redirecionamentos, o padrão é 7, use 0 para desativar o seguimento de redirecionamentos
opts.proxyretries
proxyretries: N - número de tentativas de execução da solicitação, por padrão é obtido das configurações do scraper
opts.parsecodes
parsecodes: { ... } - lista de códigos de resposta HTTP que o scraper considerará bem-sucedidos, por padrão é obtido das configurações do scraper. Se especificar '*': 1, todas as respostas serão consideradas bem-sucedidas.
Exemplo:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N - tempo limite de resposta em segundos, por padrão é obtido das configurações do scraper
opts.do_gzip
do_gzip: 1 - determina se deve usar compressão (gzip/deflate/br), ativado por padrão (1), para desativar defina o valor como 0
opts.max_size
max_size: N - tamanho máximo da resposta em bytes, por padrão é obtido das configurações do scraper
opts.cookie_jar
cookie_jar: { ... } - hash com cookies.
opts.attempt
attempt: N - indica o número da tentativa atual; ao usar este parâmetro, o manipulador de tentativas integrado para esta solicitação é ignorado
opts.browser
browser: 1 - emulação automática de cabeçalhos de navegador (1 - ativado, 0 - desativado)
opts.use_proxy
use_proxy: 1 - substitui o uso de proxy para uma solicitação individual dentro do scraper JS sobre o parâmetro global Use proxy (1 - ativado, 0 - desativado)
opts.noextraquery
noextraquery: 0 - desativa a adição de Extra query string à URL da solicitação (1 - ativado, 0 - desativado)
opts.save_to_file
save_to_file: file - permite baixar o arquivo diretamente para o disco, ignorando a gravação na memória. Em vez de file, especifique o nome e o caminho sob o qual salvar o arquivo. Ao usar esta opção, tudo relacionado a data é ignorado (verificação de conteúdo em check_content, response.data ficará vazio, etc.).
opts.data_as_buffer
data_as_buffer: 0 - determina se deve retornar data como uma string String (0) ou como um objeto Buffer (1), por padrão retorna uma string String
opts.bypass_cloudflare
bypass_cloudflare: 0 - contorno automático da proteção JavaScript do CloudFlare usando o navegador Chrome (1 - ativado, 0 - desativado)
opts.follow_meta_refresh
follow_meta_refresh: 0 - permite seguir redirecionamentos declarados via tag HTML meta:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... } – permite passar configurações para conexões https
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Obtenção de resultados de outro scraper (integrado ou outro scraper JS), os seguintes argumentos são especificados:
parser- nome do scraper (SE::Google, JS::Custom::Example)preset- predefinição de configurações do scraper chamadooverrideParams- hash com substituições de configurações do scraper chamadoquery- consulta
Em overrideParams é possível redefinir parâmetros do scraper chamado, também estão disponíveis estas flags:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0 - determina em que formato retornar os arrays de resultados do scraper chamado:
- se ativado (1) - serão retornados arrays de objetos
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...] - se desativado (0) - serão retornados arrays padrão de valores
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1 - determina se deve passar (1) ou não (0) data/pages[] na resposta, pode ser usado para otimização
tools.*
Objeto global tools, permite acessar as funções integradas do A-Parser (análogo às ferramentas do motor de modelos $tools.*).
tools.query não está disponível, é necessário usar this.query
this.doLog()
Indica se o registro de log da tarefa está ativado, pode ser usado como uma flag para otimização, para casos onde o log não é registrado e o argumento para this.logger.put é uma expressão complexa
this.logger.*
.put()
this.logger.put(message) - adiciona a linha message ao log da tarefa
.putHTML()
this.logger.putHTML(code) - exibe código HTML no log da tarefa, que será renderizado no textarea
yield this.sleep()
yield this.sleep(sec)
Define um atraso na thread por um número de segundos sec, podendo ser fracionário.
yield this.mutex.*
Mutex para sincronização entre threads, permite bloquear uma seção de código para uma única thread
.lock()
Aguardando o lock, a execução continuará pela primeira thread que capturou o lock, as outras threads aguardarão a liberação do lock
.unlock()
Liberação do lock, a próxima thread continuará a execução se estiver aguardando o lock (.lock())
this.cookies.*
Trabalho com cookies para a solicitação atual
.getAll()
Obtenção de um array de cookies
.setAll()
Definição de cookies, um array com cookies deve ser passado como argumento
.set()
this.cookies.set(host, path, name, value) - definição de um único cookie
this.query.add()
this.query.add(query, maxLvl)
Adição de uma nova consulta (query) com a possibilidade opcional de especificar o nível máximo (maxLvl), similar a tools.query.add() É possível passar como consulta (query) um hash com parâmetros, funciona de forma análoga ao Construtor de Consultas
Exemplo:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Trabalho com proxy
.next()
Mudar o proxy para o próximo, o proxy antigo não será mais usado para a solicitação atual
.ban()
Mudar e banir o proxy (deve ser usado quando o serviço bloqueia o trabalho por IP), o proxy será banido pelo tempo especificado nas configurações do scraper (proxybannedcleanup)
.get()
Obter o proxy atual (o último proxy com o qual a solicitação foi feita)
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false) - define o proxy para a próxima solicitação, o parâmetro noChange é opcional; se definido como true, o proxy não mudará entre as tentativas
yield this.captcha.*
Trabalho com captcha
.recognize()
yield this.captcha.recognize(preset, image, type, overrides) - carregamento de captcha para reconhecimento
image- dados binários da imagem para reconhecimentopreset- indica o preset para o
Util::AntiGatetypeespecifica um dos seguintes: 'jpeg', 'gif', 'png'
O resultado será um hash com os campos:
answer- texto da imagemid- id do captcha, para possibilidade futura de relatar erro através dereportBaderror- erro de texto, se answer não estiver definido
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides) - similar ao método anterior, mas o carregamento do captcha será realizado automaticamente pelo link (url), sem o uso de proxy
.reportBad()
yield this.captcha.reportBad(preset, id, overrides) - informar ao serviço que o captcha foi resolvido incorretamente
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data) - método para preenchimento automático de $pages.$i.data e $data, deve ser chamado para adicionar o conteúdo da página resultante
.urlFromHTML()
this.utils.urlFromHTML(url, base) - processa um link obtido de código HTML - decodifica entidades (& etc.), opcionalmente pode-se passar base - URL base (por exemplo, a URL da página de origem), permitindo obter o link completo
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain) - o método recebe como primeiro parâmetro um link e retorna o domínio desse link. O segundo parâmetro opcional determina se deve remover o subdomínio www do domínio. O padrão é 0 - ou seja, não remover.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url) - o método recebe como primeiro parâmetro um link e retorna o domínio desse link, sem subdomínios.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url) - o método recebe como primeiro parâmetro um link e retorna o domínio desse link, inclusive sem subdomínios. Funciona com todas as zonas regionais
.url.extractMaxPath()
this.utils.url.extractMaxPath(url) - o método recebe uma string e extrai uma URL dela
.url.extractWOParams()
this.utils.url.extractWOParams(url)- o método recebe um link e retorna o mesmo link cortado até a string de parâmetros. Ou seja, retornará a URL até o ?
.removeHtml()
this.utils.removeHtml(string) - o método recebe uma string e a retorna limpa
de tags html
.removeNoDigit()
this.utils.removeNoDigit(string) - o método recebe uma string, remove tudo exceto dígitos e retorna o resultado
.removeComma()
this.utils.removeComma(string) - o método recebe uma string, remove caracteres como .,\r\n e retorna o resultado
this.sessionManager.*
Para usar sessões no scraper JS, primeiro é necessário inicializar o Gerenciador de Sessões. Isso é feito usando a função init()
init() {
this.sessionManager.init({
//aqui você pode definir parâmetros adicionais
});
}
Em this.sessionManager.init() podem ser usados os seguintes parâmetros:
name- parâmetro opcional, permite redefinir o nome do scraper ao qual as sessões pertencem, por padrão é igual ao nome do scraper onde ocorre a inicializaçãocanChangeProxy- parâmetro opcional, possibilidade de mudar o proxy, por padrão é igual a 1domain- parâmetro opcional, indica para procurar sessões entre todas as salvas para este scraper (se o valor não for definido), ou apenas para um domínio específico (é necessário especificar o domínio com um ponto na frente, por exemplo.site.com)
Existem várias funções para trabalhar com sessões:
.get()
this.sessionManager.get() - obtém uma nova sessão, deve ser chamado antes de realizar a solicitação
.reset()
this.sessionManager.reset() - limpeza de cookies e obtenção de uma nova sessão. Deve ser chamado se a solicitação com a sessão atual não foi bem-sucedida.
.save()
this.sessionManager.save() - salvamento de uma sessão bem-sucedida ou salvamento de dados arbitrários na sessão
results.<array>.addElement()
O método results.<array>.addElement() permite preencher arrays em results de forma mais conveniente. Ao usá-lo, não é necessário lembrar a sequência de variáveis no array e listá-las manualmente.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
Métodos init() e destroy()
O método init() é chamado no início da tarefa, destroy() - na conclusão.
Exemplo de uso:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Links úteis
🔗 Exemplo de salvamento de arquivo no disco
Exemplo que demonstra como salvar arquivos diretamente no disco
🔗 Exemplo de trabalho com sessões
Uso da funcionalidade de sessões em scrapers JavaScript
🔗 Exemplo de salvamento de dados na sessão
Demonstração da possibilidade de armazenar dados arbitrários na sessão
🔗 Uso de results.addElement()
Exemplo de preenchimento de um array de dados usando results.addElement() e demonstração da diferença em relação ao .push() comum