Receita

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.

Banco de oficina com ferramentas de rascunho e um fio vermelho conectando pontos no papel

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
EtapaLinhas de saídaCréditos
Interseção de 3 concorrentes640 domínios2
Menos seus domínios de referência próprios410 restantes2
bulk_dr nos 410410 pontuados1
Mantenha DR 20 e acimacerca de 1200
Verificação manual dos 30 primeiros30 páginas abertas0

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
ErroPor que prejudicaCorreção
Ordenar apenas por DRGrandes diretórios e scrapers aparecem no topoOrdene por contagem de interseção primeiro, DR segundo
Enviar e-mail para tudo acima de um limiteParece spam, custa credibilidadeAbra os 30 primeiros manualmente
Codificação URL manualmenteVírgulas e barras quebram a consultaUse urllib.parse.urlencode
Enviando 3.000 domínios em uma chamadaAcima do limite de 2.000Divida a lista, um crédito por chunk
Confiar no DR como qualidadeÉ uma contagem em escala logarítmica de domínios de referênciaTrate-o como uma chave de ordenação, não como um veredito
Dois pequenos arbustos e um grande carvalho compartilhando luz solar em um jardim

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.

Balança de pedra com um peso de latão e uma pedra bruta em bandejas separadas

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.