החלפה ברמת הרשימה
ProxySale מחליפה פרוקסי דרך הרשימה עצמה. המאגר מאבד כתובות מתות ומקבל חדשות כל היום, ובכל פעם שהתוכנה מבקשת את הקישור היא מקבלת את הקבוצה שעובדת באותו רגע. לא מגדירים אצלנו כללי החלפה: טענו את הקישור מחדש כל 8 עד 10 דקות והרשימה נשארת עדכנית.
את השורה לכל בקשה בוחרת התוכנה. רוב הסקרייפרים וכלי ה-SEO שולפים פרוקסי אקראי בכל בקשה או עוברים לשורה אחרת אחרי שגיאה, והעומס מתפזר על אלפי כתובות.
למה פרוקסי מתחלף עוזר לסקרייפרים
מנועי חיפוש, מרקטפלייסים ואתרי השוואת מחירים סופרים בקשות לכל IP. כתובת ששולחת מאות בקשות בדקה נתקלת בקפצ׳ה או בחסימה. פזרו את אותו עומס על רשימת פרוקסי מתחלף, וכל כתובת שולחת רק מעט, כך שהיעד רואה משהו קרוב למבקרים רגילים.
ההחלפה גם מסתירה שורות מתות. בקשה שנכשלה יוצאת שוב דרך כתובת אחרת, והטעינה הבאה של הרשימה מוציאה את השורה הגרועה.
הגדרת החלפה בתוכנה
- A-Parser ו-ZennoPoster: הוסיפו את קישור הרשימה כמקור פרוקסי עם טעינה מחדש כל 10 דקות.
- Scrapy: טענו את הרשימה ל-downloader middleware שבוחר שורה אקראית לכל בקשה.
- Python requests: החזיקו את הרשימה בזיכרון והעבירו שורה אקראית במילון proxies.
- curl ב-bash: קחו שורה עם
shuf -n 1לפני כל קריאה.
השאירו את הטעינה מחדש על 8 עד 10 דקות. בקשות כל דקה מואטות אצלנו, וגם המאגר לא משתנה כל כך מהר.
אסטרטגיות החלפה
- שורה אקראית לכל בקשה: השיטה הפשוטה ביותר, עם העומס האחיד ביותר.
- שורה אחת לסדרה קצרה: שימושי כשאתר מצפה לכמה בקשות קשורות, כמו עמוד חיפוש ועמוד התוצאות הבא.
- החלפה בשגיאה: להחזיק שורה כל עוד היא עונה, ולזרוק אותה אחרי קפצ׳ה, זמן קצוב או 403.
- צינון: אחרי חסימה, להוציא את הכתובת מההחלפה ל-10 עד 15 דקות.
רוב הסקרייפרים משלבים את הראשונה ואת השלישית: שורה אקראית לכל בקשה והחלפה מיידית אחרי שגיאה. עקבו אחרי שיעור הקפצ׳ות והבקשות שנכשלו. אם הוא עולה, הוסיפו כתובות או האטו.
כמה כתובות צריך
ספרו את הבקשות בדקה ליעד הקשה ביותר וחלקו במספר שכתובת אחת יכולה לשלוח בלי בעיות. אם אתר סובל חמש בקשות בדקה מ-IP אחד ואתם צריכים 5,000, תכננו לפחות 1,000 כתובות חיות, ועוד מרווח לירידה של הלילה. משימות גדולות יותר מוסברות בעמוד פרוקסי בסיטונאות.
בחרו מאגר לפי היעד: World MIX לאתרים גלובליים, פרוקסי אירופה לחנויות ולחיפוש באיחוד, פרוקסי חבר המדינות ל-Yandex ולמרקטפלייסים אזוריים, פרוקסי סין ל-Baidu.
משימות שצריכות כתובת קבועה
יש עבודות שצריכות כתובת אחת לאורך זמן: כניסה לחשבונות, שמירת עגלת קניות, הפעלת פרופילים בדפדפני אנטידטקט. רשימה מתחלפת של חבילה מתאימה לזה רע, כי הכתובת יכולה לצאת מהמאגר. לעבודה כזאת קחו פרוקסי רזידנטיאליים מהמאגר Max: לכל שורה סשן משלה במשך של 3 דקות עד 24 שעות, כל עוד המכשיר הביתי מחובר. העמוד פרוקסי לאנטידטקט מראה איך להגדיר פרופילים.
לכל מה שקורא עמודים ציבוריים, ההחלפה מתאימה יותר ועולה פחות לבקשה.
קובץ רשימה שמתחדש כל 10 דקות
יש כלים שקוראים פרוקסי רק מקובץ. שמרו על הקובץ טרי עם סקריפט קטן שמוריד את הרשימה כל 10 דקות. כל סקריפט למטה כותב קודם לקובץ זמני ומחליף את הקובץ הראשי רק אחרי הורדה מלאה, כך שהתוכנה לעולם לא תקרא רשימה כתובה למחצה או ריקה. שימו את קישור הרשימה מהלוח במקום YOUR_LIST_LINK.
Linux: סקריפט shell ו-cron
שמרו את הסקריפט בשם /opt/proxies/update-proxies.sh, הפכו אותו לבר-הרצה עם chmod +x /opt/proxies/update-proxies.sh והריצו אותו פעם אחת ידנית. הוא מדפיס כמה פרוקסי שמר, או שגיאה אם הקישור לא עונה.
#!/bin/sh
LIST_URL="YOUR_LIST_LINK"
DEST="/opt/proxies/proxies.txt"
TMP="$DEST.tmp"
mkdir -p "$(dirname "$DEST")"
if curl -fsS --max-time 60 -o "$TMP" "$LIST_URL" && [ -s "$TMP" ]; then
mv "$TMP" "$DEST"
echo "$(date '+%F %T') saved $(wc -l < "$DEST") proxies"
else
rm -f "$TMP"
echo "$(date '+%F %T') download failed, kept the old list" >&2
exit 1
fiפתחו את התזמון עם crontab -e והוסיפו את השורה למטה. cron מפעיל את הסקריפט כל 10 דקות ומוסיף את ההודעות שלו ליומן. הריצו כ-root, או שנו את שני הנתיבים לתיקייה בתיקיית הבית שלכם.
*/10 * * * * /opt/proxies/update-proxies.sh >> /var/log/update-proxies.log 2>&1Windows: PowerShell ומתזמן המשימות
שמרו את הסקריפט בשם C:\proxies\update-proxies.ps1 והריצו אותו פעם אחת ב-PowerShell כדי לבדוק את הקישור.
$ListUrl = "YOUR_LIST_LINK"
$Dest = "C:\proxies\proxies.txt"
$Tmp = "$Dest.tmp"
New-Item -ItemType Directory -Force -Path (Split-Path $Dest) | Out-Null
try {
Invoke-WebRequest -Uri $ListUrl -OutFile $Tmp -UseBasicParsing -TimeoutSec 60
if ((Get-Item $Tmp).Length -eq 0) { throw "empty list" }
Move-Item -Force $Tmp $Dest
$count = (Get-Content $Dest | Measure-Object -Line).Lines
Write-Output "$(Get-Date -Format s) saved $count proxies"
} catch {
Remove-Item $Tmp -ErrorAction SilentlyContinue
Write-Output "$(Get-Date -Format s) download failed, kept the old list: $($_.Exception.Message)"
exit 1
}רשמו משימה שמריצה את הסקריפט כל 10 דקות: הדביקו את הפקודה בשורת הפקודה או ב-PowerShell. המשימה שורדת הפעלות מחדש ומופיעה במתזמן המשימות בשם UpdateProxies. היא רצה כל עוד אתם מחוברים; כדי שתרוץ בלי הפעלה, פתחו את שורת הפקודה כמנהל והוסיפו לפקודה /RU SYSTEM.
schtasks /Create /TN "UpdateProxies" /SC MINUTE /MO 10 /F /TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\proxies\update-proxies.ps1"מעדיפים עכבר? פתחו את מתזמן המשימות, בחרו ״יצירת משימה בסיסית״, בחרו מפעיל יומי, ואז פתחו את מאפייני המשימה והגדירו חזרה כל 10 דקות למשך ״ללא הגבלה״. הפעולה מפעילה את powershell.exe עם הארגומנטים -NoProfile -ExecutionPolicy Bypass -File C:\proxies\update-proxies.ps1.
כל מערכת: Python
גרסת ה-Python רצה בלולאה ולא צריכה מתזמן. הפעילו אותה בטרמינל, בתוך screen או tmux, או כשירות. היא צריכה Python 3 ובלי חבילות נוספות.
import time
import urllib.request
from pathlib import Path
LIST_URL = "YOUR_LIST_LINK"
DEST = Path("proxies.txt")
EVERY = 600
while True:
try:
data = urllib.request.urlopen(LIST_URL, timeout=60).read()
if not data.strip():
raise ValueError("empty list")
tmp = DEST.with_name(DEST.name + ".tmp")
tmp.write_bytes(data)
tmp.replace(DEST)
print(time.strftime("%Y-%m-%dT%H:%M:%S"), "saved", len(data.split()), "proxies", flush=True)
except Exception as error:
print(time.strftime("%Y-%m-%dT%H:%M:%S"), "download failed, kept the old list:", error, flush=True)
time.sleep(EVERY)הפנו את התוכנה לקובץ השמור, והיא תמיד תקרא רשימה שלא עברו עליה יותר מ-10 דקות. השאירו את המרווח על 10 דקות: בקשות תכופות יותר מואטות אצלנו.
פרוטוקולים, מחירים ובדיקה
כל שורה מתחלפת של חבילה עובדת ב-HTTP, HTTPS, SOCKS4 ו-SOCKS5 על פורט אחד, ראו פרוקסי SOCKS5 ופרוקסי HTTP. גדלים ותקופות במחירון, ואת שעת החינם בכל חבילה נותנת התמיכה בעמוד יצירת הקשר.
