FA-TOOLS — Header Component

آموزش web scraping با BeautifulSoup و پایتون

سلام رفیق برنامه‌نویس! اگه دنبال راهی هستی که بتونی اطلاعات بی‌شماری رو از وب‌سایت‌ها جمع‌آوری کنی و ازشون برای پروژه‌ها یا تحلیل‌هات استفاده کنی، جای درستی اومدی. وب اسکرپینگ (Web Scraping) دقیقاً همون چیزیه که بهت کمک می‌کنه دنیای داده‌های آنلاین رو به زبون خودت دربیاری. ما اینجا قراره با دو تا از بهترین ابزارهای پایتون، یعنی BeautifulSoup و کتابخانه requests، یه سفر جذاب به عمق صفحات وب داشته باشیم. این مسیر ممکنه چالش‌هایی داشته باشه، ولی نگران نباش؛ قدم به قدم با هم میریم جلو تا بتونی هر داده‌ای رو که نیاز داری، شکار کنی. همین الان می‌تونی برای ابزارها و کدهای آماده‌ای که کارت رو سریع‌تر می‌کنن، یه سر به فروشگاه ابزارها و اسنیپت‌های FA Tools بزنی و بهترین‌ها رو برای خودت پیدا کنی!

✨ نقشه راه Web Scraping شما در یک نگاه ✨

آموزش web scraping با BeautifulSoup و پایتون — تصویر 1

🔗 مرحله ۱: آماده‌سازی

  • ▪️ نصب پایتون
  • ▪️ نصب requests و BeautifulSoup
  • ▪️ آشنایی اولیه با HTML

🌍 مرحله ۲: درخواست صفحه (Requests)

  • ▪️ ارسال درخواست HTTP
  • ▪️ مدیریت پاسخ‌ها
  • ▪️ تنظیم User-Agent

🔍 مرحله ۳: تحلیل HTML (BeautifulSoup)

  • ▪️ ساخت شیء Soup
  • ▪️ پیدا کردن تگ‌ها (find, find_all)
  • ▪️ استخراج ویژگی‌ها و متن

⚙️ مرحله ۴: موارد پیشرفته و عیب‌یابی

  • ▪️ مدیریت صفحات پویا (JS)
  • ▪️ مقابله با بلاک شدن
  • ▪️ خطاهای رایج و راه‌حل‌ها

هدف: جمع‌آوری موثر داده از وب برای تحلیل یا استفاده در پروژه‌ها.

مقدمه‌ای بر وب اسکرپینگ: چرا و چطور؟

آموزش web scraping با BeautifulSoup و پایتون — تصویر 2

وب اسکرپینگ یعنی فرآیند استخراج خودکار داده‌ها از وب‌سایت‌ها. فکر کن یه عالمه اطالاعات توی صفحات وب هست که می‌خوای جمع‌آوریشون کنی، مثلاً قیمت محصولات، آمار ورزشی، یا حتی لیست مقالات یه وبلاگ. به جای اینکه ساعت‌ها وقت بذاری و تک‌تک کپی پیست کنی، می‌تونی یه اسکریپت پایتون بنویسی که این کار رو برات انجام بده. اینجوری هم در وقتت صرفه‌جویی میشه و هم داده‌هایی دقیق‌تر و قابل‌پردازش‌تر داری.

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

  • Requests: این کتابخانه مثل یه مرورگر کوچیک عمل می‌کنه که می‌تونه درخواست‌های HTTP به سرورها بفرسته و صفحات وب رو برات دانلود کنه.
  • BeautifulSoup: بعد از اینکه Requests صفحه رو دانلود کرد، BeautifulSoup میاد و کد HTML اون صفحه رو برات خرد و تحلیل می‌کنه تا بتونی اطلاعات مورد نظرت رو از دل اون بیرون بکشی.

گام اول: آماده‌سازی محیط کار

آموزش web scraping با BeautifulSoup و پایتون — تصویر 3

نصب پایتون و کتابخانه‌های ضروری

قبل از هر کاری، مطمئن شو که پایتون روی سیستمت نصبه. اگه نیست، از سایت رسمی پایتون (python.org) دانلود و نصبش کن. بعدش با استفاده از pip، کتابخانه‌های requests و BeautifulSoup رو نصب می‌کنیم.

pip install requests beautifulsoup4

این دستور هر دو کتابخانه رو برات نصب می‌کنه. حالا آماده‌ایم برای غواصی توی دنیای وب! اگه دنبال کدهای آماده و بهینه برای پایتون می‌گردی که کارت رو جلو بندازه، حتماً یه سر به بخش اسنیپت‌های پایتون ما بزن.

