

در این مقاله قدمبهقدم میخواهیم یک اسپایدر عملی با Scrapy بسازیم تا پروفایلهای عمومی شرکتها در LinkedIn را استخراج کند. اگر توسعهدهنده پایتون در سطح متوسط هستید، پس از خواندن این راهنما باید بتوانید:
ایده ساده است: فهرستی از آدرسهای پروفایل شرکت داشته باشیم، برای هر آدرس یک درخواست ارسال کنیم و در پاسخ HTML، با response.css دادهها را استخراج کنیم. در عمل باید با مواردی مثل المانهای گمشده، تغییرات ساختاری صفحه و محدودیت سرعت نیز برخورد کنیم.
import scrapy
class LinkedCompanySpider(scrapy.Spider):
name = 'linkedin_company_profile'
# فهرست اولیه آدرسهای شرکت (ورودی)
company_pages = [
'https://www.linkedin.com/company/usebraintrust/',
'https://www.linkedin.com/company/centraprise/',
]
def start_requests(self):
# هر URL را درخواست میکنیم؛ میتوانید هدر، کوکی یا روتر پراکسی را اینجا اضافه کنید
for url in self.company_pages:
yield scrapy.Request(url=url, callback=self.parse_response, meta={'source_url': url})
def parse_response(self, response):
# خروجی: یک دیکشنری با فیلدهای شرکت
company_item = {}
# فیلدهای پایه
company_item['name'] = response.css('.top-card-layout__entity-info h1::text').get(default='').strip()
company_item['summary'] = response.css('.top-card-layout__entity-info h4 span::text').get(default='').strip()
try:
details = response.css('.core-section-container__content .mb-2')
company_item['industry'] = details[1].css('.text-md::text').getall()[1].strip()
company_item['size'] = details[2].css('.text-md::text').getall()[1].strip()
company_item['founded'] = details[5].css('.text-md::text').getall()[1].strip()
except Exception:
# بررسیها و هشدارها؛ در تولید بهتر است لاگ و metric ارسال شود
self.logger.warning('Some company fields missing for %s', response.url)
yield company_item
توضیح اجزای مهم:
چند توصیه مهم که عملکرد و پایداری اسپایدر را بالا میبرد:
{
'name': 'Braintrust',
'summary': 'Braintrust is the first decentralized Web3 talent network ...',
'industry': 'Software Development',
'size': '11-50 employees',
'founded': '2018'
}
LinkedIn از ترکیبی از کنترل IP، هدرها، fingerprinting مرورگر و CAPTCHA برای شناسایی رباتها استفاده میکند. برای کاهش احتمال بلاک شدن میتوانید از ترکیب راهکارهای زیر استفاده کنید:
اگر نخواهید همه این موارد را خودتان پیاده کنید، میتوانید از راهکارهای پراکسیِ هوشمند استفاده کنید که مدیریت روتیشن، تشخیص بن و بایپس CAPTCHA را تسهیل میکنند. برای تست سریع، یک نمونه درخواست curl به API پراکسی میتواند به شکل زیر باشد:
curl 'https://proxy.example.io/v1/?api_key=YOUR_API_KEY&url=https://www.linkedin.com/in/reidhoffman/'
برای ادغام پراکسی با Scrapy معمولاً یک Downloader Middleware نصب و فعال میشود؛ همچنین باید کلید API و تنظیمات مرتبط را در محیط یا فایل تنظیمات نگهداری کنید.
نمونهای از نصب بستهها و تنظیمات اولیه در settings.py:
pip install scrapeops-scrapy
pip install scrapeops-scrapy-proxy-sdk
# settings.py (نمونه)
SCRAPEOPS_API_KEY = 'YOUR_API_KEY'
SCRAPEOPS_PROXY_ENABLED = True
DOWNLOADER_MIDDLEWARES = {
'scrapeops_scrapy_proxy_sdk.scrapeops_scrapy_proxy_sdk.ScrapeOpsScrapyProxySdk': 725,
}
EXTENSIONS = {
'scrapeops_scrapy.extension.ScrapeOpsMonitor': 500,
}
# در صورت نیاز، جایگزین کردن RetryMiddleware برای گزارشگیری بهتر
DOWNLOADER_MIDDLEWARES.update({
'scrapeops_scrapy.middleware.retry.RetryMiddleware': 550,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
})
توضیح: در نمونه بالا SCRAPEOPS_API_KEY را از متغیر محیطی یا سیستم مدیریت اسرار بارگذاری کنید تا کلید در کد ذخیره نشود.
مانیتورینگ در تولید بسیار مهم است: خطاهای 4xx/5xx، نرخ موفقیت صفحهها، میانگین زمان پاسخ و نرخ تبدیل (pages → items) را مانیتور کنید. ابزارهای مانیتورینگ مخصوص Scrapy میتوانند این متریکها را جمعآوری و هشدار ارسال کنند.
برای تولید معمولاً اسپایدر را در سرور یا سرویسهای ابری اجرا و زمانبندی میکنند. گزینهها:
مثال اجرای محلی:
scrapy crawl linkedin_company_profile
نکات عملی برای اجرا در کلود:
در این راهنما یک اسپایدر پایه برای استخراج پروفایلهای عمومی شرکت در LinkedIn با Scrapy نوشتیم، به روشهای مقابله با سیستمهای ضدربات پرداختیم و نکات عملی برای مانیتورینگ و عملیات در کلود را مرور کردیم. مهمترین نکات:
اگر میخواهید، میتوانم نسخهای از این اسپایدر را طوری تغییر دهم که خروجی در PostgreSQL یا یک فایل NDJSON بنویسد، یا نشان دهم چطور Playwright را برای رندر جاوااسکریپت به جریان کاری اضافه کنید.

