مقدمه
در این راهنمای عملی دربارهٔ نحوهٔ کار با User-Agentها در اسکریپینگ با Selenium صحبت میکنیم. هدف این مقاله این است که شما در پایان بدانید User-Agent چیست، چرا باید آن را جعل (fake) کرد، چگونه در Selenium آن را تنظیم کنید و چه نکات عملی، امنیتی و عملکردی را باید رعایت کنید. مثالهای کد پایتون، روشهای خودکارسازی چرخش User-Agent و نحوهٔ گرفتن رشتههای User-Agent از API هم پوشش داده شدهاند.
User-Agent چیست؟
رشتهٔ User-Agent یک متن کوتاه است که مرورگر هنگام ارسال درخواست HTTP به سرور میفرستد و شامل اطلاعاتی مثل نوع مرورگر، نسخه، سیستمعامل و برخی مشخصههای دیگر است. نمونهها معمولاً شبیه اینها هستند:
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:119.0) Gecko/20100101 Firefox/119.0'
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
این رشتهها به سایت کمک میکنند تا نسخهٔ مناسب رابط را به کاربر نشان دهد یا برای تحلیل ترافیک استفاده شود. اما از آنجا که سایتها ممکن است براساس این رشته تشخیص دهند که موتور خودکار در کار است، تغییر آگاهانهٔ User-Agent یکی از تکنیکهای پایه در اسکریپینگ است.
Fake User-Agents و کاربردشان
«Fake User-Agent» یعنی تنظیم رشتهای متفاوت یا تصادفی بهجای رشتهٔ پیشفرض مرورگر. دلایل متداول عبارتاند از:
- مقلد رفتار انسانی: کاهش احتمال تشخیص توسط سیستمهای ضدبات با نشان دادن مقادیر متنوع و منطقی.
- دورزدن محدودیتها: دسترسی به نسخههای موبایل یا منطقهای از سایت که با UA متفاوت نمایش داده میشوند.
- حفظ حریم خصوصی: اجتناب از ارسال مشخصات واقعی دستگاه روی هر درخواست.
توجه کنید که جعل UA تنها یکی از لایههاست؛ سایتهای پیشرفته از ترکیبی از شاخصها (مثلاً navigator.webdriver، اندازه پنجره، الگوی درخواستها، کوکیها و رفتار ماوس/صفحهکلید) برای تشخیص استفاده میکنند.
تنظیم دستی User-Agent در Selenium (ChromeOptions)
ایدهٔ کلی: با ساختن یک شیء ChromeOptions و اضافهکردن آرگومان '--user-agent'، رشتهٔ UA را به مرورگر اعلام میکنیم. مثال سادهٔ پایتون:
from selenium import webdriver
from time import sleep
options = webdriver.ChromeOptions()
# رشتهٔ UA دلخواه را اینجا تنظیم کنید
user_agent_string = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
options.add_argument(f'--user-agent={user_agent_string}')
driver = webdriver.Chrome(options=options)
try:
driver.get('https://example.com')
sleep(3)
driver.save_screenshot('fake-os.png')
finally:
driver.quit()
توضیح ورودیها و خروجیها:
- ورودیها: رشتهٔ user_agent_string؛ کلاس ChromeOptions.
- خروجی: یک نشست Chrome با UA مشخص شده و تصویر صفحه ذخیرهشده.
گامبهگام:
- ساختن ChromeOptions() برای تغییر آرگومانهای اجرای Chrome.
- اضافهکردن آرگومان '--user-agent=...' که مرورگر را با UA دلخواه راهاندازی میکند.
- ایجاد webdriver.Chrome(options=...) و بازدید صفحه.
هشدار: اگر UA اعلامشده با سایر شاخصهای جلسه (مثلاً اطلاعات پلتفرم، هدرهای Accept-Language، ویژگیهای JavaScript) همخوانی نداشته باشد، سایتها میتوانند تناقض را تشخیص دهند و شما را بلاک کنند.
چرخاندن Random User-Agent با کتابخانه fake_useragent
این کتابخانه بهصورت محلی لیستی از رشتههای واقعی مرورگر را فراهم میکند و API سادهای برای گرفتن یک UA تصادفی دارد. نصب با pip و نمونهٔ استفاده:
pip install fake-useragent
from selenium import webdriver
from fake_useragent import UserAgent
from time import sleep
ua = UserAgent()
options = webdriver.ChromeOptions()
options.add_argument(f'--user-agent={ua.random}')
driver = webdriver.Chrome(options=options)
try:
driver.get('https://example.com')
sleep(3)
driver.save_screenshot('random-fake.png')
finally:
driver.quit()
نکات عملی:
- ua.random یک رشتهٔ User-Agent میدهد؛ ممکن است هر اجرا متفاوت باشد.
- در سرورهای CI یا محیطهایی که دسترسی به اینترنت محدود است، این کتابخانه ممکن است نتواند بهدرستی کار کند زیرا برخی انواع آن هنگام اجرا سعی میکنند منابع آنلاین را fetch کنند.
استفاده از undetected_chromedriver
این پکیج تلاش میکند تا اثرات اتوماسیون در Chrome را کمتر نشان دهد (برای مثال حذف یا تغییر فلگهایی که نشاندهندهٔ webdriver بودن هستند). مثال ساده و سپس تنظیم UA در آن:
pip install undetected-chromedriver
import undetected_chromedriver as uc
from fake_useragent import UserAgent
ua = UserAgent()
options = uc.ChromeOptions()
options.add_argument(f'--user-agent={ua.random}')
driver = uc.Chrome(options=options)
try:
driver.get('https://example.com')
driver.save_screenshot('undetected-fake.png')
finally:
driver.quit()
نکات:
- undetected_chromedriver ممکن است برای برخی سایتها اثرگذار باشد اما تضمینی نیست؛ سایتها دائماً تکنیکهای جدید تشخیص را پیاده میکنند.
- حتماً نسخهٔ Chrome و درایور را سازگار نگه دارید تا خطاهای ناسازگاری رخ ندهد.
گرفتن User-Agent از یک API با requests
اگر میخواهید مجموعهٔ کنترلشدهای از UAها داشته باشید یا از یک سرویس مرکزی دریافت کنید، میتوانید از یک API استفاده کنید و سپس یکی را انتخاب کرده و در Selenium بگذارید. مثال با requests:
from selenium import webdriver
import requests
from random import randint
API_KEY = 'YOUR-SUPER-SECRET-API-KEY'
# نمونهٔ درخواست به یک API که لیست UA بازمیگرداند
response = requests.get(f'http://headers.example.api/v1/user-agents?api_key={API_KEY}')
results_list = response.json()['result']
random_agent = results_list[randint(0, len(results_list) - 1)]
options = webdriver.ChromeOptions()
options.add_argument(f'--user-agent={random_agent}')
driver = webdriver.Chrome(options=options)
try:
driver.get('https://example.com')
driver.save_screenshot('user-agents-api.png')
finally:
driver.quit()
توضیحات فنی:
- requests.get یک Response برمیگرداند؛ با .json() معمولاً یک دیکشنری پایتون دریافت میکنیم.
- با انتخاب تصادفی یک ایندکس، میتوانیم UAها را توزیع کنیم تا الگوی ثابت ایجاد نشود.
عیبیابی و بهترین روشها
مشاهدههای کلیدی و توصیهها:
- همخوانی UA با مرورگر واقعی: اگر از Chrome استفاده میکنید، UA انتخابی باید Chrome را گزارش کند؛ اگر اختلاف داشته باشد، احتمال تشخیص بالاتر میرود.
- چرخش منطقی: هر درخواست UA جدید ندهید؛ نرخ چرخش را تنظیم کنید تا رفتاری طبیعیتر بهنظر برسد (مثلاً هر نشست یا هر N درخواست).
- محدودیت سرعت و backoff: برای جلوگیری از بلاک شدن از تأخیرهای تصادفی، الگوریتمهای backoff و retry استفاده کنید.
- هدرهای مکمل: همراه UA هدرهای دیگری مثل Accept-Language، Referer و Cookieهای منطقی نیز بفرستید. هدرها باید با هم همخوانی داشته باشند.
- شبیهسازی ویژگیهای جاوااسکریپت: برخی تفاوتها را میتوان با اجرای اسکریپتهای کوتاه در صفحه (مثل تغییر navigator.platform یا حذف navigator.webdriver) اصلاح کرد، اما این روشها باید با احتیاط و آگاهی از پیامدهای قانونی استفاده شوند.
- پروکسی و توزیع IP: اگر درخواستها از یک IP ثابت بیایند، چرخش UA کمکی نخواهد کرد؛ استفاده از پروکسی یا استخر آیپی معمولاً ضروری است.
- ثبت و مانیتورینگ: لاگگیری از UAهای استفادهشده، نرخ خطاها و پاسخهای 4xx/5xx کمک میکند الگوهای بلاک را شناسایی کنید.
نکات امنیتی و قانونی
تغییر User-Agent از منظر فنی ساده است، اما همیشه از لحاظ قانونی و اخلاقی بررسی کنید که دادههایی که اسکریپ میکنید قابل دسترسی هستند و قوانین سرویس/وبسایت را نقض نمیکنید. استفادهٔ نادرست از تکنیکهای دورزدن میتواند عواقب حقوقی یا اخراج از سرویس را بهدنبال داشته باشد.
جمعبندی
تنظیم و مدیریت User-Agent بخشی اساسی از یک استراتژی اسکریپینگ مقاوم است. روشها از تغییر دستی در ChromeOptions تا استفاده از کتابخانههایی مانند fake_useragent و ابزارهایی مانند undetected_chromedriver متغیر است. همیشه سعی کنید UA با دیگر مشخصههای جلسه همخوانی داشته باشد، نرخها را محدود کنید، از پروکسی و مانیتورینگ استفاده نمایید و پیش از هر اقدامی جوانب قانونی و اخلاقی را بررسی کنید.
آسان اسکریپ را در گوگل بهعنوان منبع ترجیحی انتخاب کن
مقالههای جدید ما زودتر و پررنگتر در نتایج گوگل و Discover برایت نمایش داده میشود. افزودن از تنظیمات گوگل





