ওয়েব স্ক্র্যাপিং ওয়েবসাইটগুলি থেকে প্রোগ্রামগতভাবে ডেটা বের করে — গবেষণা, মূল্য পর্যবেক্ষণ, ডেটা একত্রিতকরণ এবং অটোমেশনের জন্য দরকারী। এই গাইডটি পাইথনে স্ক্র্যাপার তৈরি করে, সাধারণ স্ট্যাটিক পৃষ্ঠা থেকে শুরু করে গতিশীল জাভাস্ক্রিপ্ট সাইট পর্যন্ত, আইনি এবং নৈতিক অনুশীলনগুলিকে কভার করে যা আপনাকে সমস্যা থেকে দূরে রাখে।
📋 Table of Contents
- প্রথমে দায়বদ্ধভাবে স্ক্র্যাপ করুন
- সেটআপ
- অনুরোধ সহ স্ট্যাটিক পৃষ্ঠাগুলি স্ক্র্যাপ করা + সুন্দর স্যুপ
- নির্ভুলভাবে উপাদান নির্বাচন করা
- নাট্যকারের সাথে ডাইনামিক (জাভাস্ক্রিপ্ট) সাইটগুলি স্ক্র্যাপিং অনেক আধুনিক সাইট জাভাস্ক্রিপ্টের সাথে বিষয়বস্তু রেন্ডার করে — অনুরোধ এটি দেখতে পাবে না। নাট্যকার একটি বাস্তব ব্রাউজার চালান:
- পৃষ্ঠা সংখ্যা হ্যান্ডলিং
- স্ক্র্যাপড ডেটা সংরক্ষণ করা হচ্ছে
- প্রায়শই জিজ্ঞাসিত প্রশ্ন
- প্রশ্নঃ ওয়েব স্ক্র্যাপিং কি বৈধ?
- পাইথনের সাথে ওয়েব স্ক্র্যাপিং ডেটা সংগ্রহের জন্য শক্তিশালী, তবে এটি দায়িত্বের সাথে করুন। ব্যবহার করুন
প্রথমে দায়বদ্ধভাবে স্ক্র্যাপ করুন
যেকোন স্ক্র্যাপার লেখার আগে নিয়ম বুঝে নিনঃ
- robots.txt দেখুন:
example.com/robots.txtআপনাকে বলে কি ক্রল করার অনুমতি দেওয়া হয়েছে - পরিষেবার শর্তাবলী পড়ুন: কিছু সাইট স্পষ্টভাবে স্ক্র্যাপিং নিষিদ্ধ করে
- সম্মান হারের সীমা: একটি সার্ভার হাতুড়ি না — অনুরোধের মধ্যে বিলম্ব যোগ করুন
- উপলব্ধ হলে অফিসিয়াল API ব্যবহার করুন: স্ক্র্যাপিংয়ের চেয়ে সর্বদা একটি API পছন্দ করুন
- ব্যক্তিগত তথ্য স্ক্র্যাপ করবেন না আইনি ভিত্তি ছাড়াই (GDPR এবং অনুরূপ আইন প্রযোজ্য)
- নিজেকে চিনুন: একটি সঠিক ব্যবহারকারী-এজেন্ট সেট করুন, আপনার বটকে দূষিতভাবে ছদ্মবেশ ধারণ করবেন না
সেটআপ
pip install requests beautifulsoup4 lxml
# For JavaScript-heavy sites:
pip install playwright
playwright install chromium
অনুরোধ সহ স্ট্যাটিক পৃষ্ঠাগুলি স্ক্র্যাপ করা + সুন্দর স্যুপ
import requests
from bs4 import BeautifulSoup
import time
def scrape_articles(url):
headers = {
'User-Agent': 'Mozilla/5.0 (compatible; MyResearchBot/1.0)'
}
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'lxml')
articles = []
for article in soup.select('article.post'):
title = article.select_one('h2.title')
link = article.select_one('a')
articles.append({
'title': title.get_text(strip=True) if title else None,
'url': link['href'] if link else None,
})
return articles
data = scrape_articles('https://example.com/blog')
for item in data:
print(item)
নির্ভুলভাবে উপাদান নির্বাচন করা
soup = BeautifulSoup(html, 'lxml')
# By tag
soup.find('h1') # first h1
soup.find_all('p') # all paragraphs
# By CSS selector (most flexible)
soup.select('div.card > h2') # h2 inside div.card
soup.select_one('#main .price') # first .price inside #main
# Extract data
element.get_text(strip=True) # text content
element['href'] # attribute value
element.get('data-id', 'default') # attribute with fallback
# Navigate
element.parent # parent element
element.find_next_sibling('div') # next sibling
নাট্যকারের সাথে ডাইনামিক (জাভাস্ক্রিপ্ট) সাইটগুলি স্ক্র্যাপিং অনেক আধুনিক সাইট জাভাস্ক্রিপ্টের সাথে বিষয়বস্তু রেন্ডার করে — অনুরোধ এটি দেখতে পাবে না। নাট্যকার একটি বাস্তব ব্রাউজার চালান:
হার সীমাবদ্ধতা এবং ভদ্রতা
from playwright.sync_api import sync_playwright
def scrape_dynamic(url):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page(user_agent='Mozilla/5.0 (MyBot/1.0)')
page.goto(url, wait_until='networkidle')
# Wait for content to load
page.wait_for_selector('.product-card')
# Extract data from the rendered page
products = page.eval_on_selector_all('.product-card', '''
cards => cards.map(card => ({
name: card.querySelector('.name')?.innerText,
price: card.querySelector('.price')?.innerText,
}))
''')
browser.close()
return products
results = scrape_dynamic('https://example.com/products')
পৃষ্ঠা সংখ্যা হ্যান্ডলিং
import time
import random
def polite_scrape(urls):
results = []
for url in urls:
try:
data = scrape_page(url)
results.append(data)
except requests.RequestException as e:
print(f"Failed {url}: {e}")
# Random delay between requests (1-3 seconds) - be gentle
time.sleep(random.uniform(1, 3))
return results
# Respect Retry-After on 429 responses
response = requests.get(url)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
time.sleep(retry_after)
স্ক্র্যাপড ডেটা সংরক্ষণ করা হচ্ছে
def scrape_all_pages(base_url):
all_data = []
page = 1
while True:
url = f"{base_url}?page={page}"
response = requests.get(url, headers=HEADERS, timeout=10)
soup = BeautifulSoup(response.text, 'lxml')
items = soup.select('.item')
if not items:
break # no more items - stop
all_data.extend(extract_items(items))
# Check for a "next" link, or just increment
if not soup.select_one('a.next-page'):
break
page += 1
time.sleep(random.uniform(1, 2))
return all_data
প্রায়শই জিজ্ঞাসিত প্রশ্ন
import csv
import json
# To CSV
with open('data.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'url', 'price'])
writer.writeheader()
writer.writerows(data)
# To JSON
with open('data.json', 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
# To a database (SQLite example)
import sqlite3
conn = sqlite3.connect('scraped.db')
conn.executemany(
"INSERT INTO products (name, price) VALUES (?, ?)",
[(d['name'], d['price']) for d in data]
)
conn.commit()
প্রশ্নঃ ওয়েব স্ক্র্যাপিং কি বৈধ?
উত্তর: এটা নির্ভর করে। সর্বজনীনভাবে উপলব্ধ ডেটা স্ক্র্যাপ করা প্রায়শই আইনি, তবে পরিষেবার শর্তাবলী লঙ্ঘন করা, ভিত্তি ছাড়াই ব্যক্তিগত ডেটা স্ক্র্যাপ করা বা অ্যাক্সেস নিয়ন্ত্রণগুলি বাইপাস করা বেআইনি হতে পারে। robots.txt এবং ToS চেক করুন, অফিসিয়াল API পছন্দ করুন এবং বাণিজ্যিক স্ক্র্যাপিংয়ের জন্য আইনি পরামর্শ নিন।
প্রশ্ন: অনুরোধ/সুন্দর স্যুপ নাকি নাট্যকার?
উত্তর: স্ট্যাটিক HTML পৃষ্ঠাগুলির জন্য অনুরোধ + সুন্দর স্যুপ ব্যবহার করুন (দ্রুত, হালকা)। জাভাস্ক্রিপ্ট-রেন্ডার করা সাইটের জন্য নাট্যকার (বা সেলেনিয়াম) ব্যবহার করুন যেখানে বিষয়বস্তু গতিশীলভাবে লোড হয়। প্রাথমিক HTML-এ ডেটা আছে কিনা তা প্রথমে পরীক্ষা করুন — যদি তাই হয়, তাহলে আপনার ব্রাউজার দরকার নেই।
প্রশ্ন: আমি কীভাবে ব্লক হওয়া এড়াতে পারি?
উত্তর: নম্রভাবে স্ক্র্যাপ করুন — হারের সীমাকে সম্মান করুন, বিলম্ব যোগ করুন, একটি সঠিক ব্যবহারকারী-এজেন্ট সেট করুন এবং সার্ভারগুলিকে ওভারলোড করবেন না। ব্লকগুলি এড়ানোর সর্বোত্তম উপায় হল আপত্তিজনক না হওয়া। আক্রমণাত্মক স্ক্র্যাপিং ব্লক হয়ে যায় (এবং অবৈধ হতে পারে)।
প্রশ্ন: স্ক্র্যাপ করার পরিবর্তে আমার কি একটি API ব্যবহার করা উচিত?
একটি: সর্বদা, যদি একটি বিদ্যমান থাকে। APIগুলি আরও নির্ভরযোগ্য, আইনি, কাঠামোগত এবং সাইটের HTML পরিবর্তন হলে ভেঙে যায় না৷ স্ক্র্যাপিং একটি শেষ অবলম্বন যখন কোনও API আপনার প্রয়োজনীয় ডেটা সরবরাহ করে না।
প্রশ্ন: লগইন প্রয়োজন এমন সাইটগুলিকে আমি কীভাবে পরিচালনা করব?
উত্তর: নাট্যকার একটি সেশন বজায় রেখে লগইন (ফর্ম পূরণ, জমা) স্বয়ংক্রিয়ভাবে করতে পারেন। কিন্তু লগইনের পিছনে স্ক্র্যাপ করা প্রায়শই পরিষেবার শর্তাবলী লঙ্ঘন করে — বিশেষত বৈধতা সম্পর্কে সতর্ক থাকুন এবং শুধুমাত্র আপনার অ্যাক্সেস করার জন্য অনুমোদিত ডেটা স্ক্র্যাপ করুন।
উপসংহার
পাইথনের সাথে ওয়েব স্ক্র্যাপিং ডেটা সংগ্রহের জন্য শক্তিশালী, তবে এটি দায়িত্বের সাথে করুন। ব্যবহার করুন
অনুরোধ + স্ট্যাটিক পৃষ্ঠাগুলির জন্য সুন্দর স্যুপ এবং জাভাস্ক্রিপ্ট-রেন্ডার করা সাইটগুলির জন্য নাট্যকার, CSS নির্বাচক সহ উপাদান নির্বাচন করুন, পৃষ্ঠা সংখ্যা পরিচালনা করুন এবং CSV/JSON/ডেটাবেসে সংরক্ষণ করুন। সবচেয়ে গুরুত্বপূর্ণ:robots.txt এবং পরিষেবার শর্তাবলী পরীক্ষা করুন, বিলম্বের সাথে হারের সীমাকে সম্মান করুন, অফিসিয়াল API পছন্দ করুন এবং আইনি ভিত্তি ছাড়া ব্যক্তিগত ডেটা স্ক্র্যাপ করবেন না. আপনার প্রয়োজনীয় ডেটা পাওয়ার সময় নৈতিক, ভদ্র স্ক্র্যাপিং আপনাকে আইনি এবং প্রযুক্তিগত সমস্যা থেকে দূরে রাখে। যখন একটি API বিদ্যমান থাকে, সর্বদা পরিবর্তে এটি ব্যবহার করুন — স্ক্র্যাপিং হল ফলব্যাক, প্রথম পছন্দ নয়।. আপনার প্রয়োজনীয় ডেটা পাওয়ার সময় নৈতিক, ভদ্র স্ক্র্যাপিং আপনাকে আইনি এবং প্রযুক্তিগত সমস্যা থেকে দূরে রাখে। যখন একটি API বিদ্যমান থাকে, সর্বদা পরিবর্তে এটি ব্যবহার করুন — স্ক্র্যাপিং হল ফলব্যাক, প্রথম পছন্দ নয়।
🔗 Share this article
✍️ Leave a Comment