레시피

파이썬 백링크 피인더: 40줄로 완성하는 프로스펙트 목록

경쟁사는 링크하지만 당신은 링크하지 않는 도메인을 찾고, 한 번의 호출로 점수를 매겨 CSV를 정렬하세요. 아래에 가상의 숫자를 사용한 실제 예시가 있습니다.

종이 위에 점을 연결하는 빨간 실과 드래프팅 도구들이 있는 작업대

코드 앞선 논리

세 가지 호출로 작업이 완료됩니다. intersect는 두 개에서 열 개까지의 도메인을 받아 여러 도메인에 링크하는 곳을 반환합니다. refdomains는 자신의 사이트에서 링크하는 도메인 집합을 제공하여 빼기 작업에 사용합니다. bulk_dr는 남은 도메인에 점수를 매깁니다.

실행당 비용은 미미하며, 이 산술 작업은 한 번만 수행해도 가치가 있습니다. intersect에 2크레딧, 자신의 목록에 2크레딧, 최대 2,000개 도메인 점수 매기기에 1크레딧이 필요합니다. 총 5크레딧은 $0.0005입니다.

순서가 중요합니다. 점수 매기기 전에 빼세요.

많은 사람이 먼저 모든 것을 점수 매기고 나중에 필터링합니다. 이는 역순입니다. 점수 매기기는 비용이 적게 들지만, CSV에 5만 행이 있으면 시간이 많이 낭비됩니다. 먼저 중복을 통해 목록을 줄이고, 남은 항목에 DR을 요청하세요. 전체 과정을 일반 딕셔너리로 유지하여 다음 실행에서 이전 결과를 재사용할 수 있게 하세요.

prospects.py

RIVALS의 도메인은 자리 표시자입니다. 필드명은 .get으로 읽으므로, 열에 의존하기 전에 자신의 실행에서 원본 행 하나를 확인하세요.

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')

실제 예시, 가상의 숫자

소규모 니치 블로그를 위한 가상의 실행; 실제 결과는 다를 수 있습니다
단계출력 행 수크레딧
3개 경쟁사 intersect640개 도메인2
자신의 참조 도메인 제외남은 410개2
410개에 bulk_dr 적용410개 점수 매김1
DR 20 이상 유지약 120개0
상위 30개 수동 확인30개 페이지 열기0

CSV에서 스팸 없이 outreach로

01

중복도 기준으로 정렬

여러 경쟁사에 링크하는 도메인은 귀하에게 링크할 주제적 이유가 있는 곳입니다. 먼저 배치하세요.

02

상위 30개 수동으로 열기

경쟁사에 링크하는 페이지를 확인하세요. 리소스 목록, 리뷰, 뉴스 항목인가요? 이러한 페이지 중 일부만 새 항목을 받습니다.

03

이유 한 줄 작성

귀하의 페이지가 경쟁사 페이지에 추가하는 가치를 설명하세요. 문장으로 표현할 수 없다면 해당 사이트는 건너뜁니다.

04

전송 기록 남기기

날짜, 연락처, 결과를 같은 CSV에 추가하고 커밋하세요. 다음 분기에는 자신을 칭찬하게 될 것입니다.

실수 및 수정

프로스펙팅 스크립트는 몇 가지 동일한 부분에서 실패합니다
실수왜 문제가 되는가수정
DR만으로 정렬하기대규모 디렉토리 및 스크레이퍼가 상위에 노출됨중복도 수를 먼저 정렬하고, DR을 두 번째로 정렬
임계값 이상의 모든 곳에 메일 보내기스팸처럼 읽히며, 신뢰도를 떨어뜨림상위 30개 수동으로 열기
URL 인코딩 수동으로쉼표와 슬래시가 쿼리를 깨뜨림urllib.parse.urlencode 사용
3,000개 도메인을 한 번에 전송2,000개 제한 초과목록을 청크로 나누고, 청크당 1크레딧
DR을 품질로 신뢰하기참조 도메인의 로그 스케일 카운트입니다판단 기준이 아닌 정렬 키로 취급
정원에서 햇빛을 공유하는 작은 관목 두 개와 큰 참나무 한 그루

독자를 공유하는 경쟁사 선택

경쟁사가 intersect의 결과를 결정합니다. 백링크 피인더는 제공된 목록의 질만큼만 우수합니다. 동일한 독자를 위한 3개 직접 경쟁사는 깨끗한 중복을 제공하지만, 모든 키워드로 랭크되는 대형 출판사는 귀하의 페이지에 대해 아무것도 말하지 않는 수천 개의 링크를 제공합니다.

자전거 수리에 대한 소규모 블로그를 운영한다고 가정해 봅시다. 경쟁사는 수리 블로그 두 개와 가이드 섹션이 강력한 매장 하나일 수 있습니다. 이는 훌륭한 세트입니다. 국가급 매체를 추가하면 목록은 자전거 블로그에 링크할 만한 페이지들로 가득 찹니다.

