مقدمه
در این مقاله یاد میگیریم چگونه در یک اسکریپر مبتنی بر Pyppeteer از پراکسیها استفاده کنیم. هدف این راهنما طراحی اسکریپهای قابلاعتمادتر است: از افزودن یک پراکسی ساده تا استفاده از پراکسیهای احراز هویتشده و ادغام با پروکسیAPIها (proxy port). در پایان این مطلب شما قادر خواهید بود پراکسی را به مرورگر سرنشینشده توسط Pyppeteer اضافه کنید، احراز هویت را تنظیم کنید، و نکات عملی مربوط به performance، خطاها و امنیت را رعایت نمایید.
ایدهی کلی و چکلیست گامها
- پراکسی ساده: اضافه کردن --proxy-server به آرگومانهای launch.
- پراکسی احراز هویتشده: پس از ساخت صفحه با page.authenticate نامکاربری/رمز را ارسال کنید.
- پراکسی API مقابل proxy port: در صورت وجود از پورت پراکسی استفاده کنید تا مشکل لینکهای نسبی حل شود.
پراکسی HTTP ساده (بدون احراز هویت)
اگر پراکسی فقط یک آدرس IP:PORT دارد و نیاز به نامکاربری/رمز ندارد، سادهترین روش اضافه کردن آن به لیست آرگومانهای launch است. مثال زیر یک اسکریپ پایهٔ پایتون نشان میدهد:
import asyncio
from pyppeteer import launch
proxy_url = '11.456.448.110:8080'
launch_options = {
'args': [f'--proxy-server={proxy_url}']
}
async def main():
browser = await launch(launch_options)
page = await browser.newPage()
await page.goto('https://httpbin.org/ip')
page_content = await page.evaluate('() => document.body.innerText')
print(page_content)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
توضیح کد:
- proxy_url: آدرس پراکسی به صورت IP:PORT یا host:port. این ورودی توسط آرگومان --proxy-server به کروم داده میشود.
- launch_options: دیکشنریای که هنگام launch به Pyppeteer پاس داده میشود؛ مهمترین قسمت همین لیست args است.
- در main ابتدا مرورگر را راهاندازی میکنیم، یک صفحه جدید میسازیم، به یک سرویس تستی میرویم و خروجی IP را میخوانیم.
- خروجی: صفحهٔ httpbin نشان میدهد درخواستها از آدرس پراکسی ارسال شدهاند.
پراکسیهای احراز هویتشده (username/password)
برای سرویسهایی که نیاز به احراز هویت دارند، باز هم --proxy-server را استفاده میکنیم اما قبل از درخواست به وبسایت باید page.authenticate را فراخوانی کنیم تا مرورگر بتواند با آن پراکسی لاگین کند.
import asyncio
from pyppeteer import launch
proxy_url = '201.88.548.330:8080'
username = 'PROXY_USERNAME'
password = 'PROXY_PASSWORD'
launch_options = {
'args': [f'--proxy-server={proxy_url}']
}
async def main():
browser = await launch(launch_options)
page = await browser.newPage()
await page.authenticate({'username': username, 'password': password})
await page.goto('https://httpbin.org/ip')
print(await page.evaluate('() => document.body.innerText'))
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
شرح نکات فنی و امنیتی:
- page.authenticate باید قبل از درخواستهایی که به اینترنت میزنید انجام شود، تا کروم هنگام برقراری اتصال پراکسی، هدرهای احراز هویت را ارسال کند.
- نامکاربری و رمز را هرگز در سورس کنترل ذخیره نکنید؛ از متغیرهای محیطی یا سرویسهای مدیریت secret استفاده کنید.
- در برخی پیادهسازیها، اگر پراکسی از نوع NTLM یا پروتکلهای خاص دیگری استفاده کند، ممکن است نیاز به پیکربندی اضافه یا استفاده از یک لایهٔ میانی (مانند یک proxy agent) داشته باشید.
ادغام Proxy APIها و تفاوت proxy port با endpoint
چندین سرویس پراکسی امروزه یک API هوشمند فراهم میکنند که روتیشن، تشخیص بن و retry را مدیریت میکند. این سرویسها معمولا دو روش میدهند: ارسال درخواست به یک endpoint یا اتصال به یک پورت پراکسی.
مشکل اصلی استفاده از endpoint مستقیم با مرورگرهای headless زمانی رخ میدهد که سایت از لینکهای نسبی استفاده میکند؛ Pyppeteer ممکن است آدرس نسبی را به آدرس endpoint متصل کند و صفحه درست لود نشود. به همین دلیل، اگر سرویس پراکسی، گزینهٔ proxy port را دارد، آن را ترجیح دهید چون مثل یک پراکسی سنتی عمل میکند و کمتر با مسائل لینک نسبی درگیر میشوید.
import asyncio
from pyppeteer import launch
proxy_url = 'proxy.scrapeops.io:5353' # مثال proxy port
SCRAPEOPS_API_KEY = 'YOUR_API_KEY'
launch_options = {
'args': [f'--proxy-server={proxy_url}']
}
async def main():
browser = await launch({**launch_options, 'ignoreHTTPSErrors': True})
page = await browser.newPage()
# نامکاربری معمول برای این نوع ادغام ممکن است ثابت باشد
await page.authenticate({'username': 'scrapeops', 'password': SCRAPEOPS_API_KEY})
await page.goto('https://httpbin.org/ip')
print(await page.evaluate('() => document.body.innerText'))
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
نکتهٔ مهم: هنگام کار با برخی proxy APIها نیاز است که ignoreHTTPSErrors: true تنظیم شود تا اشکالات گواهینامهٔ SSL که بهخاطر واسط پراکسی ایجاد میشود، مانع لود صفحه نشوند.
نکات عملی، بهینهسازی و رفع خطا
- Retry و backoff: برای درخواستهای شکستخورده از استراتژی retry با افزایش تاخیر (exponential backoff) استفاده کنید تا از بلوکه شدنهای موقتی جلوگیری شود.
- همزمانی: اگر قصد دارید چند تب/instance همزمان باز کنید، پهنای باند، میزان اتصال به پراکسی و نرخ درخواستها را کنترل کنید تا سرویس پراکسی دچار throttle نشود.
- هدرها و fingerprint: پراکسی به تنهایی کافی نیست؛ برای فرار از تشخیص بهتر است هدرهای مرورگر و رفتار (mouse, viewport, timeouts) را شبیه مرورگر واقعی کنید.
- لاگگیری: لاگ IPهای خروجی، وضعیت پاسخ و زمان پاسخ را ثبت کنید تا در صورت بروز بن یا خطا سریع تشخیص دهید مشکل از پراکسی است یا خود سایتِ هدف.
- مدیریت secrets: کلیدها و رمزها را در متغیر محیطی یا سرویس مدیریت کلید ذخیره کنید، نه در کد منبع.
موارد رایج خطا و نحوهٔ عیبیابی
- صفحه لود نمیشود یا لینکهای نسبی مشکل دارند: از proxy port استفاده کنید یا یک درخواست اولیه بدون تغییر مسیر نسبی بسازید.
- احراز هویت پراکسی خطا میدهد: مطمئن شوید page.authenticate قبل از فراخوانی page.goto اجرا شده و رمز/نامکاربری صحیح است.
- خطاهای SSL: از ignoreHTTPSErrors: true فقط در شرایط لازم استفاده کنید و پیامدهای امنیتی آن را درک کنید.
- سرعت پایین یا زمانبر بودن پاسخ: محدودیت همزمانی را کم کنید، یا از pool پراکسی بزرگتری استفاده کنید.
جمعبندی و توصیهها
اضافه کردن پراکسی به Pyppeteer در اغلب موارد کافیست برای تغییر IP خروجی و کاهش احتمال بن شدن، اما برای پایداری بالا ترکیب چند تکنیک لازم است: استفاده از proxy port زمانی که در دسترس است، مدیریت همزمانی، پیادهسازی retry/ backoff و نگهداری امن کلیدها. همیشه قبل از اجرای گسترده، سناریوهای real-world را با چند آدرس تست کنید تا رفتار سایت هدف تحت پراکسی را بشناسید.
نکات سریع برای اجرا:
- برای پراکسی ساده: --proxy-server کافی است.
- برای پراکسی احراز هویت: از page.authenticate استفاده کنید.
- اگر سرویس پراکسی API دارد و مشکل لینک نسبی دارید، از proxy port استفاده کنید.
- رمزها را امن نگه دارید و از لاگگیری هوشمند برای عیبیابی بهره ببرید.
با رعایت این اصول میتوانید اسکریپهای Pyppeteer قابلاعتمادتری بنویسید که هم از نظر پایداری و هم از نظر امنیت مناسبتر باشند.