آشنایی مختصر با ساختار HTML

برای اینکه بتونی با BeautifulSoup کار کنی، لازمه یه آشنایی اولیه با HTML داشته باشی. HTML زبانیه که صفحات وب باهاش ساخته میشن و از تگ‌ها (tags) برای سازماندهی محتوا استفاده می‌کنه. مثلاً <p> برای پاراگراف، <h1> برای عنوان اصلی، <a> برای لینک و <div> برای تقسیم‌بندی کلی. هر تگ می‌تونه ویژگی‌هایی (attributes) مثل class یا id داشته باشه که برای شناسایی اون عنصر خیلی مهمن.

اگه می‌خوای در مورد HTML بیشتر بدونی و اسنیپت‌های کاربردی ببینی، اینجا می‌تونی کلی مطلب مفید پیدا کنی.

گام دوم: ارسال درخواست و دریافت صفحه با Requests

حالا که ابزارهامون آماده‌ست، وقتشه بریم سراغ اولین قدم: گرفتن محتوای یه صفحه وب. کتابخانه requests این کار رو خیلی راحت برامون انجام میده.

اولین درخواست وب شما

برای ارسال یه درخواست ساده GET به یه وب‌سایت، کافیه URL مورد نظر رو به تابع requests.get() بدی.

import requests

url = "http://quotes.toscrape.com/"
response = requests.get(url)

if response.status_code == 200:
    # محتوای HTML صفحه
    html_content = response.text
    print("صفحه با موفقیت دریافت شد!")
    # print(html_content[:500]) # 500 کاراکتر اول برای تست
else:
    print(f"مشکلی پیش آمد: {response.status_code}")

کد وضعیت 200 یعنی درخواست موفقیت‌آمیز بوده. اگه کد دیگه‌ای مثل 403 (Forbidden) یا 404 (Not Found) دیدی، یعنی مشکلی وجود داره.

تنظیم User-Agent برای درخواست‌های دوستانه‌تر

بعضی وب‌سایت‌ها درخواست‌هایی که از اسکریپت‌ها میان رو بلاک می‌کنن. برای اینکه خودت رو شبیه به یه مرورگر واقعی نشون بدی، می‌تونی هدر User-Agent رو تنظیم کنی. این کار می‌تونه جلوی بلاک شدن موقت رو بگیره.

import requests

url = "http://quotes.toscrape.com/"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)

if response.status_code == 200:
    print("درخواست با User-Agent موفقیت آمیز بود.")
else:
    print(f"مشکلی پیش آمد: {response.status_code}")

یادت باشه که User-Agent رو از مرورگر خودت برداری تا واقعی‌تر به نظر برسه.

گام سوم: تحلیل و استخراج داده با BeautifulSoup

بعد از اینکه محتوای HTML صفحه رو با Requests گرفتیم، حالا نوبت BeautifulSoupه که وارد عمل بشه و این متن خام رو تبدیل به یه ساختار قابل‌فهم کنه تا بتونیم اطلاعات مورد نیاز رو ازش استخراج کنیم.

ساخت شیء Soup (سوپ!)

اولین کاری که باید بکنیم اینه که محتوای HTML رو به BeautifulSoup بدیم تا اونو تجزیه (parse) کنه.

from bs4 import BeautifulSoup
import requests

url = "http://quotes.toscrape.com/"
response = requests.get(url)
html_content = response.text

# ایجاد شیء BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
print("شیء سوپ با موفقیت ایجاد شد.")

پارامتر 'html.parser' به BeautifulSoup میگه که از پایتون برای تجزیه HTML استفاده کنه.

پیدا کردن عناصر با find و find_all

حالا که شیء soup رو داریم، می‌تونیم با استفاده از متدهای find() و find_all() عناصر مورد نظرمون رو پیدا کنیم.

  • find(): اولین عنصری که با معیارهای ما مطابقت داره رو برمی‌گردونه.
  • find_all(): تمام عناصر مطابقت‌یافته رو در قالب یه لیست برمی‌گردونه.

پیدا کردن تگ‌ها بر اساس نام

مثلاً برای پیدا کردن تمام تگ‌های <a>:

all_links = soup.find_all('a')
print(f"تعداد لینک‌ها: {len(all_links)}")
for link in all_links[:5]: # چاپ 5 لینک اول
    print(link.get('href'))

پیدا کردن تگ‌ها بر اساس ویژگی‌ها (class, id)

رایج‌ترین روش برای پیدا کردن عناصر، استفاده از class و id اوناست.