엔드포인트는 두 개에서 열 개까지의 도메인을 허용하므로 그 사이의 세트를 선택하세요. 기억할 수 있을 정도로 목록을 짧게 유지하세요. 짧은 목록은 방어하기 쉽습니다.

거대 허브가 집합을 오염시키는 이유

디렉토리 및 집계 사이트는 거의 모든 것에 링크합니다. 모든 intersect에 나타나며, 실제 관심으로 링크하는 몇몇 도메인을 묻어버립니다. 신뢰하기 전에 정렬된 목록의 상단을 읽어보세요.

간단한 제외 파일이 대부분의 문제를 해결합니다. 원하지 않는 도메인을 한 줄에 하나씩 텍스트 파일에 보관하세요. 집합으로 로드하고 점수 매기기 호출 전에 일치하는 항목을 제거하여 크레딧이 읽을 가치가 있는 후보에만 사용되게 하세요.

경쟁사와 자신의 사이트 분리하기

자신의 도메인은 경쟁사가 되면 안 됩니다. 당연해 보이지만, 오래된 프로젝트에서 복사한 목록에는 종종 자신이 포함되어 있으며, 그러면 intersect가 자신의 링크를 자신에게 다시 보고합니다.

경쟁사를 스크립트 상단의 config 딕셔너리에 넣고, 각 항목이 왜 있는지 주석을 달아두세요. 한 달 후에도 이유를 기억할 것이며, 레포지토리를 읽는 타인도 알 수 있습니다.

필터링하기 전 원본 행 읽기

코드는 .get으로 모든 필드를 읽으므로 누락된 키로 인해 실행이 중단되지 않습니다. 하지만 잘못된 키도 숨길 수 있습니다. 필터를 작성하기 전에 intersect에서 한 행을 출력하고 필드명과 각 값의 유형을 확인하세요.

텍스트로 도착하는 점수는 텍스트로 정렬되므로 9가 80 뒤에 옵니다. 호출 직후 숫자로 변환하면 나머지 스크립트는 단순하게 유지할 수 있습니다.

비교 전 도메인 정규화

같은 사이트가 한 목록에서는 www. 접두사와 함께, 다른 목록에서는 없이 표시될 수 있습니다. 비교 전에 모든 것을 소문자로 변환하고 접두어를 제거하세요. 그렇지 않으면 자신의 사이트가 새로운 후보로 보일 수 있습니다.

과거 목록에서 복사한 트레일링 슬래시와 여백 공백도 같은 문제를 일으킵니다. 한 줄 정리 함수는 한 번의 낭비된 점수 매기기 호출보다 비용이 적게 듭니다.

각 실행의 날짜별 사본 보관

각 실행을 날짜별 파일로 작성하고 이전 파일을 유지하세요. 그러면 새로운 후보와 이미 본 후보를 구분할 수 있으며, 경쟁사가 언제 새로운 곳에 링크하기 시작했는지 확인할 수 있습니다.

날짜별 파일은 이상한 결과를 디버깅하는 가장 쉬운 방법이기도 합니다. 두 파일을 나란히 열면 변화가 보통 명확합니다.

남은 항목만 점수 매기기

대량 호출은 한 번에 최대 2,000개 도메인을 처리하며 1크레딧이 필요합니다. 전체 intersect가 아닌 빼기 작업의 생존자를 전달하세요. 위의 가상의 실행에서 640행과 410행은 한 번 호출로 점수 매기기에 같은 비용이 들지만, 작은 목록이 훨씬 읽기 쉽습니다.

황동 추와 거친 바위가 각각의 접시에 놓인 돌 저울

피인더 실행 전 질문

이 작업의 일부에 대해 사람들이 가져오는 질문 대부분은 비용, 정렬 및 호출 실패 시 처리와 관련이 있습니다.

프로스펙트 목록 구축에 비용이 많이 들까요?

그다지 많이 들지 않습니다. 레시피는 intersect, refdomains, bulk_dr를 사용하므로, 표시된 크기로는 실행당 5크레딧, 즉 $0.0005입니다. 다음 달 재실행도 같은 비용이 듭니다. 실제 비용은 페이지를 읽는 데 소비되는 귀하의 시간입니다.

intersect를 DR로 정렬하고 끝내면 안 되는 이유는?

DR은 참조 도메인을 로그 스케일로 카운트합니다. 관련성과 무관하게 대형 디렉토리가 상위에 오므로, 먼저 중복으로 정렬하고 DR은 동점자 처리용으로 사용하세요. 주요 키로 사용하지 마세요.

CSV의 모든 곳에 outreach를 보낼 수 있나요?

보낼 수 있지만, 목록을 제대로 활용하지 못하는 것입니다. 경쟁사에 링크하는 페이지를 열고 새 항목이 적합한지 결정한 후 작성하세요. CSV는 단축 목록이지 메일링 리스트가 아닙니다.

