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

نصب ابزارها

pip install requests beautifulsoup4
  • requests صفحه را دانلود می‌کند (همان کاری که مرورگر می‌کند، بدون نمایش)
  • BeautifulSoup به HTML دانلودشده ساختار می‌دهد تا بتوانیم داخلش جستجو کنیم

قدم اول: دانلود صفحه

برای تمرین از سایت quotes.toscrape.com استفاده می‌کنیم که مخصوص تمرین اسکرپینگ ساخته شده:

import requests

response = requests.get("https://quotes.toscrape.com")
print(response.status_code)   # 200 یعنی موفق
print(response.text[:500])    # ۵۰۰ کاراکتر اول HTML

قدم دوم: استخراج داده با BeautifulSoup

در HTML این سایت، هر نقل‌قول داخل تگی با کلاس quote است. با select همه را می‌گیریم:

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")
soup = BeautifulSoup(response.text, "html.parser")

for quote in soup.select(".quote"):
    text = quote.select_one(".text").get_text()
    author = quote.select_one(".author").get_text()
    print(f"{text}{author}")

خروجی: ده نقل‌قول با نویسنده‌هایشان. select با همان سلکتورهای CSS کار می‌کند که از طراحی وب می‌شناسید: .class، #id، div > a و…

قدم سوم: ذخیره در CSV

داده بدون ذخیره‌سازی فایده‌ای ندارد:

import csv

with open("quotes.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["متن", "نویسنده"])
    for quote in soup.select(".quote"):
        writer.writerow([
            quote.select_one(".text").get_text(),
            quote.select_one(".author").get_text(),
        ])

نکته: encoding="utf-8-sig" باعث می‌شود اکسل فایل فارسی را درست باز کند.

قواعد اخلاقی و فنی که رعایتشان واجب است

  • فایل robots.txt سایت را چک کنید (مثلاً example.com/robots.txt) — می‌گوید کجاها مجاز است
  • بین درخواست‌ها فاصله بگذارید (time.sleep(1)) تا به سرور فشار نیاید
  • برای استفاده تجاری از داده‌ها، قوانین سایت مبدأ را بخوانید
  • اگر سایت API رسمی دارد، همیشه API بهتر از اسکرپینگ است

وقتی صفحه با جاوااسکریپت ساخته می‌شود

requests فقط HTML اولیه را می‌گیرد. اگر داده‌ها بعداً با جاوااسکریپت لود می‌شوند، به ابزار قوی‌تری مثل Selenium نیاز دارید که مرورگر واقعی را کنترل می‌کند — موضوع یکی از آموزش‌های بعدی.

تمرین

از همان سایت تمرینی، تگ‌های (tags) هر نقل‌قول را هم استخراج کنید و ستون سومی به CSV اضافه کنید. راهنمایی: سلکتور .tag داخل هر .quote.

بازگشت به آموزش‌ها