برای مثال، فرض کنیم می‌خوایم نقل قول‌ها رو از سایت quotes.toscrape.com استخراج کنیم. با بررسی سورس صفحه (Right Click -> Inspect Element)، می‌بینیم که هر نقل قول داخل یه <div class="quote"> قرار داره.

quotes = soup.find_all('div', class_='quote')

for quote in quotes:
    text = quote.find('span', class_='text').text
    author = quote.find('small', class_='author').text
    tags_elements = quote.find('div', class_='tags').find_all('a', class_='tag')
    tags = [tag.text for tag in tags_elements]

    print(f"نقل قول: {text}")
    print(f"نویسنده: {author}")
    print(f"تگ‌ها: {', '.join(tags)}n")

در اینجا، class_ یه پارامتر خاص در BeautifulSoup هست که بهش می‌گه دنبال تگی بگرده که ویژگی class اون برابر با مقدار داده‌شده باشه. بعد از پیدا کردن هر div نقل قول، باز هم با find و find_all جزئیات داخلش (متن، نویسنده، تگ‌ها) رو استخراج می‌کنیم.

نکته مهم: برای پیدا کردن بهترین Selectorها (مثل class یا id) همیشه باید از ابزار Inspect Element مرورگرت استفاده کنی. روی عنصر مورد نظر راست‌کلیک کن و ‘Inspect’ یا ‘Inspect Element’ رو انتخاب کن تا کد HTML اون رو ببینی.

مقایسه روش‌های پیدا کردن عناصر در BeautifulSoup

BeautifulSoup چند روش مختلف برای پیدا کردن عناصر در اختیارمون میذاره که هر کدوم کاربرد خاص خودشون رو دارن. در این جدول یه مقایسه سریع از رایج‌ترین اونها رو می‌بینی:

روش کاربرد
soup.find('tag') پیدا کردن اولین تگ با نام مشخص.
soup.find_all('tag') پیدا کردن تمام تگ‌ها با نام مشخص (برمی‌گرداندن لیست).
soup.select('CSS selector') استفاده از سلکتورهای CSS (مثل .class, #id, tag > child). قوی‌تر و منعطف‌تر.
element.get('attribute') استخراج مقدار یک ویژگی (مثل href برای لینک‌ها یا src برای تصاویر).
element.text یا element.string استخراج متن داخل یک تگ (.text متن تمام فرزندان را برمی‌گرداند، .string فقط متن مستقیم).

گام چهارم: موارد پیشرفته و ملاحظات اخلاقی

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

مدیریت صفحات پویا (JavaScript Rendered Content)

خیلی از وب‌سایت‌های امروزی محتواشون رو با جاوااسکریپت بارگذاری می‌کنن. یعنی وقتی Requests یه صفحه رو می‌گیره، فقط کد HTML اولیه رو می‌بینه و محتوایی که با JS ساخته میشه (مثل نظرات، لود شدن بی‌نهایت اسکرول، یا قیمت‌های لحظه‌ای) رو نمی‌بینه.
برای این مشکل، نیاز به ابزارهایی مثل Selenium یا Playwright داری. این ابزارها یه مرورگر واقعی رو کنترل می‌کنن و اجازه میدن تا جاوااسکریپت رندر بشه و بعد از اون محتوا رو اسکرپ کنی.

# مثال نصب Selenium (نیاز به Chromedriver یا GeckoDriver)
pip install selenium

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

service = Service(executable_path='/path/to/chromedriver') # مسیر Chromedriver خودت رو اینجا بزار
driver = webdriver.Chrome(service=service)
driver.get("http://your-javascript-rendered-website.com")

# صبر کردن تا محتوا لود بشه (اختیاری)
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "some-element-id")))

html_content_rendered = driver.page_source
soup_rendered = BeautifulSoup(html_content_rendered, 'html.parser')
# ... حالا با soup_rendered کار کن

driver.quit()