어느 정도의 경쟁사로 시작해야 하나요?

3개가 좋은 시작점이며, intersect가 허용하는 두 개에서 열 개 범위 내에 있습니다. 첫 실행이 랭크할 만큼 충분한 행을 반환하지 않을 때만 추가하세요.

자신의 도메인에 아직 참조 도메인이 없다면 어떻게 하나요?

그러면 빼기 작업이 아무것도 제거하지 않으며, 모든 intersect 행이 후보가 됩니다. 이는 정확하지만 목록이 길어질 것입니다. 중복으로 줄이고 상위 30개를 수동으로 읽어보세요.

스크립트에 유료 키가 필요한가요?

네. intersect, refdomains, bulk_dr 호출은 크레딧 기준으로 요금이 책정됩니다. 무료 개요 액션은 키가 필요 없으며, $100 가입 크레딧은 이 크기의 많은 실행을 커버합니다.

첫 번째 메시지 전송 전

  • 후보 페이지를 열고 해당 페이지가 링크 목록이 아닌 경쟁사에 직접 링크하는지 확인하세요.
  • 페이지가 귀하의 키워드가 아닌 귀하의 독자에게 적합한지 확인하세요.
  • 이미 연락한 도메인을 제거하고 날짜를 옆에 기록하세요.
  • 귀하의 페이지가 추가하는 가치를 한 문장으로 작성하세요. 아니면 후보를 제외하세요.
  • 작은 배치로 전송하여 답장을 실제로 읽을 수 있게 하세요.

피인더를 일정대로 실행하기

프로스펙트 목록은 대부분의 사람이 예상하는 것보다 오래갑니다. 월간으로 충분합니다. 경쟁사의 새 링크는 월간 새로 고침으로 나타나므로, 몇 주마다 실행하면 대부분 포착할 수 있습니다. 주간 실행은 주로 지난 주 파일을 재생성하므로, 동일한 백링크 피인더가 잡음 없이 무인 실행될 수 있습니다.

현명한 리듬은 점수 매기기를 월간으로 하고, 각 실행 후 상위 행을 빠르게 확인하는 것입니다. 빼기 단계를 같은 작업 내에 유지하여 목록에 이미 보유한 항목이 포함되지 않게 하세요.

키를 파일에서 분리하기

스크립트는 키를 환경에서 읽으므로 레포지토리에 저장되지 않습니다. 스케줄러에서 LZ_KEY를 시크릿으로 설정하거나, git 외부에 유지되는 파일에서 내보내세요.

crontab 줄은 변수를 앞에 두고 같은 스크립트를 호출할 수 있습니다. 키를 저장한 파일의 서버 권한이 엄격하게 설정되어 있는지 확인하세요.

CSV 작성 전 실패 처리

401 또는 402은 실행을 중단해야 하며, false로 읽히는 ok 플래그도 마찬가지입니다. 코드는 파일이 열리기 전에 예외를 발생시키므로, 실패한 실행이 이전 CSV를 부분적인 것으로 덮어쓰지 않습니다.

각 실행과 함께 지출 기록하기

모든 응답에는 _credits가 포함되어 있으므로 작업 끝에 잔액을 출력하세요. 몇 달에 걸쳐 이 줄은 일정이 계획한 비용이 드는지, 그리고 루프가 페이지를 다시 가져오기 시작했는지 알려줍니다.

폴더의 파일 대신 데이터베이스에 기록을 원한다면 SQLite diff와 함께 사용하세요.

DR이 말할 수 있는 것과 말하지 못하는 것에 대한 조언

여기서 DR은 round(100 * log(ref_domains + 1) / log(20,000,000))입니다. 참조 도메수와 다른 요소 없이 상승합니다. 이를 염두에 두세요. 사이트가 55에 머물러 있어도 귀하에게 무용지물일 수 있습니다.

랭킹을 위해 사용하고, 그 다음 읽으세요. 사이트가 무엇을 발행하는지, 관련 없는 상점 수백 곳에 링크하는지, 최근 변경 사항이 있는지 확인하세요. 이러한 확인은 사이트당 몇 분 걸리며, 어떤 스크립트도 이를 대체할 수 없습니다.

목록이 정리되면 날짜별 파일로 보관하고 한 달 후 재실행하세요. Actions runbook은 스케줄링 방법을 보여주며, n8n 비교는 아웃리치 담당자가 선호하는 경우 코딩 없는 경로를 다룹니다.

속도 및 크기 참고

각 호출은 최대 1,000행을 반환하며 한 번 청구되므로, 5,000 intersect 행을 페이징하려면 10크레딧, 즉 $0.001이 필요합니다. 깊은 페이징은 50,000행에서 중단됩니다. Python에서 큰 목록을 정렬하는 대신 서버에서 sort와 order=desc를 사용하세요.