O principal objetivo dos rastreadores é coletar alguns dados específicos que estão disponíveis publicamente na Internet. Usando esses dados, podemos analisar algumas tendências e compará-las, ou treinar modelos para aprendizagem profunda, etc. Nesta edição, apresentaremos um pacote node.js
usado especificamente para rastreamento da web - node-crawler
, e o usaremos para concluir um caso simples de rastreador para rastrear imagens em páginas da web e baixá-las localmente.
node-crawler
é uma ferramenta rastreadora node.js
leve que leva em consideração a eficiência e a conveniência. Ele oferece suporte a sistemas rastreadores distribuídos, codificação rígida e agentes front-end http. Além disso, é inteiramente escrito em nodejs
e oferece suporte inerente a E/S assíncrona sem bloqueio, o que fornece grande conveniência para o mecanismo de operação do pipeline do rastreador. Ao mesmo tempo, ele suporta a seleção rápida de DOM
(você pode usar a sintaxe jQuery
), o que pode ser considerado um recurso matador para a tarefa de rastrear partes específicas de páginas da web. Não há necessidade de escrever expressões regulares à mão, o que melhora a eficiência do desenvolvimento do rastreador.
, primeiro criamos um novo projeto e criamos index.js como arquivo de entrada.
Em seguida, instale a biblioteca do crawler node-crawler
.
#PNPM pnpm adicionar rastreador #NPM rastreador npm i -S #fio yarn add crawler
e então use require
para apresentá-lo.
//index.js const Crawler = require("crawler");
// index.js deixe rastreador = novo rastreador({ tempo limite: 10000, jQuery: verdadeiro, }) function getImagens(uri) { crawler.queue({ uri, retorno de chamada: (err, res, concluído) => { se (errar) lançar errar; } }) }
A partir de agora começaremos a escrever um método para obter a imagem da página HTML. Depois que crawler
for instanciado, ele será usado principalmente para escrever links e métodos de retorno de chamada em sua fila. Esta função de retorno de chamada será chamada após cada solicitação ser processada.
Deve-se ressaltar aqui também que Crawler
utiliza a biblioteca request
, portanto a lista de parâmetros disponíveis para configuração Crawler
é um superconjunto dos parâmetros da biblioteca request
, ou seja, todas as configurações da biblioteca request
são aplicáveis ao Crawler
.
Talvez você também tenha visto o parâmetro jQuery
agora. Você adivinhou certo, ele pode usar a sintaxe jQuery
para capturar elementos DOM
.
//index.js deixe dados = [] function getImagens(uri) { crawler.queue({ uri, retorno de chamada: (err, res, concluído) => { se (errar) lançar errar; deixe $ = res.$; tentar { deixe $imgs = $("img"); Object.keys($imgs).forEach(index => { deixe img = $imgs[índice]; const { tipo, nome, atributos = {} } = img; deixe src = atributos.src || if (type === "tag" && src && !data.includes(src)) { deixe fileSrc = src.startsWith('http') ? deixe fileName = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // Como baixar imagens data.push(src) } }); } pegar (e) { console.erro(e); feito() } feito(); } }) }
Você pode ver que acabou de usar $
para capturar a tag img
na solicitação. Em seguida, usamos a seguinte lógica para processar o link para a imagem concluída e retirar o nome para que possa ser salvo e nomeado posteriormente. Aqui também é definido um array, sua finalidade é salvar o endereço da imagem capturada. Caso o mesmo endereço da imagem seja encontrado na próxima captura, o download não será processado repetidamente.
A seguir estão as informações impressas usando $("img")
para capturar o HTML da página inicial do Nuggets:
baixar a imagem,
precisamos instalar um pacote nodejs
- axios
Sim, você leu certo, axios
não é fornecido apenas para o front-end, ele também pode ser usado pelo back-end. Mas como o download de imagens precisa ser processado em um fluxo de dados, responseType
é definido como stream
. Então você pode usar o método pipe
para salvar o arquivo de fluxo de dados.
const { padrão: axios } = require("axios"); const fs = requer('fs'); função assíncrona downloadFile(uri, nome) { deixe dir = "./imgs" if (!fs.existsSync(dir)) { aguarde fs.mkdirSync(dir) } deixe filePath = `${dir}/${nome}` deixe res = aguardar axios({ url: uri, tipo de resposta: 'fluxo' }) deixe ws = fs.createWriteStream(filePath) res.data.pipe(ws) res.data.on("fechar",()=>{ close(); }) }
Como pode haver muitas imagens, se você quiser colocá-las em uma pasta, será necessário determinar se essa pasta existe. Caso contrário, crie uma. Em seguida, use o método createWriteStream
para salvar o fluxo de dados obtido na pasta na forma de um arquivo.
Então podemos tentar. Por exemplo, capturamos a imagem no html da página inicial do Nuggets:
// index.js.Depois de executar
getImages("https://juejin.cn/"),
você descobrirá que todas as imagens no HTML estático foram capturadas.
nó index.js
Conclusão
No final, você também pode ver que este código pode não funcionar para SPA (Single Page Application). Como há apenas um arquivo HTML em um aplicativo de página única e todo o conteúdo da página da web é renderizado dinamicamente, ele permanece o mesmo, não importa o que aconteça, você pode lidar diretamente com sua solicitação de dados para coletar as informações desejadas. .
Outra coisa a dizer é que muitos amigos usam request.js
para processar solicitações de download de imagens. Claro que isso é possível, e até a quantidade de código é menor, porém, o que quero dizer é que essa biblioteca já foi utilizada. em 2020. Está obsoleto. É melhor mudar para uma biblioteca que é constantemente atualizada e mantida.