Buscador de backlinks em Python: uma lista de prospectos em quarenta linhas
Encontre domínios que linkam para seus concorrentes, mas não para você, pontue-os em uma única chamada e ordene o CSV. Um exemplo prático com números hipotéticos está abaixo.
Equipe editorial do Linkzoid ·
A lógica antes do código
Três chamadas resolvem o problema. intersect recebe de dois a dez domínios e retorna quem linka para vários deles. refdomains no seu próprio site fornece o conjunto a subtrair. bulk_dr então pontua o que restar.
O custo por execução é mínimo, e a matemática vale a pena ser feita uma vez. Dois créditos para a interseção, dois para a sua própria lista, um para pontuar até 2.000 domínios. Cinco créditos equivalem a $0.0005.
A ordem importa. Subtraia antes de pontuar.
As pessoas frequentemente pontuam tudo primeiro e filtram depois. Isso é o contrário do ideal. Pontuar custa pouco, mas desperdiça muito tempo quando o CSV tem cinquenta mil linhas. Reduza a lista pela interseção primeiro, peça o DR aos sobreviventes e mantenha tudo em um dicionário simples para que uma segunda execução possa reutilizar o resultado de ontem.
prospects.py
Os domínios em RIVALS são marcadores. Os nomes dos campos são lidos com .get, então verifique uma linha bruta da sua própria execução antes de confiar em uma coluna.
python
import csv, json, os, urllib.request as u, urllib.parse as p
KEY = os.environ['LZ_KEY']
ME = 'mysite.example'
RIVALS = ['rival-a.example', 'rival-b.example', 'rival-c.example']
def get(**kw):
q = p.urlencode(kw)
with u.urlopen(f'https://linkzoid.pro/api.php?{q}&key={KEY}', timeout=30) as r:
d = json.load(r)
if not d['ok']:
raise SystemExit(d)
return d
gap = get(action='intersect', q=','.join(RIVALS), per=1000)['rows']
mine = {r.get('domain') for r in get(action='refdomains', q=ME, per=1000)['rows']}
fresh = [r.get('domain') for r in gap if r.get('domain') not in mine]
scores = get(action='bulk_dr', domains=','.join(fresh[:2000]))['rows']
with open('prospects.csv', 'w', newline='') as f:
wr = csv.writer(f)
for row in scores:
wr.writerow([row.get('domain'), row.get('dr')])
print(len(fresh), 'candidates')
Exemplo prático, números hipotéticos
Execução inventada para um blog de nicho pequeno; a sua será diferente
Etapa
Linhas de saída
Créditos
Interseção de 3 concorrentes
640 domínios
2
Menos seus domínios de referência próprios
410 restantes
2
bulk_dr nos 410
410 pontuados
1
Mantenha DR 20 e acima
cerca de 120
0
Verificação manual dos 30 primeiros
30 páginas abertas
0
Do CSV ao outreach, sem spam para ninguém
01
Ordenar por interseção
Domínios que linkam para dois ou três dos seus concorrentes são aqueles com uma razão temática para linkar para você. Coloque-os primeiro.
02
Abrir trinta manualmente
Olhe para a página que linka para o concorrente. É uma lista de recursos, uma revisão, uma notícia? Apenas algumas dessas aceitam uma nova entrada.
03
Escreva uma linha de justificativa
Diga o que a sua página adiciona que a página do concorrente não tem. Se você não consegue dizer isso em uma frase, pule esse site.
04
Registre o que você enviou
Adicione colunas para data, contato e resultado ao mesmo CSV e faça o commit. No próximo trimestre, você agradecerá a si mesmo.
Erros e correções
Scripts de prospecção falham nos mesmos poucos lugares
Erro
Por que prejudica
Correção
Ordenar apenas por DR
Grandes diretórios e scrapers aparecem no topo
Ordene por contagem de interseção primeiro, DR segundo
Enviar e-mail para tudo acima de um limite
Parece spam, custa credibilidade
Abra os 30 primeiros manualmente
Codificação URL manualmente
Vírgulas e barras quebram a consulta
Use urllib.parse.urlencode
Enviando 3.000 domínios em uma chamada
Acima do limite de 2.000
Divida a lista, um crédito por chunk
Confiar no DR como qualidade
É uma contagem em escala logarítmica de domínios de referência
Trate-o como uma chave de ordenação, não como um veredito
Escolhendo concorrentes que compartilham seu leitor
Os concorrentes decidem o que a interseção retorna. Um buscador de backlinks é tão bom quanto a lista que você alimenta. Três concorrentes diretos para o mesmo leitor dão uma interseção limpa, enquanto um editor enorme que rankeia para tudo te dá milhares de links que não dizem nada sobre a sua página.
Digamos que você administre um pequeno blog sobre reparo de bicicletas. Seus concorrentes podem ser dois blogs de reparo e uma loja com uma seção de guias forte. Esse é um conjunto bom. Adicione um veículo nacional e a lista se enche de páginas que nunca linkariam para um blog de bicicletas.
De dois a dez domínios é a janela que o endpoint aceita, então escolha o conjunto dentro disso. Mantenha a lista curta o suficiente para que você possa nomear cada concorrente de memória. Listas curtas são mais fáceis de defender.
Por que hubs gigantes poluem o conjunto
Diretórios e agregadores linkam para quase tudo. Eles aparecem em todas as interseções e enterram a pequena quantidade de domínios que linkam por interesse real. Leia o topo da lista ordenada antes de confiar nela.
Um arquivo de exclusão simples corrige a maioria disso. Mantenha os domínios que você nunca quer em um arquivo de texto, um por linha. Carregue-o em um conjunto e remova as correspondências antes da chamada de pontuação, para que os créditos sejam gastos apenas em candidatos dignos de leitura.
Mantendo concorrentes e seu próprio site separados
Seu próprio domínio nunca deve ser um concorrente. Parece óbvio, mas uma lista copiada de um projeto antigo frequentemente a carrega junto, e então a interseção relata seus próprios links de volta para você.
Coloque os concorrentes em um dicionário de configuração no início do script, com um comentário sobre por que cada um está lá. No próximo mês, você lembrará do motivo, e um estranho que ler o repositório também.
Lendo as linhas brutas antes de filtrar
O código lê todos os campos com .get, o que impede que uma chave ausente quebre a execução. Isso também esconde uma chave errada. Imprima uma linha da interseção antes de escrever qualquer filtro e olhe para os nomes dos campos e o tipo de cada valor.
Uma pontuação que chega como texto é ordenada como texto, então 9 fica depois de 80. Converta para um número uma vez, logo após a chamada, e o resto do script pode permanecer simples.
Normalizar domínios antes de comparar
O mesmo site pode aparecer com um prefixo www. em uma lista e sem ele em outra. Coloque tudo em minúsculas e remova o prefixo antes de comparar conjuntos. Caso contrário, seu próprio site pode parecer um novo candidato.
Barras finais e espaços estranhos de uma lista colada causam o mesmo problema. Uma função de limpeza de uma linha custa menos do que uma chamada de pontuação desperdiçada.
Mantenha uma cópia datada de cada execução
Escreva cada execução em um arquivo datado e mantenha o anterior. Você pode então distinguir novos candidatos daqueles que você já viu, e ver quando um concorrente começou a linkar em algum lugar novo.
Arquivos datados também são a maneira mais fácil de depurar um resultado estranho. Abra os dois arquivos lado a lado e a mudança geralmente é óbvia.
Pontue apenas o que sobrevive
A chamada em massa aceita até 2.000 domínios por um crédito. Passe a ela os sobreviventes da subtração, nunca a interseção completa. No exemplo inventado acima, 640 linhas e 410 linhas custam o mesmo para pontuar em uma chamada, mas a lista menor é muito mais fácil de ler.
Perguntas antes de executar o buscador
A maioria das perguntas que as pessoas trazem para esta parte do trabalho se resume a custo, ordenação e o que acontece quando uma chamada falha.
Uma lista de prospectos custa muito para construir?
Não muito. A receita usa intersect, refdomains e bulk_dr, então cinco créditos por execução no tamanho mostrado, que é $0.0005. Uma reexecução no próximo mês custará o mesmo. Seu próprio tempo, gasto lendo páginas, é o custo real.
Por que não ordenar a interseção por DR e parar por aí?
DR conta domínios de referência em uma escala logarítmica. Grandes diretórios aparecem no topo independentemente de sua relevância, então ordene por interseção primeiro e use DR como desempate, não como chave principal.
Posso enviar outreach para tudo no CSV?
Você pode, mas é um mau uso da lista. Abra a página que linka para o concorrente, decida se uma nova entrada se encaixa e só então escreva. O CSV é uma lista curta, não uma lista de e-mails.
Com quantos concorrentes devo começar?
Três é um bom começo, dentro da faixa de dois a dez que a interseção aceita. Adicione mais apenas quando a primeira execução retornar linhas demais para rankear.
E se meu próprio domínio ainda não tiver domínios de referência?
Então a subtração não remove nada, e cada linha de interseção se torna um candidato. Isso está correto, mas a lista será longa. Reduza-a pela interseção e leia os trinta primeiros manualmente.
O script precisa de uma chave paga?
Sim. As chamadas intersect, refdomains e bulk_dr são precificadas por crédito. A ação de visão geral gratuita não precisa de chave, e o crédito de inscrição de $100 cobre muitas execuções desse tamanho.
Antes de uma única mensagem ser enviada
Abra a página candidata e confirme que ela linka para o concorrente, não apenas para uma lista de links.
Verifique se a página se adequa ao seu leitor, não apenas à sua palavra-chave.
Remova qualquer domínio que você já tenha contatado e registre a data ao lado.
Escreva uma frase sobre o que sua página adiciona, ou descarte o candidato.
Envie em pequenos lotes, para que as respostas possam ser realmente lidas.
Executando o buscador em um agendamento
Listas de prospectos ficam desatualizadas mais lentamente do que a maioria das pessoas espera. Mensalmente é suficiente. Novos links de um concorrente aparecem com a atualização mensal, então uma execução a cada poucas semanas captura a maioria deles. Execuções semanais principalmente reproduzem o arquivo da semana passada, é por isso que o mesmo buscador de backlinks pode ser executado sem supervisão sem muito ruído.
O ritmo sensato é mensal para a pontuação e uma rápida olhada nas linhas superiores após cada execução. Mantenha a etapa de subtração dentro do mesmo trabalho, para que a lista nunca inclua o que você já possui.
Mantenha a chave fora do arquivo
O script lê a chave do ambiente, então ela nunca fica no repositório. Defina LZ_KEY como um segredo no seu agendador, ou exporte-a de um arquivo que fique fora do git.
Uma linha de crontab pode chamar o mesmo script com a variável definida na frente. Verifique se o arquivo que contém a chave tem permissões restritas no servidor.
Falhar antes de escrever o CSV
Um 401 ou um 402 deve interromper a execução, assim como uma flag ok que lê false. O código levanta uma exceção antes do arquivo ser aberto, então uma execução falhada nunca substitui o CSV de ontem por um parcial.
Registre o gasto com cada execução
Cada resposta carrega _credits, então imprima o saldo no final do trabalho. Ao longo de alguns meses, essa linha mostra se um agendamento custa o que você planejou e se um loop começou a buscar páginas novamente.
Combine-o com o SQLite diff se quiser o histórico em um banco de dados em vez de uma pasta de arquivos.
Uma palavra sobre o que DR pode e não pode dizer
DR aqui é round(100 vezes log(ref_domains + 1) sobre log(20.000.000)). Ele aumenta com domínios de referência e nada mais. Tenha isso em mente. Um site pode ficar em 55 e ainda ser inútil para você.
Use-o para ranquear, depois leia. Olhe o que o site publica, se ele linka para uma centena de lojas não relacionadas e se algo nele mudou recentemente. Essas verificações levam um minuto por site, e nenhum script as substitui.
Assim que a lista estiver limpa, mantenha-a como um arquivo datado e reexecute em um mês. O manual de ações mostra como agendá-lo, e a comparação n8n cobre a rota sem código se sua pessoa de outreach preferir.
Notas de taxa e tamanho
Cada chamada retorna até 1.000 linhas e é cobrada uma vez, então navegar por 5.000 linhas de interseção custa 10 créditos, ou $0.001. A paginação profunda para em 50.000 linhas. Use sort e order=desc no servidor em vez de ordenar uma lista enorme no Python depois.