بازگشت به وبلاگ

پروکسی برای استخراج آگهی‌های شغلی از hh.ru، Superjob و LinkedIn: راهنمای کامل

راهنمای جامع تنظیم پروکسی برای استخراج اطلاعات از سایت‌های شغلی: انتخاب نوع پروکسی، دور زدن حفاظت hh.ru و Superjob، تنظیم چرخش IP و پردازش کپچا.

📅۲۱ اسفند ۱۴۰۴
```html

استخراج job boards یکی از پرکاربردترین سناریوهای جمع‌آوری داده برای تحلیل منابع انسانی، نظارت بر بازار کار و خودکارسازی استخدام است. اما سایت‌های آگهی شغلی به طور فعال در برابر جمع‌آوری خودکار داده‌ها محافظت می‌کنند: IP را پس از 50-100 درخواست مسدود می‌کنند، کپچا نشان می‌دهند و حساب‌های مشکوک را مسدود می‌کنند. در این مقاله بررسی خواهیم کرد که چگونه پروکسی را برای استخراج پایدار از hh.ru، Superjob، LinkedIn و سایر پلتفرم‌ها بدون مسدودسازی به درستی پیکربندی کنیم.

چرا job boards استخراج را مسدود می‌کنند و حفاظت چگونه کار می‌کند

سایت‌های آگهی شغلی از استخراج متضرر می‌شوند: داده‌ها به رقبا فروخته می‌شوند، جمع‌آورنده‌ها بدون مجوز ایجاد می‌شوند، کارفرمایان از انتشارهای پولی عبور می‌کنند. به همین دلیل همه پلتفرم‌های بزرگ حفاظت چندلایه‌ای در برابر جمع‌آوری خودکار داده‌ها پیاده‌سازی کرده‌اند.

روش‌های اصلی حفاظت job boards:

  • محدودیت نرخ بر اساس IP — hh.ru پس از 80-120 درخواست در ساعت IP را مسدود می‌کند، Superjob — پس از 50-70 درخواست. مسدودسازی می‌تواند از 1 ساعت تا یک روز طول بکشد.
  • اثرانگشت‌گیری مرورگر — سایت‌ها User-Agent، هدرهای HTTP، رزولوشن صفحه، فونت‌های نصب شده را تحلیل می‌کنند. اگر داده‌ها با مرورگر واقعی مطابقت نداشته باشند — درخواست مسدود می‌شود.
  • بررسی‌های JavaScript — بسیاری از سایت‌ها از Cloudflare یا اسکریپت‌های خود برای بررسی اینکه درخواست از مرورگر واقعی است نه ربات، استفاده می‌کنند.
  • تله‌های Honeypot — لینک‌ها و فیلدهای مخفی که فقط استخراج‌کننده می‌بیند. اگر ربات روی آن‌ها کلیک کند — IP به لیست سیاه اضافه می‌شود.
  • کپچا در فعالیت مشکوک — پس از یک سری درخواست سریع یا هنگام استفاده از IP دیتاسنتر ظاهر می‌شود.

بدون پروکسی شما حداکثر می‌توانید 100-200 آگهی شغلی را استخراج کنید، پس از آن IP شما مسدود می‌شود. برای جمع‌آوری داده در مقیاس بزرگ (هزاران آگهی شغلی روزانه) پروکسی ابزاری ضروری می‌شود.

مهم: استخراج باید با شرایط استفاده از سایت مطابقت داشته باشد. بسیاری از job boards API رسمی برای دسترسی قانونی به داده‌ها ارائه می‌دهند. به عنوان مثال، hh.ru یک API رایگان با محدودیت درخواست دارد که برای اکثر وظایف مناسب است.

کدام نوع پروکسی را برای استخراج آگهی‌های شغلی انتخاب کنیم

انتخاب نوع پروکسی به مقیاس استخراج، بودجه و نیازهای سرعت بستگی دارد. سه گزینه اصلی را با سناریوهای خاص بررسی می‌کنیم.

نوع پروکسی سرعت خطر مسدودسازی چه زمانی استفاده کنیم
دیتاسنتر بالا (50-200 میلی‌ثانیه) بالا تست استخراج‌کننده، جمع‌آوری داده‌های عمومی بدون احراز هویت
مسکونی متوسط (200-800 میلی‌ثانیه) پایین استخراج مقیاس بزرگ hh.ru، Superjob با چرخش IP
موبایل متوسط (300-1000 میلی‌ثانیه) بسیار پایین استخراج با احراز هویت، دور زدن حفاظت سخت LinkedIn

پروکسی‌های دیتاسنتر برای استخراج

این سریع‌ترین و ارزان‌ترین گزینه است، اما با محدودیت‌هایی همراه است. IP های دیتاسنتر به راحتی توسط سایت‌ها شناسایی می‌شوند، بنابراین فقط برای وظایف ساده مناسب هستند: استخراج لیست آگهی‌های شغلی بدون احراز هویت، جمع‌آوری داده‌های عمومی، تست استخراج‌کننده قبل از راه‌اندازی روی پروکسی‌های مسکونی.

چه زمانی پروکسی‌های دیتاسنتر کار می‌کنند:

  • استخراج حجم کم داده (تا 500 آگهی شغلی در روز)
  • جمع‌آوری داده از سایت‌های بدون حفاظت سخت (job boards منطقه‌ای کوچک)
  • استفاده از API رسمی با چرخش IP برای دور زدن محدودیت نرخ
  • استخراج فیدهای RSS و فایل‌های XML آگهی‌های شغلی

برای hh.ru و Superjob پروکسی‌های دیتاسنتر ناپایدار کار خواهند کرد: پس از 20-30 درخواست کپچا دریافت می‌کنید و بسیاری از IP ها قبلاً در لیست سیاه این سایت‌ها هستند.

پروکسی‌های مسکونی — انتخاب بهینه برای job boards

پروکسی‌های مسکونی از آدرس‌های IP کاربران واقعی خانگی استفاده می‌کنند، بنابراین سایت‌ها آن‌ها را به عنوان بازدیدکنندگان عادی می‌بینند. این تعادل بهینه قیمت و کیفیت برای استخراج آگهی‌های شغلی است.

مزایا برای استخراج job boards:

  • خطر پایین مسدودسازی — hh.ru و Superjob نمی‌توانند IP مسکونی را از کاربر واقعی تشخیص دهند
  • استخر بزرگ آدرس‌های IP — می‌توان چرخش را در هر درخواست یا هر 5-10 دقیقه تنظیم کرد
  • اتصال جغرافیایی — می‌توان آگهی‌های شغلی از شهر خاصی را با استفاده از IP آن منطقه استخراج کرد
  • پایداری — یک IP مسکونی می‌تواند 200-500 درخواست را بدون مسدودسازی پردازش کند

برای استخراج مقیاس بزرگ (بیش از 1000 آگهی شغلی در روز) پروکسی‌های مسکونی با چرخش IP راه‌حل استاندارد است. شما تغییر IP را هر 5-10 دقیقه تنظیم می‌کنید، تاخیرهای تصادفی بین درخواست‌ها (3-7 ثانیه) اضافه می‌کنید و جمع‌آوری پایدار داده بدون مسدودسازی دریافت می‌کنید.

پروکسی‌های موبایل برای LinkedIn و استخراج با احراز هویت

پروکسی‌های موبایل از IP اپراتورهای موبایل استفاده می‌کنند. مزیت اصلی آن‌ها این است که یک IP به طور همزمان توسط صدها کاربر واقعی استفاده می‌شود، بنابراین سایت‌ها نمی‌توانند چنین آدرسی را بدون خطر مسدود کردن هزاران بازدیدکننده عادی مسدود کنند.

چه زمانی به پروکسی‌های موبایل نیاز است:

  • استخراج LinkedIn — این پلتفرم سخت‌ترین حفاظت در برابر ربات‌ها را دارد و به طور تهاجمی IP های دیتاسنتر و حتی مسکونی را مسدود می‌کند
  • کار با احراز هویت — اگر نیاز به استخراج آگهی‌های شغلی خصوصی یا داده‌های پروفایل دارید، IP های موبایل خطر مسدودسازی حساب را کاهش می‌دهند
  • استخراج job boards خارجی — Indeed، Glassdoor، Monster از سیستم‌های حفاظتی پیشرفته استفاده می‌کنند که IP های موبایل قابل اعتمادتر کار می‌کنند
  • دور زدن مسدودسازی‌های سخت — اگر پروکسی‌های مسکونی شما شروع به دریافت کپچا کردند، انتقال به موبایل مشکل را حل می‌کند

منفی پروکسی‌های موبایل — قیمت بالا و سرعت کمتر است. اما برای وظایف حیاتی که مسدودسازی غیرقابل قبول است، این بهترین انتخاب است.

ویژگی‌های استخراج hh.ru: حفاظت و روش‌های دور زدن

hh.ru — بزرگترین سایت آگهی شغلی روسیه با پیشرفته‌ترین حفاظت در برابر استخراج در میان job boards داخلی است. سایت از ترکیبی از محدودیت نرخ، اثرانگشت‌گیری و تحلیل رفتاری برای شناسایی ربات‌ها استفاده می‌کند.

حفاظت hh.ru چگونه کار می‌کند

1. محدودیت‌های بر اساس آدرس IP: پس از 80-120 درخواست در ساعت از یک IP، سایت شروع به نمایش کپچا یا بازگرداندن HTTP 429 (Too Many Requests) می‌کند. مسدودسازی از 1 تا 6 ساعت بسته به تهاجمی بودن استخراج طول می‌کشد.

2. بررسی User-Agent و هدرها: hh.ru هدرهای درخواست HTTP را تحلیل می‌کند. اگر User-Agent با مرورگر واقعی مطابقت نداشته باشد یا هدرهای استاندارد (Accept-Language، Accept-Encoding) وجود نداشته باشند، درخواست مسدود می‌شود.

3. بررسی‌های JavaScript: برخی صفحات hh.ru نیاز به اجرای JavaScript برای بارگذاری داده‌ها دارند. یک استخراج‌کننده HTTP ساده بدون مرورگر headless نمی‌تواند محتوای کامل را دریافت کند.

4. لینک‌های Honeypot: در صفحات عناصر مخفی وجود دارد که فقط استخراج‌کننده می‌بیند. اگر اسکریپت شما روی این لینک‌ها کلیک کند — IP به لیست سیاه برای 24 ساعت اضافه می‌شود.

استراتژی دور زدن حفاظت hh.ru با پروکسی

برای استخراج پایدار hh.ru بدون مسدودسازی از پیکربندی زیر استفاده کنید:

تنظیمات بهینه برای استخراج hh.ru:

  • نوع پروکسی: مسکونی با چرخش IP هر 5-10 دقیقه
  • تاخیر بین درخواست‌ها: 4-8 ثانیه (مقدار تصادفی)
  • User-Agent: چرخش User-Agent واقعی مرورگرهای مدرن (Chrome، Firefox، Safari نسخه‌های آخر)
  • هدرها: مجموعه کامل هدرهای استاندارد مرورگر (Accept، Accept-Language، Accept-Encoding، Referer)
  • Cookies: ذخیره و انتقال cookies بین درخواست‌ها در یک نشست
  • محدودیت درخواست: حداکثر 60-80 درخواست برای یک IP، سپس تغییر پروکسی

مثال توالی ایمن اقدامات:

  1. به پروکسی مسکونی با IP از منطقه مورد نیاز متصل می‌شوید (مثلاً مسکو)
  2. اولین درخواست را به صفحه اصلی hh.ru می‌دهید، cookies را دریافت و ذخیره می‌کنید
  3. 5-7 ثانیه صبر می‌کنید (شبیه‌سازی خواندن صفحه)
  4. درخواست به صفحه جستجوی آگهی‌های شغلی با فیلترهای مورد نیاز می‌دهید
  5. لیست آگهی‌های شغلی را استخراج می‌کنید (معمولاً 20-50 در هر صفحه)
  6. برای هر آگهی شغلی درخواست به صفحه جزئیات با تاخیر 4-6 ثانیه می‌دهید
  7. پس از 60-70 درخواست پروکسی را تغییر می‌دهید و چرخه را تکرار می‌کنید

با این استراتژی می‌توانید 1000-2000 آگهی شغلی در روز را با یک رشته بدون هیچ مسدودسازی استخراج کنید. اگر به حجم بیشتری نیاز دارید — چندین رشته موازی با پروکسی‌های مختلف راه‌اندازی کنید.

نکته: hh.ru یک API رایگان برای دسترسی به آگهی‌های شغلی ارائه می‌دهد. برای اکثر وظایف (تحلیل بازار کار، نظارت بر حقوق) API راه‌حل پایدارتری نسبت به استخراج HTML خواهد بود. پروکسی را می‌توان برای چرخش IP هنگام کار با API استفاده کرد تا محدودیت‌های نرخ را دور بزنید.

استخراج Superjob، LinkedIn و پلتفرم‌های خارجی

Superjob: ویژگی‌های حفاظت

Superjob حفاظت کمتر سختگیرانه‌ای نسبت به hh.ru دارد، اما همچنان به طور فعال با استخراج مبارزه می‌کند. تفاوت‌های اصلی:

  • محدودیت نرخ پایین‌تر: مسدودسازی پس از 50-70 درخواست در ساعت اتفاق می‌افتد (در مقابل 80-120 در hh.ru)
  • بررسی کمتر سختگیرانه هدرها: می‌توان از مجموعه ساده‌شده‌ای از هدرها استفاده کرد
  • عدم وجود حفاظت JavaScript: اکثر داده‌ها از طریق درخواست HTTP ساده بدون مرورگر headless در دسترس هستند
  • مسدودسازی منطقه‌ای: برخی آگهی‌های شغلی فقط با IP منطقه خاص در دسترس هستند

برای Superjob پروکسی‌های مسکونی با چرخش هر 10-15 دقیقه و تاخیر بین درخواست‌ها 3-5 ثانیه کافی است. این امکان استخراج پایدار 500-1000 آگهی شغلی در روز را فراهم می‌کند.

LinkedIn: سخت‌ترین حفاظت

LinkedIn — این داستان جداگانه‌ای است. پلتفرم از الگوریتم‌های پیشرفته یادگیری ماشین برای شناسایی ربات‌ها استفاده می‌کند و یکی از تهاجمی‌ترین سیستم‌های حفاظتی را در میان همه شبکه‌های اجتماعی و job boards دارد.

ویژگی‌های حفاظت LinkedIn:

  • احراز هویت اجباری: اکثر داده‌ها فقط برای کاربران احراز هویت شده در دسترس هستند
  • تحلیل رفتاری: LinkedIn الگوهای اقدامات را تحلیل می‌کند: سرعت اسکرول، حرکات ماوس، زمان در صفحه
  • مسدودسازی حساب‌ها: در فعالیت مشکوک نه تنها IP بلکه خود حساب نیز مسدود می‌شود
  • محدودیت‌های مشاهده پروفایل: حساب‌های رایگان می‌توانند تعداد محدودی پروفایل را در ماه مشاهده کنند
  • اجرای اجباری JavaScript: بدون مرورگر headless استخراج غیرممکن است

استراتژی استخراج LinkedIn:

  1. از پروکسی‌های موبایل استفاده کنید — آن‌ها کمترین خطر مسدودسازی را دارند. یک IP موبایل را می‌توان برای 100-200 مشاهده پروفایل در روز استفاده کرد.
  2. مرورگر Headless اجباری است — از Puppeteer یا Playwright با تنظیم اثرانگشت واقعی مرورگر (رزولوشن صفحه، WebGL، Canvas) استفاده کنید.
  3. سرعت کند استخراج — حداکثر 20-30 پروفایل در ساعت با یک حساب. تاخیرهای 10-20 ثانیه بین مشاهدات اضافه کنید.
  4. شبیه‌سازی رفتار واقعی — اسکرول صفحه، کلیک‌های تصادفی، انتقال بین بخش‌های پروفایل.
  5. گرم کردن حساب‌ها — حساب‌های جدید LinkedIn را نمی‌توان بلافاصله برای استخراج استفاده کرد. نیاز به 1-2 هفته شبیه‌سازی فعالیت کاربر عادی است.
  6. چرخش حساب‌ها — از چندین حساب با پروکسی‌های مختلف استفاده کنید تا بار را توزیع کنید.

استخراج LinkedIn — سخت‌ترین وظیفه در میان همه job boards است. اگر به داده‌های این پلتفرم نیاز دارید، استفاده از Sales Navigator API رسمی یا سرویس‌های شخص ثالثی که داده‌ها را به صورت قانونی ارائه می‌دهند را در نظر بگیرید.

Job boards خارجی: Indeed، Glassdoor، Monster

پلتفرم‌های خارجی معمولاً حفاظت سخت‌تری نسبت به سایت‌های روسی (به جز hh.ru) دارند. ویژگی‌های اصلی:

  • Indeed — از Cloudflare با بررسی‌های JavaScript استفاده می‌کند. نیاز به مرورگر headless و پروکسی‌های مسکونی/موبایل از کشوری که آگهی‌های شغلی آن را استخراج می‌کنید دارد.
  • Glassdoor — نیاز به احراز هویت برای مشاهده اکثر داده‌ها دارد. به طور فعال IP های دیتاسنتر را مسدود می‌کند. از پروکسی‌های مسکونی و سرعت کند استخراج (تاخیر 8-12 ثانیه) استفاده کنید.
  • Monster — API برای شرکا دارد، اما برای استخراج HTML نیاز به پروکسی‌های مسکونی با اتصال جغرافیایی به کشور مورد نیاز دارد.

برای همه پلتفرم‌های خارجی اتصال جغرافیایی پروکسی بسیار مهم است. اگر آگهی‌های شغلی در ایالات متحده را استخراج می‌کنید، از IP های مسکونی آمریکایی استفاده کنید. درخواست‌ها با IP از کشورهای دیگر می‌توانند باعث سوءظن و منجر به مسدودسازی شوند.

تنظیم چرخش IP و تاخیرها بین درخواست‌ها

تنظیم صحیح چرخش پروکسی — کلید استخراج پایدار بدون مسدودسازی است. دو استراتژی اصلی را بررسی می‌کنیم: چرخش در هر درخواست و چرخش بر اساس زمان.

چرخش در هر درخواست (Rotating Proxies)

در این رویکرد هر درخواست HTTP با یک آدرس IP جدید انجام می‌شود. این ایمن‌ترین روش است، اما محدودیت‌هایی دارد:

مزایا:

  • ردیابی فعالیت یک IP غیرممکن است
  • می‌توان درخواست‌های بیشتری در واحد زمان انجام داد
  • نیازی به ردیابی محدودیت‌ها برای هر IP نیست

معایب:

  • حفظ نشست غیرممکن است (cookies هنگام تغییر IP از دست می‌روند)
  • برای استخراج با احراز هویت مناسب نیست
  • برخی سایت‌ها درخواست‌ها را مسدود می‌کنند اگر IP خیلی سریع تغییر کند

چرخش در هر درخواست برای استخراج صفحات عمومی hh.ru و Superjob بدون احراز هویت مناسب است. از طریق پارامتر ارائه‌دهنده پروکسی تنظیم می‌شود (معمولاً این یک endpoint خاص با چرخش خودکار است).

چرخش بر اساس زمان (Sticky Sessions)

در این رویکرد یک IP برای مدت زمان مشخصی (5-30 دقیقه) استفاده می‌شود، سپس تغییر خودکار اتفاق می‌افتد. این گزینه بهینه برای اکثر وظایف استخراج job boards است.

بازه‌های توصیه شده چرخش:

سایت بازه چرخش حداکثر درخواست در IP تاخیر بین درخواست‌ها
hh.ru 5-10 دقیقه 60-80 4-8 ثانیه
Superjob 10-15 دقیقه 50-70 3-5 ثانیه
LinkedIn 30-60 دقیقه 20-40 10-20 ثانیه
Indeed 10-20 دقیقه 40-60 5-10 ثانیه
Glassdoor 15-30 دقیقه 30-50 8-12 ثانیه

تنظیم تاخیرهای تصادفی

تاخیر ثابت بین درخواست‌ها (مثلاً دقیقاً 5 ثانیه) برای سیستم‌های حفاظتی مشکوک به نظر می‌رسد. کاربر واقعی نمی‌تواند با چنین دقتی عمل کند. همیشه از تاخیرهای تصادفی در یک بازه استفاده کنید.

مثال‌های پیاده‌سازی تاخیرهای تصادفی:

// Python
import time
import random

# تاخیر از 4 تا 8 ثانیه
delay = random.uniform(4, 8)
time.sleep(delay)

# منطق پیچیده‌تر: گاهی مکث طولانی انجام می‌دهیم
if random.random() < 0.1:  # احتمال 10%
    time.sleep(random.uniform(15, 30))  # شبیه‌سازی حواس‌پرتی کاربر
else:
    time.sleep(random.uniform(4, 8))
// JavaScript / Node.js
const sleep = (min, max) => {
  const delay = Math.random() * (max - min) + min;
  return new Promise(resolve => setTimeout(resolve, delay * 1000));
};

// استفاده
await sleep(4, 8);  // تاخیر 4-8 ثانیه

// با احتمال مکث طولانی
if (Math.random() < 0.1) {
  await sleep(15, 30);  // احتمال 10% مکث طولانی
} else {
  await sleep(4, 8);
}

اضافه کردن مکث‌های تصادفی طولانی (15-30 ثانیه) با احتمال 5-10% رفتار استخراج‌کننده را حتی بیشتر شبیه کاربر واقعی می‌کند که ممکن است با تماس تلفنی یا وظیفه دیگری حواسش پرت شود.

مدیریت کپچا و سایر مسدودسازی‌ها

حتی با تنظیم صحیح پروکسی و تاخیرها ممکن است با کپچا یا انواع دیگر مسدودسازی‌ها مواجه شوید. بررسی می‌کنیم که چگونه به درستی به این موقعیت‌ها واکنش نشان دهیم.

انواع مسدودسازی‌های job boards

1. HTTP 429 Too Many Requests — رایج‌ترین نوع مسدودسازی. سایت صراحتاً اعلام می‌کند که شما محدودیت درخواست‌ها را رد کرده‌اید. معمولاً در هدر پاسخ Retry-After وجود دارد که مشخص می‌کند پس از چند ثانیه می‌توان درخواست را تکرار کرد.

چگونه مدیریت کنیم: فوراً پروکسی را تغییر دهید و IP فعلی را به لیست سیاه برای مدت زمان مشخص شده در Retry-After اضافه کنید (معمولاً 1-6 ساعت). اگر Retry-After وجود ندارد، IP را به لیست سیاه برای 2 ساعت اضافه کنید.

2. HTTP 403 Forbidden — IP در سطح سرور مسدود شده است. این مسدودسازی جدی‌تری است که می‌تواند از چند ساعت تا یک روز طول بکشد.

چگونه مدیریت کنیم: پروکسی را تغییر دهید و IP را به لیست سیاه بلندمدت اضافه کنید (24 ساعت). لاگ‌ها را تحلیل کنید: شاید خیلی تهاجمی استخراج می‌کنید یا از IP های دیتاسنتر جایی که نیاز به مسکونی است استفاده می‌کنید.

3. کپچا (CAPTCHA) — سایت بررسی "من ربات نیستم" را نشان می‌دهد. این به این معنی است که رفتار شما مشکوک به نظر رسیده، اما IP هنوز کاملاً مسدود نشده است.

چگونه مدیریت کنیم: سه گزینه وجود دارد:

  • تغییر پروکسی — ساده‌ترین روش. IP فعلی به لیست سیاه برای 6-12 ساعت اضافه می‌شود.
  • حل خودکار کپچا — استفاده از سرویس‌هایی مانند 2Captcha، Anti-Captcha، CapSolver. هزینه آن‌ها $1-3 برای 1000 حل است.
  • حل دستی — اگر استخراج از نظر زمانی حیاتی نیست، می‌توان کپچا را برای حل دستی به اپراتور ارسال کرد.

4. Cloudflare Challenge — بررسی JavaScript که نیاز به اجرای کد در مرورگر دارد. کتابخانه HTTP معمولی این بررسی را پاس نمی‌کند.

چگونه مدیریت کنیم: از مرورگر headless (Puppeteer، Playwright، Selenium) با تنظیم اثرانگشت واقعی استفاده کنید. کتابخانه‌هایی مانند puppeteer-extra-plugin-stealth به دور زدن تشخیص حالت headless کمک می‌کنند.

یکپارچه‌سازی سرویس‌های حل کپچا

اگر تصمیم گرفتید کپچا را به صورت خودکار حل کنید، در اینجا مثالی از یکپارچه‌سازی با سرویس محبوب 2Captcha آورده شده است:

// Python با استفاده از کتابخانه 2captcha-python
from twocaptcha import TwoCaptcha
import requests

solver = TwoCaptcha('YOUR_API_KEY')

try:
    # حل reCAPTCHA v2
    result = solver.recaptcha(
        sitekey='6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
        url='https://hh.ru/search/vacancy',
        proxy={
            'type': 'HTTPS',
            'uri': 'login:password@ip:port'
        }
    )
    
    # دریافت توکن حل
    captcha_token = result['code']
    
    # ارسال درخواست با توکن
    response = requests.post(
        'https://hh.ru/search/vacancy',
        data={
            'g-recaptcha-response': captcha_token,
            # پارامترهای دیگر فرم
        },
        proxies={
            'http': 'http://login:password@ip:port',
            'https': 'http://login:password@ip:port'
        }
    )
    
except Exception as e:
    print(f'خطای حل کپچا: {e}')

حل یک کپچا 10-30 ثانیه طول می‌کشد و حدود $0.001-0.003 هزینه دارد. برای استخراج مقیاس بزرگ این می‌تواند گران باشد، بنابراین بهتر است استخراج را طوری تنظیم کنید که کپچا تا حد امکان کمتر ظاهر شود.

سیستم نظارت و هشدارها

برای کار پایدار استخراج‌کننده مهم است که نظارت بر مسدودسازی‌ها و هشدارهای خودکار را تنظیم کنید:

چه چیزی را ردیابی کنیم:

  • درصد درخواست‌های موفق — اگر زیر 90% بیفتد، نیاز به بررسی پروکسی و تنظیمات دارد
  • تعداد کپچا در ساعت — اگر بیش از 5-10 باشد، خیلی تهاجمی استخراج می‌کنید
  • میانگین سرعت پاسخ پروکسی — اگر به طور ناگهانی افزایش یافت، احتمالاً پروکسی‌ها بارگذاری بیش از حد شده‌اند
  • تعداد خطاهای 429/403 — شاخص کیفیت پروکسی و صحت تنظیمات
  • لیست IP های مسدود شده — اگر یک IP به طور مداوم مسدود می‌شود، آن را از استخر حذف کنید

ارسال اعلان‌ها (Telegram، email، Slack) را تنظیم کنید اگر درصد درخواست‌های موفق زیر مقدار آستانه بیفتد. این امکان واکنش سریع به مشکلات و عدم اتلاف زمان استخراج را فراهم می‌کند.

پیکربندی پروکسی در ابزارهای محبوب استخراج

بررسی می‌کنیم که چگونه پروکسی را در محبوب‌ترین ابزارها برای استخراج job boards تنظیم کنیم: Python (requests، Scrapy)، Node.js (axios، Puppeteer) و راه‌حل‌های آماده.

Python: requests و Scrapy

Python — محبوب‌ترین زبان برای استخراج به لطف کتابخانه‌های requests، BeautifulSoup و Scrapy است.

مثال با کتابخانه requests:

import requests
import random
import time

# لیست پروکسی (از ارائه‌دهنده دریافت کنید)
PROXIES = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# لیست User-Agent برای چرخش
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]

def parse_vacancy(url):
    proxy = random.choice(PROXIES)
    user_agent = random.choice(USER_AGENTS)
    
    headers = {
        'User-Agent': user_agent,
        'Accept': 'text/html,application/xhtml+xml',
        'Accept-Language': 'ru-RU,ru;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive'
    }
    
    proxies = {
        'http': proxy,
        'https': proxy
    }
    
    try:
        response = requests.get(
            url,
            headers=headers,
            proxies=proxies,
            timeout=30
        )
        
        if response.status_code == 200:
            return response.text
        elif response.status_code == 429:
            print(f'محدودیت نرخ برای {proxy}، تغییر پروکسی')
            # پروکسی را موقتاً از لیست حذف می‌کنیم
            return None
        else:
            print(f'خطا {response.status_code}')
            return None
            
    except Exception as e:
        print(f'خطای درخواست: {e}')
        return None

# استفاده
for i in range(100):
    html = parse_vacancy('https://hh.ru/vacancy/123456')
    if html:
        # پردازش داده‌ها
        pass
    
    # تاخیر تصادفی
    time.sleep(random.uniform(4, 8))

مثال تنظیم Scrapy:

# settings.py

# فعال‌سازی پشتیبانی پروکسی
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'scrapy_rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'scrapy_rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# لیست پروکسی
ROTATING_PROXY_LIST = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# تشخیص خودکار مسدودسازی
ROTATING_PROXY_BAN_POLICY = 'scrapy_rotating_proxies.policy.BanDetectionPolicy'

# تاخیر بین درخواست‌ها
DOWNLOAD_DELAY = 5
RANDOMIZE_DOWNLOAD_DELAY = True  # تاخیر تصادفی ±50%

# چرخش User-Agent
DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})

# حداکثر درخواست‌های همزمان
CONCURRENT_REQUESTS = 4
CONCURRENT_REQUESTS_PER_DOMAIN = 1

Node.js: Puppeteer با پروکسی

برای استخراج سایت‌ها با JavaScript (LinkedIn، Indeed) نیاز به مرورگر headless است. Puppeteer — محبوب‌ترین راه‌حل برای Node.js است.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// پلاگین برای دور زدن تشخیص مرورگر headless
puppeteer.use(StealthPlugin());

async function parseWithProxy() {
  const proxy = 'http://user:[email protected]:8080';
  
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      `--proxy-server=${proxy}`,
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-blink-features=AutomationControlled'
    ]
  });
  
  const page = await browser.newPage();
  
  // تنظیم User-Agent واقعی
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  );
  
  // تنظیم...

نتیجه‌گیری و توصیه‌ها

استخراج موفق job boards نیازمند رویکرد جامع است: انتخاب صحیح نوع پروکسی، تنظیم دقیق چرخش و تاخیرها، نظارت بر مسدودسازی‌ها و آمادگی برای تطبیق با تغییرات در سیستم‌های حفاظتی. پروکسی‌های مسکونی با چرخش IP هر 5-10 دقیقه و تاخیرهای تصادفی 4-8 ثانیه — این فرمول استاندارد برای استخراج پایدار hh.ru و Superjob است. برای LinkedIn و پلتفرم‌های خارجی با حفاظت سخت، پروکسی‌های موبایل و مرورگرهای headless با شبیه‌سازی رفتار واقعی کاربر ضروری هستند. همیشه ابتدا بررسی کنید که آیا سایت API رسمی دارد — این می‌تواند راه‌حل قانونی‌تر و پایدارتری نسبت به استخراج HTML باشد.

```