احترام به سایت‌ها: Robots.txt و تاخیرها

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

  • Robots.txt: قبل از اسکرپ کردن هر سایتی، فایل robots.txt اون سایت رو بررسی کن (مثلاً http://example.com/robots.txt). این فایل بهت میگه که کدوم بخش‌های سایت رو نباید اسکرپ کنی.
  • Delay (تاخیر): بین درخواست‌هات یه تاخیر (مثلاً چند ثانیه) بذار تا سرور رو از درخواست‌های زیاد خسته نکنی. این کار هم اخلاقیه و هم جلوی بلاک شدن IP تو رو می‌گیره.

    import time
    for i in range(5):
        # انجام درخواست اسکرپینگ
        print(f"در حال اسکرپ صفحه {i+1}...")
        time.sleep(2) # 2 ثانیه تاخیر

  • قوانین و شرایط (Terms of Service): همیشه قوانین و شرایط سایت رو مطالعه کن. بعضی سایت‌ها صراحتاً اسکرپینگ رو ممنوع کردن. رعایت این نکات بهت کمک می‌کنه تا یه اسکرپر مسئول و حرفه‌ای باشی.

عیب‌یابی سریع: مشکلات رایج در وب اسکرپینگ و راه‌حل‌ها

تقریباً محاله وب اسکرپینگ کنی و به مشکل برنخوری. این بخش بهت کمک می‌کنه تا رایج‌ترین خطاهایی که ممکنه باهاشون مواجه بشی رو سریع حل کنی.

۱. دریافت کد وضعیت 403 (Forbidden)

این یعنی سرور درخواست شما رو به دلیل عدم دسترسی رد کرده.

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

۲. محتوا پیدا نمی‌شه یا HTML خالیه

این مشکل معمولاً زمانی پیش میاد که محتوا با جاوااسکریپت بارگذاری میشه.

  • راه‌حل: باید از ابزارهایی مثل Selenium یا Playwright استفاده کنی که قابلیت رندر کردن جاوااسکریپت رو دارن.
  • راه‌حل جایگزین: بعضی وقت‌ها وب‌سایت‌ها APIهای عمومی دارن که می‌تونی ازشون برای دریافت داده‌های ساختاریافته استفاده کنی. همیشه قبل از اسکرپینگ، بخش توسعه‌دهندگان سایت رو چک کن.

۳. ساختار HTML سایت تغیر کرده و اسکریپ کار نمی‌کنه

این یکی از رایج‌ترین مشکلات در وب اسکرپینگ طولانی‌مدته. وب‌سایت‌ها دائماً در حال تغییر هستن.

  • راه‌حل: به‌صورت منظم کد اسکرپرت رو تست و به‌روزرسانی کن. سعی کن از سلکتورهایی استفاده کنی که احتمال تغییرشون کمتره (مثلاً IDها معمولاً پایدارتر از classهای عمومی هستن).
  • راه‌حل جایگزین: از ابزارهایی مثل Scrapy استفاده کن که امکان تعریف Ruleهای منعطف‌تر رو میده و خطاها رو بهتر مدیریت می‌کنه.

۴. بلاک شدن IP

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

  • راه‌حل: از تاخیر بین درخواست‌ها (time.sleep()) استفاده کن. این کار باعث میشه درخواست‌هات طبیعی‌تر به نظر برسن.
  • راه‌حل جایگزین: از لیستی از پروکسی‌ها استفاده کن و بینشون جابجا شو. همچنین می‌تونی از ابزارهای تغییر User-Agent به‌صورت تصادفی هم کمک بگیری.

💡 نیاز به کمک داری یا دنبال ابزارهای بیشتر می‌گردی؟

تیم ما همیشه آماده‌ست تا بهترین ابزارها و راهنمایی‌ها رو در اختیارت بذاره. برای مشاوره یا دسترسی به اسنیپت‌های پیشرفته‌تر، با ما تماس بگیر!


📞 تماس بگیرید: 09202232789

جمع‌بندی: سفر هیجان‌انگیز به دنیای داده‌ها

خب رفیق، تا اینجا با هم یه مسیر طولانی رو طی کردیم و یاد گرفتیم چطور با پایتون، Requests و BeautifulSoup، داده‌ها رو از دل وب‌سایت‌ها بیرون بکشیم. از آماده‌سازی محیط گرفته تا ارسال درخواست‌ها، تحلیل HTML و حتی مواجهه با چالش‌های پیشرفته‌تر مثل صفحات JS و بلاک شدن IP.

وب اسکرپینگ یه مهارت فوق‌العاده کاربردیه که می‌تونه در پروژه‌های شخصی، تحقیقاتی و تجاری بهت کمک زیادی بکنه. همیشه یادت باشه که با مسئولیت‌پذیری و احترام به قوانین هر سایت اسکرپینگ کنی. دنیای داده‌ها منتظر کشف توئه! اگه دنبال کدهای آماده و اسنیپت‌های مختلف برای افزایش بهره‌وری پروژه‌هات هستی، حتماً یه سری به بخش اسنیپت‌های ما بزن. اونجا می‌تونی کلی کد کاربردی برای پایتون، CSS، جاوااسکریپت و حتی وردپرس پیدا کنی!

برای دیدن اسنیپت‌های بیشتر در حوزه‌های مختلف، این لینک‌ها رو هم چک کن:

Table of Contents

آخرین نوشته‌ها