Công cụ tìm backlink bằng Python: danh sách khách hàng tiềm năng trong bốn mươi dòng
Tìm các tên miền liên kết đến đối thủ của bạn nhưng không liên kết đến bạn, chấm điểm chúng trong một lần gọi và sắp xếp CSV. Một ví dụ chi tiết với các số liệu giả định được trình bày bên dưới.
Đội ngũ biên tập Linkzoid ·
Logic trước khi viết mã
Ba lệnh gọi là đủ để hoàn thành nhiệm vụ. intersect nhận từ hai đến mười tên miền và trả về những tên miền liên kết đến nhiều tên miền trong số đó. refdomains trên trang của bạn cung cấp tập hợp cần trừ đi. Sau đó, bulk_dr sẽ chấm điểm những gì còn lại.
Chi phí cho mỗi lần chạy rất thấp, và phép tính này đáng để thực hiện một lần. Hai credit cho lệnh intersect, hai credit cho danh sách của riêng bạn, một credit để chấm điểm tối đa 2.000 tên miền. Năm credit tương đương $0.0005.
Thứ tự thực hiện rất quan trọng. Hãy trừ đi trước khi chấm điểm.
Mọi người thường chấm điểm tất cả trước rồi mới lọc sau. Cách làm này ngược lại. Chấm điểm tốn ít chi phí, nhưng nó lãng phí rất nhiều thời gian khi CSV có tới năm mươi nghìn dòng. Hãy cắt giảm danh sách dựa trên sự trùng lặp trước, yêu cầu DR cho những tên miền còn lại, và giữ toàn bộ dữ liệu trong một dict đơn giản để lần chạy sau có thể tái sử dụng kết quả của ngày hôm qua.
prospects.py
Các tên miền trong RIVALS chỉ là giá trị giả định. Tên trường được đọc bằng .get, vì vậy hãy kiểm tra một dòng thô từ lần chạy của chính bạn trước khi dựa vào một cột cụ thể.
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')
Ví dụ chi tiết, số liệu giả định
Lần chạy giả định cho một blog nhỏ trong một ngách cụ thể; kết quả của bạn sẽ khác
Bước
Số dòng đầu ra
Credit
Giao thoa của 3 đối thủ
640 tên miền
2
Trừ đi các tên miền liên kết đến chính bạn
Còn lại 410
2
bulk_dr cho 410 tên miền
410 tên miền đã được chấm điểm
1
Giữ lại những tên miền có DR từ 20 trở lên
khoảng 120
0
Kiểm tra thủ công 30 tên miền hàng đầu
30 trang đã được mở
0
Từ CSV đến chiến dịch tiếp cận, mà không làm spam bất kỳ ai
01
Sắp xếp theo mức độ giao thoa
Các tên miền liên kết đến hai hoặc ba đối thủ của bạn là những ứng viên có lý do chuyên môn để liên kết đến bạn. Hãy đặt chúng lên đầu danh sách.
02
Mở thủ công 30 tên miền hàng đầu
Hãy xem xét trang web liên kết đến đối thủ. Đó có phải là danh sách tài nguyên, bài đánh giá, hay tin tức? Chỉ một số trang trong số này chấp nhận thêm mục mới.
03
Viết một dòng lý do
Hãy nêu rõ trang của bạn đóng góp điều gì mà trang của đối thủ chưa có. Nếu không thể diễn đạt điều đó trong một câu, hãy bỏ qua trang web đó.
04
Ghi lại những gì bạn đã gửi
Thêm các cột ngày tháng, liên hệ và kết quả vào cùng một CSV, và commit nó. Vào quý sau, bạn sẽ cảm ơn chính mình vì điều đó.
Lỗi và cách khắc phục
Các kịch bản tìm kiếm khách hàng tiềm năng thường gặp lỗi ở một vài điểm tương tự
Lỗi
Tại sao nó gây hại
Cách khắc phục
Sắp xếp chỉ dựa trên DR
Các trang web danh mục lớn và công cụ thu thập dữ liệu nổi lên ở đầu danh sách
Sắp xếp theo số lượng giao thoa trước, DR sau
Gửi email cho tất cả các tên miền vượt quá ngưỡng cắt
Trông giống như spam, làm mất thiện chí
Mở thủ công 30 tên miền hàng đầu
Mã hóa URL bằng tay
Dấu phẩy và dấu gạch chéo làm hỏng truy vấn
Sử dụng urllib.parse.urlencode
Gửi 3.000 tên miền trong một lần gọi
Vượt quá giới hạn 2.000
Chia nhỏ danh sách, một credit cho mỗi chunk
Tin tưởng DR như một chỉ số chất lượng
Đây là một phép đếm theo thang logarit của các tên miền liên kết
Hãy coi nó như một khóa sắp xếp, không phải là một phán quyết cuối cùng
Lựa chọn các đối thủ chia sẻ độc giả của bạn
Các đối thủ quyết định kết quả của phép giao thoa. Một công cụ tìm backlink chỉ tốt bằng danh sách bạn cung cấp cho nó. Ba đối thủ cạnh tranh trực tiếp cùng một nhóm độc giả sẽ tạo ra sự trùng lặp rõ ràng, trong khi một nhà xuất bản lớn xếp hạng cho mọi thứ sẽ mang lại cho bạn hàng nghìn liên kết không nói lên điều gì về trang web của bạn.
Giả sử bạn điều hành một blog nhỏ về sửa xe đạp. Các đối thủ của bạn có thể là hai blog sửa chữa và một cửa hàng có phần hướng dẫn mạnh mẽ. Đó là một bộ dữ liệu tốt. Nếu thêm một tờ báo quốc gia, danh sách sẽ đầy những trang web sẽ không bao giờ liên kết đến một blog về xe đạp.
Từ hai đến mười tên miền là phạm vi mà endpoint chấp nhận, vì vậy hãy chọn bộ dữ liệu nằm trong khoảng đó. Hãy giữ danh sách đủ ngắn để bạn có thể nhớ tên từng đối thủ. Danh sách ngắn dễ bảo vệ hơn.
Tại sao các trung tâm lớn làm ô nhiễm tập hợp dữ liệu
Các trang web danh mục và trang tổng hợp liên kết đến hầu hết mọi thứ. Chúng xuất hiện trong mọi phép giao thoa và chôn vùi số ít tên miền liên kết ra ngoài vì sự quan tâm thực sự. Hãy đọc đầu danh sách đã sắp xếp trước khi tin tưởng nó.
Một tệp loại trừ đơn giản sẽ khắc phục phần lớn vấn đề này. Hãy giữ các tên miền bạn không bao giờ muốn xuất hiện trong một tệp văn bản, mỗi tên miền một dòng. Tải nó vào một set và loại bỏ các kết quả trùng khớp trước khi gọi chấm điểm, để credit chỉ dành cho các ứng viên đáng để đọc.
Giữ riêng đối thủ và trang web của bạn
Tên miền của chính bạn không bao giờ nên là một đối thủ. Nghe có vẻ hiển nhiên, nhưng một danh sách sao chép từ một dự án cũ thường mang theo nó, và sau đó phép giao thoa báo cáo các liên kết của chính bạn trở lại với bạn.
Hãy đặt các đối thủ trong một dict cấu hình ở đầu kịch bản, kèm theo một ghi chú về lý do tại sao mỗi tên miền lại ở đó. Tháng sau, bạn sẽ nhớ lý do đó, và một người lạ đọc repo cũng sẽ hiểu.
Đọc các dòng thô trước khi lọc
Mã đọc mọi trường bằng .get, điều này ngăn lỗi khi thiếu khóa. Nó cũng che giấu một khóa sai. Hãy in một dòng từ kết quả giao thoa trước khi viết bất kỳ bộ lọc nào, và kiểm tra tên trường cũng như kiểu của từng giá trị.
Một điểm số được trả về dưới dạng văn bản sẽ được sắp xếp theo kiểu văn bản, vì vậy 9 sẽ đứng sau 80. Hãy chuyển đổi nó sang số ngay sau khi gọi, và phần còn lại của kịch bản có thể giữ nguyên sự đơn giản.
Chuẩn hóa tên miền trước khi so sánh
Cùng một trang web có thể xuất hiện với tiền tố www. trong một danh sách và không có tiền tố đó trong danh sách khác. Hãy viết thường hóa mọi thứ và loại bỏ tiền tố trước khi so sánh các tập hợp. Nếu không, trang web của chính bạn có thể trông giống như một ứng viên mới.
Dấu gạch chéo cuối cùng và khoảng trắng thừa từ một danh sách dán gây ra cùng một vấn đề. Một hàm làm sạch một dòng tốn ít hơn một lần gọi chấm điểm bị lãng phí.
Giữ một bản sao có ngày tháng của mỗi lần chạy
Hãy ghi mỗi lần chạy vào một tệp có ngày tháng, và giữ lại tệp trước đó. Bạn có thể phân biệt các ứng viên mới với những ứng viên bạn đã từng thấy, và xem khi nào đối thủ bắt đầu liên kết đến một nơi mới.
Các tệp có ngày tháng cũng là cách dễ nhất để gỡ lỗi một kết quả kỳ lạ. Mở hai tệp cạnh nhau và sự thay đổi thường rất rõ ràng.
Chỉ chấm điểm những gì còn lại sau khi lọc
Lệnh gọi hàng loạt nhận tối đa 2.000 tên miền với một credit. Hãy truyền cho nó những ứng viên còn lại sau khi trừ đi, không phải toàn bộ kết quả giao thoa. Trong ví dụ giả định ở trên, 640 dòng và 410 dòng đều tốn cùng một chi phí để chấm điểm trong một lần gọi, nhưng danh sách nhỏ hơn dễ đọc hơn nhiều.
Câu hỏi trước khi chạy công cụ tìm kiếm
Hầu hết các câu hỏi mà mọi người đặt ra cho phần công việc này đều quy về chi phí, cách sắp xếp và những gì xảy ra khi một lệnh gọi thất bại.
Xây dựng danh sách khách hàng tiềm năng có tốn nhiều chi phí không?
Không nhiều. Công thức sử dụng intersect, refdomains và bulk_dr, vì vậy năm credit cho mỗi lần chạy với kích thước được hiển thị, tương đương $0.0005. Một lần chạy lại vào tháng sau cũng tốn cùng một chi phí. Thời gian của chính bạn, dành để đọc các trang web, mới là chi phí thực sự.
Tại sao không sắp xếp kết quả giao thoa theo DR và dừng lại ở đó?
DR đếm các tên miền liên kết theo thang logarit. Các trang web danh mục lớn sẽ nổi lên ở đầu danh sách bất kể mức độ liên quan của chúng, vì vậy hãy sắp xếp theo sự giao thoa trước và sử dụng DR làm bộ phá vỡ thế bế tắc, không phải khóa chính.
Tôi có thể gửi email tiếp cận cho tất cả các tên miền trong CSV không?
Bạn có thể, nhưng đó là một cách sử dụng danh sách kém hiệu quả. Hãy mở trang web liên kết đến đối thủ, quyết định xem một mục mới có phù hợp không, và sau đó mới viết email. CSV là danh sách rút gọn, không phải danh sách gửi thư.
Tôi nên bắt đầu với bao nhiêu đối thủ?
Ba là một điểm khởi đầu tốt, nằm trong phạm vi từ hai đến mười mà lệnh intersect chấp nhận. Chỉ thêm nhiều hơn khi lần chạy đầu tiên trả về quá ít dòng để xếp hạng.
Nếu tên miền của chính tôi chưa có tên miền nào liên kết đến thì sao?
Khi đó, phép trừ sẽ không loại bỏ gì, và mọi dòng giao thoa đều trở thành ứng viên. Điều đó đúng, nhưng danh sách sẽ dài. Hãy cắt giảm nó bằng sự giao thoa và đọc thủ công 30 tên miền hàng đầu.
Kịch bản có cần khóa trả phí không?
Có. Các lệnh gọi intersect, refdomains và bulk_dr được tính phí theo credit. Hành động xem tổng quan miễn phí không cần khóa, và khoản tín dụng đăng ký $100 sẽ bao phủ nhiều lần chạy có kích thước như vậy.
Trước khi gửi bất kỳ tin nhắn nào
Mở trang ứng viên và xác nhận rằng nó liên kết đến đối thủ, không chỉ liên kết đến một danh sách các liên kết.
Hãy kiểm tra xem trang web đó có phù hợp với độc giả của bạn, không chỉ với từ khóa của bạn.
Loại bỏ bất kỳ tên miền nào bạn đã liên hệ trước đó, và ghi lại ngày bên cạnh nó.
Viết một câu về điều mà trang web của bạn đóng góp, hoặc loại bỏ ứng viên đó.
Gửi theo từng lô nhỏ, để các phản hồi thực sự có thể được đọc.
Chạy công cụ tìm kiếm theo lịch trình
Danh sách khách hàng tiềm năng ít lỗi thời hơn nhiều người mong đợi. Hàng tháng là đủ. Các liên kết mới từ đối thủ xuất hiện với bản cập nhật hàng tháng, vì vậy một lần chạy mỗi vài tuần sẽ bắt được hầu hết chúng. Các lần chạy hàng tuần chủ yếu tái tạo tệp của tuần trước, đó là lý do tại sao cùng một công cụ tìm backlink có thể chạy không giám sát mà không gây nhiều tiếng ồn.
Nhịp điệu hợp lý là chấm điểm hàng tháng và xem nhanh các dòng đầu tiên sau mỗi lần chạy. Hãy giữ bước trừ đi trong cùng một công việc, để danh sách không bao giờ bao gồm những gì bạn đã có.
Giữ khóa ra khỏi tệp
Kịch bản đọc khóa từ môi trường, vì vậy nó không bao giờ nằm trong repo. Đặt LZ_KEY dưới dạng bí mật trong bộ lập lịch của bạn, hoặc xuất nó từ một tệp nằm ngoài git.
Một dòng crontab có thể gọi cùng một kịch bản với biến được đặt ở phía trước. Hãy kiểm tra xem tệp chứa khóa có quyền hạn chế chặt chẽ trên máy chủ hay không.
Xử lý lỗi trước khi ghi CSV
Mã 401 hoặc 402 nên dừng quá trình chạy, cũng như cờ ok đọc là false. Mã sẽ raise trước khi tệp được mở, vì vậy một lần chạy thất bại sẽ không ghi đè lên CSV của ngày hôm qua bằng một tệp bị thiếu dữ liệu.
Ghi lại chi tiêu với mỗi lần chạy
Mỗi phản hồi đều có _credits, vì vậy hãy in số dư vào cuối công việc. Trong vài tháng, dòng đó sẽ cho bạn biết liệu một lịch trình có tốn kém như bạn dự kiến hay không, và liệu một vòng lặp có bắt đầu lấy lại các trang web hay không.
Kết hợp nó với SQLite diff nếu bạn muốn lịch sử trong cơ sở dữ liệu thay vì một thư mục tệp.
Một lời về những gì DR có thể và không thể nói
DR ở đây là round(100 * log(ref_domains + 1) / log(20,000,000)). Nó tăng lên khi có thêm các tên miền liên kết và không có yếu tố nào khác. Hãy nhớ điều đó. Một trang web có thể ở mức 55 và vẫn vô dụng đối với bạn.
Hãy sử dụng nó để xếp hạng, sau đó đọc. Hãy xem trang web đó xuất bản những gì, liệu nó có liên kết đến hàng trăm cửa hàng không liên quan hay không, và liệu có bất kỳ thay đổi nào gần đây trên đó hay không. Những kiểm tra này tốn một phút cho mỗi trang web, và không có kịch bản nào thay thế được chúng.
Một khi danh sách đã sạch, hãy giữ nó dưới dạng một tệp có ngày tháng và chạy lại sau một tháng. Sách hướng dẫn Actions cho thấy cách lên lịch nó, và so sánh n8n bao gồm phương pháp không cần mã nếu người phụ trách tiếp cận của bạn thích nó.
Ghi chú về tỷ lệ và kích thước
Mỗi lệnh gọi trả về tối đa 1.000 dòng và được tính phí một lần, vì vậy việc phân trang qua 5.000 dòng giao thoa tốn 10 credit, hoặc $0.001. Phân trang sâu dừng lại ở 50.000 dòng. Hãy sử dụng sort và order=desc trên máy chủ thay vì sắp xếp một danh sách lớn trong Python sau đó.