पायथन में बैकलिंक्स फाइंडर: चालीन लाइनों में एक प्रस्पेक्ट लिस्ट
उन डोमेन्स को खोजें जो आपके प्रतिद्वंद्वियों को लिंक करते हैं लेकिन आपको नहीं, उन्हें एक कॉल में स्कोर करें और CSV को सॉर्ट करें। नीचे एक कार्य उदाहरण काल्पनिक संख्याओं के साथ दिया गया है।
Linkzoid editorial team ·
कोड से पहले की लॉजिक
तीन कॉल इस काम को पूरा करती हैं। intersect दो से दस डोमेन्स लेता है और उन डोमेन्स को लौटाता है जो कई में लिंक करते हैं। refdomains आपके स्वयं के साइट पर घटाने के लिए सेट देता है। bulk_dr फिर शेष को स्कोर करता है।
प्रत्येक रन की लागत नगण्य है, और अंकगणित एक बार करने के लायक है। इंटरसेक्ट के लिए दो क्रेडिट, अपनी लिस्ट के लिए दो, और 2,000 डोमेन्स तक स्कोरिंग के लिए एक। पांच क्रेडिट $0.0005 के बराबर हैं।
क्रम महत्वपूर्ण है। स्कोर करने से पहले घटाएं।
लोग अक्सर पहले सब कुछ स्कोर करते हैं और बाद में फ़िल्टर करते हैं। यह उल्टा है। स्कोरिंग की लागत कम है, लेकिन जब CSV में पचास हज़ार पंक्तियाँ होती हैं तो यह बहुत समय बर्बाद करती है। ओवरलैप द्वारा लिस्ट को पहले कम करें, जीडीआर का अनुरोध बचे हुए डोमेन्स के लिए करें, और पूरी प्रक्रिया को एक सादे डिक्ट में रखें ताकि अगले रन में कल के परिणाम का पुन: उपयोग किया जा सके।
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
410 पर bulk_dr
410 स्कोर किए गए
1
DR 20 और ऊपर रखें
लगभग 120
0
शीर्ष 30 का हस्त-जाँच
30 पेज खोले गए
0
CSV से आउटरीच तक, बिना किसी को स्पैम किए
01
ओवरलैप द्वारा सॉर्ट करें
वे डोमेन्स जो आपके दो या तीन प्रतिद्वंद्वियों को लिंक करते हैं, वे ही वे हैं जिनके पास आपको लिंक करने का विषयक कारण है। उन्हें पहले रखें।
02
तीस को हाथ से खोलें
प्रतिद्वंद्वी को लिंक करने वाले पेज को देखें। क्या यह एक संसाधन सूची है, एक समीक्षा, या एक समाचार आइटम? इनमें से केवल कुछ नए प्रवेश स्वीकार करते हैं।
03
एक लाइन कारण लिखें
कहें कि आपका पेज प्रतिद्वंद्वी के पेज में क्या जोड़ता है। यदि आप इसे एक वाक्य में नहीं कह सकते, तो उस साइट को छोड़ दें।
04
लॉग करें कि आपने क्या भेजा
तारीख, संपर्क और परिणाम के लिए कॉलम जोड़ें, और CSV को कमीट करें। अगले तिमाही में आप खुद को धन्यवाद देंगे।
गलतियाँ और समाधान
प्रस्पेक्टिंग स्क्रिप्ट एक ही कुछ जगहों पर गलत होती हैं
गलती
यह क्यों नुकसानदायक है
समाधान
केवल DR द्वारा सॉर्टिंग
बड़े निर्देशिका और स्क्रैपर शीर्ष पर आते हैं
पहले ओवरलैप काउंट के अनुसार सॉर्ट करें, DR दूसरे नंबर पर
एक कटऑफ से ऊपर सब कुछ मेल करना
स्पैम जैसा लगता है, भलाई की लागत होती है
शीर्ष 30 को हाथ से खोलें
URL-एन्कोडिंग हाथ से
कॉमा और स्लैश क्वेरी को तोड़ देते हैं
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 पर बैठ सकती है और फिर भी आपके लिए बेकार हो।
रैंक करने के लिए इसका उपयोग करें, फिर पढ़ें। देखें कि साइट क्या प्रकाशित करती है, क्या यह सैकड़ों असंबंधित दुकानों को लिंक करती है, और क्या इस पर कुछ हाल ही में बदला है। वे जाँचें साइट प्रति मिनट लेती हैं, और कोई स्क्रिप्ट उन्हें बदल नहीं सकती।
एक बार जब लिस्ट साफ हो जाए, तो इसे एक तारीख वाली फ़ाइल के रूप में रखें और एक महीने में रीरन करें। Actions runbook दिखाता है कि इसे कैसे शेड्यूल करें, और the n8n comparison कोड-रहित मार्च को कवर करता है यदि आपकी आउटरीश व्यक्ति इसे पसंद करती है।
रेट और साइज नोट्स
प्रत्येक कॉल 1,000 पंक्तियाँ तक लौटाती है और एक बार बिल की जाती है, इसलिए 5,000 इंटरसेक्ट पंक्तियों के माध्यम से पेजिंग 10 क्रेडिट, या $0.001 खर्च करती है। गहरी पेजिंग 50,000 पंक्तियों पर रुक जाती है। सर्वर पर sort और order=desc का उपयोग करें, बाद में पायथन में एक बड़ी लिस्ट को सॉर्ट करने के बजाय।