أداة العثور على الروابط الخلفية بلغة بايثون: قائمة عملاء محتملين في أربعين سطرًا
العثور على النطاقات التي تربط بخصومك ولكن لا تربط بك، وتقييمها في استدعاء واحد، وترتيب ملف CSV. يوجد مثال عملي بأرقام افتراضية أدناه.
فريق التحرير في Linkzoid ·
المنطق قبل الكود
ثلاثة استدعاءات تؤدي المهمة. يأخذ intersect من مجالين إلى عشرة نطاقات ويعيد من يربط بعدة منها. يعطي refdomains على موقعك الخاص المجموعة للطرح. ثم يقوم bulk_dr بتقييم ما تبقى.
التكلفة لكل تشغيل ضئيلة، والحساب الجبري يستحق إجراؤه مرة واحدة. ائتمانان لعملية التقاطع، ائتمانان لقائمتك الخاصة، ائتمان واحد لتقييم ما يصل إلى 2,000 نطاق. خمسة ائتمانات تساوي $0.0005.
الترتيب مهم. اطرح قبل أن تقيم.
غالبًا ما يقيم الجميع كل شيء أولاً ثم يفلترون لاحقًا. هذا عكس الصحيح. التكلفة ضئيلة، لكنه يضيع الكثير من الوقت عندما يحتوي ملف CSV على خمسين ألف سطر. قلل القائمة من خلال التداخل أولاً، اطلب 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 منافسين
640 نطاقًا
2
ناقص النطاقات المرجعية الخاصة بك
410 متبقية
2
bulk_dr على الـ 410
410 تم تقييمها
1
الاحتفاظ بـ DR 20 وما فوق
حوالي 120
0
فحص يدوي لأفضل 30
30 صفحة تم فتحها
0
من CSV إلى التواصل، دون إرسال رسائل عشوائية
01
الترتيب حسب التداخل
النطاقات التي تربط باثنين أو ثلاثة من منافسيك هي تلك التي لديها سبب موضوعي للربط بك. ضعها في المقدمة.
02
افتح ثلاثين يدويًا
انظر إلى الصفحة التي تربط بالمنافس. هل هي قائمة موارد، مراجعة، خبر؟ فقط بعض هذه تقبل إدخالًا جديدًا.
03
اكتب سببًا في سطر واحد
قل ما تضيفه صفحتك الذي لا تضيفه صفحة المنافس. إذا لم تتمكن من قوله في جملة، تخطى ذلك الموقع.
04
سجل ما أرسلته
أضف أعمدة للتاريخ، جهة الاتصال، والنتيجة إلى ملف CSV نفسه، وقم بإلزامه. ستشكر نفسك في الربع القادم.
الأخطاء والإصلاحات
تفشل سكربتات البحث عن العملاء المحتملين في الأماكن القليلة نفسها
الخطأ
لماذا يضر
الإصلاح
الترتيب حسب DR فقط
تظهر الدلائل الكبيرة ومجمعات البيانات في الأعلى
الترتيب حسب عدد التداخل أولاً، DR ثانيًا
إرسال البريد إلى كل شيء فوق حد معين
يبدو كرسائل عشوائية، يكلف المصداقية
افتح أفضل 30 يدويًا
ترميز URL يدويًا
الفواصل والم slashes تكسر الاستعلام
استخدم urllib.parse.urlencode
إرسال 3,000 نطاق في استدعاء واحد
فوق حد 2,000
قسم القائمة، ائتمان واحد لكل جزء
الثقة في DR كجودة
إنه عدد مقياس لوغاريتمي للنطاقات المرجعية
عاملها كعامل ترتيب، وليس حكمًا نهائيًا
اختيار منافسين يشاركون قرائك
المنافسون يقررون ما يعيده التقاطع. أداة العثور على الروابط الخلفية ليست أفضل من القائمة التي تغذيها. ثلاثة منافسين مباشرين لنفس القارئ يعطون تداخلًا نظيفًا، بينما يمنحك ناشر ضخم يصنف لكل شيء آلاف الروابط التي لا تقول شيئًا عن صفحتك.
لنفترض أنك تدير مدونة صغيرة عن إصلاح الدراجات. قد يكون منافسوك مدونتي إصلاح ومحل واحد يحتوي على قسم أدلة قوي. هذه مجموعة جيدة. أضف منشورًا وطنيًا وستمتلئ القائمة بالصفحات التي لن تربط بمدونة دراجات.
من مجالين إلى عشرة نطاقات هي النافذة التي يقبلها الطرف، لذا اختر المجموعة داخلها. اجعل القائمة قصيرة بما يكفي لتتمكن من تسمية كل منافس من الذاكرة. القوائم القصيرة أسهل في الدفاع عنها.
لماذا تلوث المحاور العملاقة المجموعة
تربط الدلائل والمجمعات بكل شيء تقريبًا. تظهر في كل تقاطع وتدفن مجموعة صغيرة من النطاقات التي تربط خارجًا من اهتمام حقيقي. اقرأ قمة القائمة المرتبة قبل الوثوق بها.
ملف استبعاد عادي يصلح معظم هذا. احتفظ بالنطاقات التي لا تريد أبدًا وجودها في ملف نصي واحد، واحد لكل سطر. حمّله في مجموعة واسقط المطابقات قبل استدعاء التقييم، حتى تذهب الائتمانات فقط إلى المرشحين الذين يستحقون القراءة.
فصل المنافسين وموقعك الخاص
لا ينبغي أن يكون نطاقك الخاص منافسًا. يبدو واضحًا، لكن القائمة المنسوخة من مشروع قديم غالبًا ما تحملها معها، ثم يبلغ التقاطع عن روابطك الخاصة بك.
ضع المنافسين في قاموس تكوين في بداية السكربت، مع تعليق على سبب وجود كل واحد. الشهر القادم ستتذكر السبب، وسيقرأ الغريب المستودع أيضًا.
قراءة الصفوف الخام قبل التصفية
يقرأ الكود كل حقل باستخدام .get، مما يمنع مفتاحًا مفقودًا من تعطيل التشغيل. كما يخفي مفتاحًا خاطئًا. اطبع صفًا واحدًا من التقاطع قبل كتابة أي مرشح، وانظر إلى أسماء الحقول ونوع كل قيمة.
النتيجة التي تصل كنص تُرتب كنص، لذا 9 يأتي بعد 80. حولها إلى رقم مرة واحدة، مباشرة بعد الاستدعاء، ويمكن أن يبقى باقي السكربت بسيطًا.
توحيد النطاقات قبل المقارنة
يمكن أن يظهر نفس الموقع ببادئة www. في قائمة وبدونها في أخرى. اجعل كل شيء بحروف صغيرة وامسح البادئة قبل مقارنة المجموعات. خلاف ذلك، قد يبدو موقعك الخاص كمرشح جديد.
تسبب المسافات الزائدة والفراغات الغريبة من قائمة منسوخة نفس المشكلة. وظيفة تنظيف بسطر واحد تكلف أقل من استدعاء تقييم واحد ضائع.
احتفظ بنسخة مؤرخة من كل تشغيل
اكتب كل تشغيل في ملف مؤرخ، واحتفظ بالسابق. يمكنك بعد ذلك التمييز بين المرشحين الجدد وتلك التي رأيتها بالفعل، ورؤية متى بدأ منافس في الربط في مكان جديد.
الملفات المؤرخة هي أيضًا أسهل طريقة لتصحيح نتيجة غريبة. افتح الملفين جنبًا إلى جنب والتغيير يكون واضحًا عادةً.
قيم فقط ما ينجو
الاستدعاء الجملي يأخذ ما يصل إلى 2,000 نطاق بائتمان واحد. مرر له الناجين من الطرح، وليس التقاطع الكامل. في التشغيل المخترع أعلاه، كلفت 640 صفًا و410 صفًا نفس التقييم في استدعاء واحد، لكن القائمة الأصغر أسهل بكثير في القراءة.
أسئلة قبل تشغيل أداة البحث
معظم الأسئلة التي يطرحها الناس على هذا الجزء من الوظيفة تعود إلى التكلفة، والترتيب، وما يحدث عندما يفشل استدعاء.
هل تكلفة بناء قائمة العملاء المحتملين كبيرة؟
ليس كثيرًا. تستخدم الوصفة التقاطع، refdomains و bulk_dr، لذا خمسة ائتمانات لكل تشغيل بالحجم المعروض، وهو $0.0005. إعادة التشغيل الشهر القادم تكلف نفس الشيء. وقتك الخاص، المنقضي في قراءة الصفحات، هو التكلفة الحقيقية.
لماذا لا ترتب التقاطع حسب DR وتتوقف هناك؟
DR يعدد النطاقات المرجعية على مقياس لوغاريتمي. ترتفع الدلائل الكبيرة إلى القمة بغض النظر عن صلتها، لذا رتب حسب التداخل أولاً واستخدم DR كمكسر تعادل، وليس المفتاح الرئيسي.
هل يمكنني إرسال التواصل إلى كل شيء في ملف CSV؟
يمكنك، لكنه استخدام سيء للقائمة. افتح الصفحة التي تربط بالمنافس، قرر ما إذا كان إدخال جديد يناسب، ثم اكتب فقط. ملف CSV هو قائمة مختصرة، وليس قائمة بريدية.
كم منافس يجب أن أبدأ به؟
ثلاثة بداية جيدة، داخل نطاق الاثنين إلى العشرة الذي يقبله التقاطع. أضف المزيد فقط عندما يعيد التشغيل الأول عدد صفوف قليل جدًا للترتيب.
ماذا لو لم يكن لنطاقك الخاص نطاقات مرجعية بعد؟
ثم لا يزيل الطرح شيئًا، ويصبح كل صف تقاطع مرشحًا. هذا صحيح، لكن القائمة ستكون طويلة. قللها من خلال التداخل واقرأ أفضل ثلاثين يدويًا.
هل يحتاج السكربت إلى مفتاح مدفوع؟
نعم. استدعاءات التقاطع، refdomains و bulk_dr تسعر بالائتمان. لا يحتاج إجراء النظرة المجانية إلى مفتاح، وائتمان التسجيل بقيمة $100 يغطي العديد من عمليات التشغيل بهذا الحجم.
قبل إرسال رسالة واحدة
افتح صفحة المرشح وتأكد من أنها تربط بالمنافس، وليس فقط بقائمة روابط.
تحقق من أن الصفحة تناسب قارئك، وليس فقط كلمة مفتاحية.
أزل أي نطاق تواصلت معه بالفعل، وسجل التاريخ بجانبه.
اكتب جملة واحدة عما تضيفه صفحتك، أو اسقط المرشح.
أرسل في دفعات صغيرة، حتى يمكن قراءة الردود فعليًا.
تشغيل أداة البحث على جدول زمني
تذهب قوائم العملاء المحتملين إلى العفن أبطأ مما يتوقعه معظم الناس. شهريًا يكفي. تظهر روابط جديدة من منافس مع التحديث الشهري، لذا فإن تشغيل كل بضعة أسابيع يمسك بمعظمها. عمليات التشغيل الأسبوعية تنتج في الغالب ملف الأسبوع الماضي، وهذا هو السبب في أن نفس أداة العثور على الروابط الخلفية يمكن أن تعمل دون إشراف دون ضوضاء كبيرة.
الإيقاع المعقول هو شهريًا للتقييم ونظرة سريعة على الصفوف العليا بعد كل تشغيل. احتفظ بخط الطرح داخل نفس المهمة، حتى لا تتضمن القائمة ما تملكه بالفعل.
احتفظ بالمفتاح خارج الملف
يقرأ السكربت المفتاح من البيئة، لذا لا يجلس أبدًا في المستودع. اضبط LZ_KEY كسر في مخططك الزمني، أو صدّره من ملف يبقى خارج git.
يمكن لسطر crontab استدعاء نفس السكربت مع المتغير مضبوطًا أمامه. تحقق من أن الملف الذي يحتوي على المفتاح لديه أذونات ضيقة على الخادم.
فشل قبل كتابة ملف CSV
يجب أن يوقف 401 أو 402 التشغيل، وكذلك علامة ok التي تقرأ خطأ. يرفع الكود قبل فتح الملف، لذا فإن التشغيل الفاشل لا يتجاوز ملف CSV الخاص بالأمس بجزئي.
سجل الإنفاق مع كل تشغيل
يحمل كل استجابة _credits، لذا اطبع الرصيد في نهاية المهمة. على مدى بضعة أشهر، يخبرك هذا السطر ما إذا كان الجدول الزمني يكلف ما خططت له، وما إذا كانت حلقة قد بدأت إعادة جلب الصفحات.
اقترنها بـ SQLite diff إذا أردت التاريخ في قاعدة بيانات بدلاً من مجلد من الملفات.
كلمة حول ما يمكن و لا يمكن أن يقوله DR
DR هنا هو round(100 times log(ref_domains + 1) over log(20,000,000)). يرتفع مع النطاقات المرجعية ولا شيء آخر. احتفظ بذلك في ذهنك. يمكن أن يجلس موقع عند 55 ولا يزال عديم الفائدة لك.
استخدمه للترتيب، ثم اقرأ. انظر إلى ما ينشره الموقع، هل يربط بخمسة عشر متجرًا غير ذي صلة، وهل تغير أي شيء فيه مؤخرًا. تستغرق هذه الفحوصات دقيقة لكل موقع، ولا يستبدلها أي سكربت.
بمجرد أن تكون القائمة نظيفة، احتفظ بها كملف مؤرخ وأعد التشغيل في شهر. يوضح دليل تشغيل الإجراءات كيفية جدولة ذلك، ويغطي مقارنة n8n الطريق بدون كود إذا كان شخص التواصل الخاص بك يفضل ذلك.
ملاحظات حول التقييم والحجم
يعيد كل استدعاء ما يصل إلى 1,000 صف ويحاسب مرة واحدة، لذا فإن التصفح عبر 5,000 صف تقاطع يكلف 10 ائتمانات، أو $0.001. التصفح العميق يتوقف عند 50,000 صف. استخدم sort و order=desc على الخادم بدلاً من ترتيب قائمة كبيرة في بايثون لاحقًا.