ওয়েব স্ক্র্যাপিং হল একটি প্রক্রিয়া যেখানে প্রোগ্রামের মাধ্যমে কোনো ওয়েবসাইট থেকে ডেটা সংগ্রহ করা হয়। Python-এ ওয়েব স্ক্র্যাপিং করার জন্য বেশ কিছু শক্তিশালী লাইব্রেরি রয়েছে, যেমন BeautifulSoup, Requests, Scrapy, এবং Selenium। এর মাধ্যমে আমরা ওয়েবসাইটের বিভিন্ন এলিমেন্ট থেকে ডেটা সংগ্রহ করে বিশ্লেষণ বা সংরক্ষণ করতে পারি।
ওয়েব স্ক্র্যাপিং এর মূল ধাপসমূহ
- ওয়েব পেজে অ্যাক্সেস করা:
requestsলাইব্রেরি ব্যবহার করে ওয়েব পেজে অ্যাক্সেস করা। - HTML ডেটা পার্স করা:
BeautifulSoupলাইব্রেরি দিয়ে HTML ডেটাকে স্ট্রাকচার করা। - ডেটা এক্সট্রাক্ট করা: HTML এর বিভিন্ন ট্যাগ এবং এলিমেন্ট থেকে প্রয়োজনীয় ডেটা বের করা।
- ডেটা সংরক্ষণ করা: সংগৃহীত ডেটা CSV, Excel, বা ডাটাবেজে সংরক্ষণ করা।
লাইব্রেরি সমূহের সংক্ষিপ্ত পরিচিতি
- Requests: HTTP রিকোয়েস্ট করার জন্য ব্যবহৃত হয়।
- BeautifulSoup: HTML এবং XML ডেটা থেকে নির্দিষ্ট অংশ এক্সট্রাক্ট করার জন্য ব্যবহৃত হয়।
- Scrapy: ওয়েব স্ক্র্যাপিং এবং ডেটা ক্রোলিংয়ের জন্য একটি শক্তিশালী ফ্রেমওয়ার্ক।
- Selenium: জাভাস্ক্রিপ্ট রেন্ডারড পেজ স্ক্র্যাপ করার জন্য ব্যবহৃত হয়।
উদাহরণ: BeautifulSoup এবং Requests দিয়ে ওয়েব স্ক্র্যাপিং
১. ইনস্টলেশন
pip install requests
pip install beautifulsoup4
২. উদাহরণ কোড
ধরুন, আমরা একটি উদাহরণ ওয়েবসাইট থেকে শিরোনাম (title) এবং নির্দিষ্ট কিছু তথ্য স্ক্র্যাপ করতে চাই।
import requests
from bs4 import BeautifulSoup
# URL থেকে পেজের HTML ডেটা প্রাপ্তি
url = 'https://example.com'
response = requests.get(url)
# পেজটি সঠিকভাবে লোড হয়েছে কিনা তা পরীক্ষা করা
if response.status_code == 200:
# BeautifulSoup দিয়ে HTML পার্স করা
soup = BeautifulSoup(response.content, 'html.parser')
# শিরোনাম সংগ্রহ করা
title = soup.title.text
print(f"Title: {title}")
# নির্দিষ্ট ট্যাগ থেকে ডেটা সংগ্রহ করা
# উদাহরণস্বরূপ, সব <h2> ট্যাগের টেক্সট প্রাপ্তি
headings = soup.find_all('h2')
for heading in headings:
print(heading.text)
else:
print("Failed to retrieve the webpage.")
BeautifulSoup এর গুরুত্বপূর্ণ ফাংশনসমূহ
find(): প্রথম ম্যাচিং ট্যাগটি খুঁজে বের করে।
first_heading = soup.find('h2')
print(first_heading.text)
find_all(): নির্দিষ্ট ট্যাগের সব ম্যাচিং ট্যাগ খুঁজে বের করে।
all_paragraphs = soup.find_all('p')
for para in all_paragraphs:
print(para.text)
select(): CSS সিলেক্টর ব্যবহার করে ট্যাগ খুঁজে বের করে।
main_content = soup.select('.main-content')
print(main_content[0].text)
get(): ট্যাগের নির্দিষ্ট অ্যাট্রিবিউটের মান পাওয়ার জন্য ব্যবহৃত হয়।
link = soup.find('a')
print(link.get('href'))
Scrapy দিয়ে ওয়েব স্ক্র্যাপিং
Scrapy হল ওয়েব স্ক্র্যাপিংয়ের জন্য একটি উন্নত ফ্রেমওয়ার্ক, যা বড় প্রজেক্ট বা ক্রোলিংয়ের জন্য ব্যবহৃত হয়। Scrapy-এর মাধ্যমে একাধিক পেজ থেকে একসাথে ডেটা স্ক্র্যাপ করা সম্ভব।
pip install scrapy
Scrapy ব্যবহার শুরু করার জন্য একটি প্রজেক্ট তৈরি করতে হবে:
scrapy startproject project_name
Selenium দিয়ে ওয়েব স্ক্র্যাপিং
Selenium প্রধানত জাভাস্ক্রিপ্ট রেন্ডারড পেজ স্ক্র্যাপ করতে ব্যবহৃত হয়, যেখানে সাধারণ HTML স্ক্র্যাপিং কাজ করে না। এটি ব্রাউজার অটোমেশনের মাধ্যমে পেজ লোড এবং বিভিন্ন ইন্টারেকশন করতে সহায়ক।
pip install selenium
Selenium ব্যবহার করার জন্য ChromeDriver বা অন্য ব্রাউজার ড্রাইভার ইনস্টল করতে হবে। নিচে উদাহরণ দেয়া হলো:
from selenium import webdriver
from selenium.webdriver.common.by import By
# ব্রাউজার ওপেন করা
driver = webdriver.Chrome()
# ওয়েবসাইট লোড করা
driver.get('https://example.com')
# শিরোনাম বের করা
title = driver.title
print(f"Title: {title}")
# নির্দিষ্ট এলিমেন্ট এক্সট্রাক্ট করা
heading = driver.find_element(By.TAG_NAME, 'h1')
print(heading.text)
# ব্রাউজার বন্ধ করা
driver.quit()
ওয়েব স্ক্র্যাপিং করার সময় সতর্কতা:
- ওয়েবসাইটের শর্তাবলী মেনে চলুন: অনেকে স্ক্র্যাপিং অনুমতি দেয় না বা API ব্যবহার করতে বলে। স্ক্র্যাপিং শুরু করার আগে Terms of Service পড়ে নেয়া উচিত।
- ওয়েবসাইটের জন্য লোড কমিয়ে রাখুন: ওয়েবসাইটে বেশি রিকোয়েস্ট পাঠানো ওভারলোড তৈরি করতে পারে, তাই টাইমডিলে ব্যবহার করা উচিত।
- Legal Considerations: ওয়েবসাইটের কপিরাইট আইন এবং গোপনীয়তা নীতি সম্পর্কে সচেতন থাকুন।
উপসংহার
Python এ BeautifulSoup, Requests, Scrapy, এবং Selenium লাইব্রেরির মাধ্যমে ওয়েব স্ক্র্যাপিং করা সহজ ও কার্যকরী। ছোট বা এক-পেজ স্ক্র্যাপিং এর জন্য BeautifulSoup এবং Requests যথেষ্ট, তবে বড় স্কেল প্রজেক্টের জন্য Scrapy ব্যবহার করা ভালো। জাভাস্ক্রিপ্ট রেন্ডারড পেজের জন্য Selenium উপযুক্ত।
Requests মডিউলটি পাইথনে HTTP রিকোয়েস্ট পাঠানোর জন্য ব্যবহৃত হয়। এটি ওয়েব সার্ভারের সাথে সহজে যোগাযোগ স্থাপন করতে সহায়ক এবং API থেকে ডেটা রিকোয়েস্ট করার জন্য ব্যাপকভাবে ব্যবহৃত হয়। Requests মডিউলটি ইন্সটল করে GET, POST, PUT, DELETE এবং আরও অন্যান্য HTTP মেথড ব্যবহার করে সহজে ওয়েব রিকোয়েস্ট পাঠানো যায়।
Requests মডিউল ইনস্টলেশন
pip install requests
Requests মডিউল দিয়ে HTTP রিকুয়েস্ট পাঠানো
১. GET রিকুয়েস্ট
GET রিকুয়েস্ট সাধারণত সার্ভার থেকে ডেটা রিট্রিভ করার জন্য ব্যবহৃত হয়।
import requests
# একটি GET রিকুয়েস্ট পাঠানো
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
# রেসপন্স চেক করা
print(response.status_code) # আউটপুট: 200 (যদি সফল হয়)
print(response.json()) # JSON ডেটা হিসেবে রেসপন্স প্রিন্ট করা
২. POST রিকুয়েস্ট
POST রিকুয়েস্ট সাধারণত সার্ভারে নতুন ডেটা পাঠানোর জন্য ব্যবহৃত হয়।
import requests
url = "https://jsonplaceholder.typicode.com/posts"
data = {
"title": "New Post",
"body": "This is the content of the new post.",
"userId": 1
}
# POST রিকুয়েস্ট পাঠানো
response = requests.post(url, json=data)
print(response.status_code) # আউটপুট: 201 (সফলভাবে তৈরি হলে)
print(response.json()) # রেসপন্স JSON ফরম্যাটে প্রিন্ট করা
৩. PUT রিকুয়েস্ট
PUT রিকুয়েস্ট সার্ভারে ডেটা আপডেট করতে ব্যবহৃত হয়।
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
updated_data = {
"title": "Updated Post",
"body": "This is the updated content.",
"userId": 1
}
# PUT রিকুয়েস্ট পাঠানো
response = requests.put(url, json=updated_data)
print(response.status_code) # আউটপুট: 200 (সফল হলে)
print(response.json()) # রেসপন্স JSON ফরম্যাটে প্রিন্ট করা
৪. DELETE রিকুয়েস্ট
DELETE রিকুয়েস্ট ব্যবহার করে সার্ভার থেকে ডেটা মুছে ফেলা যায়।
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
# DELETE রিকুয়েস্ট পাঠানো
response = requests.delete(url)
print(response.status_code) # আউটপুট: 200 (যদি সফলভাবে মুছে ফেলা হয়)
অতিরিক্ত অপশন
১. হেডারস (Headers)
হেডারস দিয়ে রিকুয়েস্ট কাস্টমাইজ করা যায়। উদাহরণস্বরূপ, বিভিন্ন API টোকেন বা কনটেন্ট টাইপ নির্ধারণ করা যায়।
url = "https://jsonplaceholder.typicode.com/posts"
headers = {
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
print(response.json())
২. প্যারামিটার (Parameters)
GET রিকুয়েস্টের সাথে প্যারামিটার পাঠাতে params ব্যবহার করা হয়।
url = "https://jsonplaceholder.typicode.com/posts"
params = {"userId": 1}
response = requests.get(url, params=params)
print(response.json())
৩. টাইমআউট (Timeout)
টাইমআউট দিয়ে রিকুয়েস্টের অপেক্ষার সময় নির্ধারণ করা যায়।
url = "https://jsonplaceholder.typicode.com/posts"
# টাইমআউট ৫ সেকেন্ডে সেট করা
response = requests.get(url, timeout=5)
print(response.status_code)
সারসংক্ষেপ
Requests মডিউল দিয়ে ওয়েব রিকুয়েস্ট পাঠানো সহজ এবং কার্যকর। এটি GET, POST, PUT, DELETE এর মতো বিভিন্ন HTTP মেথড সমর্থন করে এবং API-এর সাথে যোগাযোগের জন্য ব্যাপকভাবে ব্যবহৃত হয়। Requests মডিউলের মাধ্যমে সহজেই ডেটা রিট্রিভ, তৈরি, আপডেট, এবং মুছে ফেলা যায়।
Python-এ BeautifulSoup একটি শক্তিশালী লাইব্রেরি যা HTML এবং XML ডেটা পার্স করার জন্য ব্যবহৃত হয়। BeautifulSoup এর মাধ্যমে ওয়েব পেজ থেকে প্রয়োজনীয় ডেটা সহজে খুঁজে বের করে প্রক্রিয়াকরণ করা সম্ভব।
BeautifulSoup ইনস্টলেশন
প্রথমে BeautifulSoup লাইব্রেরিটি ইন্সটল করতে হবে। এটি ইন্সটল করার জন্য নিচের কমান্ডটি চালান:
pip install beautifulsoup4
BeautifulSoup দিয়ে HTML পার্সিং এর ধাপসমূহ
- HTML ডেটা লোড করা: Requests বা অন্য কোন মাধ্যম ব্যবহার করে HTML ডেটা সংগ্রহ করা।
- BeautifulSoup দিয়ে HTML ডেটা পার্স করা: BeautifulSoup এর মাধ্যমে HTML ডেটাকে একটি গঠনমূলক স্ট্রাকচারে রূপান্তর করা।
- নির্দিষ্ট ট্যাগ থেকে ডেটা এক্সট্রাক্ট করা:
find(),find_all(), এবংselect()ফাংশন ব্যবহার করে প্রয়োজনীয় ডেটা সংগ্রহ করা।
উদাহরণ কোড
ধরুন, আমরা নিচের HTML কোডটি ব্যবহার করব এবং এতে থাকা শিরোনাম, প্যারাগ্রাফ এবং লিংকগুলো পার্স করব:
<html>
<head><title>Sample Page</title></head>
<body>
<h1>This is a heading</h1>
<p>This is a paragraph.</p>
<p class="intro">This is another paragraph with class intro.</p>
<a href="https://example.com">Visit Example</a>
</body>
</html>
কোড: BeautifulSoup দিয়ে HTML পার্সিং
from bs4 import BeautifulSoup
# HTML কোডটি BeautifulSoup এ পাঠানো
html_content = """
<html>
<head><title>Sample Page</title></head>
<body>
<h1>This is a heading</h1>
<p>This is a paragraph.</p>
<p class="intro">This is another paragraph with class intro.</p>
<a href="https://example.com">Visit Example</a>
</body>
</html>
"""
# BeautifulSoup অবজেক্ট তৈরি
soup = BeautifulSoup(html_content, 'html.parser')
# ১. শিরোনাম (title) বের করা
title = soup.title.text
print("Title:", title)
# ২. প্রথম <h1> ট্যাগ বের করা
heading = soup.find('h1').text
print("Heading:", heading)
# ৩. সব <p> ট্যাগ বের করা
paragraphs = soup.find_all('p')
for i, para in enumerate(paragraphs, 1):
print(f"Paragraph {i}:", para.text)
# ৪. নির্দিষ্ট ক্লাস সহ <p> ট্যাগ বের করা
intro_para = soup.find('p', class_='intro').text
print("Intro Paragraph:", intro_para)
# ৫. লিংক বের করা
link = soup.find('a')
link_text = link.text
link_url = link.get('href')
print("Link Text:", link_text)
print("Link URL:", link_url)
আউটপুট
Title: Sample Page
Heading: This is a heading
Paragraph 1: This is a paragraph.
Paragraph 2: This is another paragraph with class intro.
Intro Paragraph: This is another paragraph with class intro.
Link Text: Visit Example
Link URL: https://example.com
BeautifulSoup এর কিছু গুরুত্বপূর্ণ ফাংশন
soup.find(): প্রথম ম্যাচিং ট্যাগটি খুঁজে বের করে।
first_para = soup.find('p')
print(first_para.text)
soup.find_all(): নির্দিষ্ট ট্যাগের সব ম্যাচিং ট্যাগ খুঁজে বের করে।
all_paragraphs = soup.find_all('p')
for para in all_paragraphs:
print(para.text)
soup.select(): CSS সিলেক্টর ব্যবহার করে নির্দিষ্ট ট্যাগ খুঁজে বের করে।
intro_para = soup.select('.intro')[0]
print(intro_para.text)
get(): ট্যাগের নির্দিষ্ট অ্যাট্রিবিউটের মান পাওয়ার জন্য ব্যবহৃত হয়।
link = soup.find('a')
print(link.get('href'))
soup.text: HTML ডেটার সমস্ত টেক্সট একসাথে প্রদর্শন করে।
print(soup.text)
BeautifulSoup দিয়ে কাজ করার জন্য কিছু টিপস
- নির্দিষ্ট আইডি এবং ক্লাস দিয়ে HTML এলিমেন্ট খুঁজুন, কারণ এটি দ্রুত এবং নির্ভুল ফলাফল প্রদান করে।
- CSS সিলেক্টর ব্যবহার করে জটিল HTML কাঠামো থেকে সহজে ডেটা বের করা যায়।
- যদি অনেক HTML ট্যাগ থাকে, তবে
find_all()ব্যবহার করে লিস্ট আকারে ডেটা পাওয়া যায়।
উপসংহার
BeautifulSoup একটি সহজ ও শক্তিশালী টুল যা দিয়ে ওয়েব পেজ থেকে ডেটা স্ক্র্যাপ ও পার্স করা সহজ। এটি HTML এর প্রতিটি এলিমেন্টে অ্যাক্সেস করতে পারে এবং ডেটা প্রক্রিয়াকরণের জন্য অত্যন্ত কার্যকরী।
Selenium হলো একটি জনপ্রিয় ওয়েব ব্রাউজার অটোমেশন টুল, যা পাইথনের মতো বিভিন্ন প্রোগ্রামিং ভাষার মাধ্যমে ব্যবহার করা যায়। Selenium ব্যবহার করে ওয়েব ব্রাউজারে স্বয়ংক্রিয়ভাবে ক্লিক করা, ডেটা ইনপুট করা, পেজ নেভিগেট করা এবং স্ক্র্যাপিং করা সম্ভব।
Selenium ইনস্টলেশন
pip install selenium
ওয়েবড্রাইভার ডাউনলোড করা
Selenium দিয়ে ব্রাউজার নিয়ন্ত্রণ করতে হলে সংশ্লিষ্ট ব্রাউজারের ড্রাইভার ডাউনলোড করতে হবে, যেমন:
- Chrome: ChromeDriver
- Firefox: GeckoDriver
ড্রাইভারটি ডাউনলোড করে আপনার সিস্টেমে যুক্ত করুন।
Selenium দিয়ে একটি ওয়েব পেজ খুলা
উদাহরণ: একটি ওয়েব পেজ খুলে টাইটেল প্রিন্ট করা
from selenium import webdriver
# Chrome ব্রাউজার ওপেন করার জন্য
driver = webdriver.Chrome() # যদি ChromeDriver পাথে থাকে
# ওয়েবসাইটে নেভিগেট করা
driver.get("https://www.example.com")
# পেজের টাইটেল প্রিন্ট করা
print("Page Title:", driver.title)
# ব্রাউজার বন্ধ করা
driver.quit()
সাধারণ ব্রাউজার অপারেশন
১. HTML উপাদান খোঁজা
Selenium দিয়ে বিভিন্ন উপাদান (elements) খুঁজতে ব্যবহার করা যায়:
- find_element_by_id:
driver.find_element_by_id("id_name") - find_element_by_name:
driver.find_element_by_name("name") - find_element_by_class_name:
driver.find_element_by_class_name("class_name") - find_element_by_xpath:
driver.find_element_by_xpath("xpath_expression")
উদাহরণ:
# কোন বাটনে ক্লিক করা
button = driver.find_element_by_id("button_id")
button.click()
২. টেক্সট ইনপুট করা
search_box = driver.find_element_by_name("q")
search_box.send_keys("Python programming")
search_box.submit()
৩. এলিমেন্টের টেক্সট রিড করা
element = driver.find_element_by_id("element_id")
print("Element Text:", element.text)
পেজ নেভিগেশন
- Back এবং Forward:
driver.back() # পূর্ববর্তী পেজে ফিরে যাওয়া
driver.forward() # পরবর্তী পেজে যাওয়া
অপেক্ষা (Waits)
ওয়েব পেজ লোড হওয়ার জন্য Selenium-এ অপেক্ষা (wait) যোগ করা খুব গুরুত্বপূর্ণ। Selenium-এ সাধারণত দুই ধরনের অপেক্ষা ব্যবহৃত হয়:
Implicit Wait: এটি প্রতিটি উপাদান খুঁজতে নির্দিষ্ট সময়ের জন্য অপেক্ষা করে।
driver.implicitly_wait(10) # 10 সেকেন্ড অপেক্ষা করবে
Explicit Wait: নির্দিষ্ট উপাদান পাওয়া পর্যন্ত অপেক্ষা করে।
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ১০ সেকেন্ড অপেক্ষা করবে নির্দিষ্ট উপাদানের জন্য
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "element_id"))
)
পেজ স্ক্রোল করা
Selenium দিয়ে পেজ স্ক্রোল করা যায়, যা স্ক্র্যাপিং এর সময় সহায়ক।
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # পেজের নিচে স্ক্রোল করা
উদাহরণ: গুগলে সার্চ করা
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://www.google.com")
search_box = driver.find_element_by_name("q")
search_box.send_keys("Python programming")
search_box.send_keys(Keys.RETURN)
# সার্চ রেজাল্ট থেকে প্রথম লিঙ্কটি বের করা
first_result = driver.find_element_by_css_selector("h3")
print("First Result Title:", first_result.text)
driver.quit()
সারসংক্ষেপ
Selenium একটি শক্তিশালী টুল যা ওয়েব ব্রাউজার অটোমেশন করতে ব্যবহৃত হয়। এটি বিভিন্ন উপাদান খুঁজে ইনপুট করা, ক্লিক করা, পেজ নেভিগেট করা এবং ওয়েব স্ক্র্যাপিং করতে সহায়ক। এটি API টেস্টিং, ফর্ম পূরণ, এবং বিভিন্ন রুটিন কাজ অটোমেট করতে ব্যবহৃত হয়।
Read more