এই নিবন্ধে আমরা পাইথনে উপলব্ধ Scrapy মডিউল ব্যবহার করে ওয়েব স্ক্র্যাপিং কৌশল নিয়ে আলোচনা করব।
ওয়েব স্ক্র্যাপিং কী?
ওয়েব স্ক্র্যাপিং হলো একটি ক্রলার/স্ক্যানারের সাহায্যে ওয়েবসাইট থেকে ডেটা প্রাপ্ত করার পদ্ধতি। এটি সেই ওয়েব পেজ থেকে ডেটা বের করার জন্য কাজে আসে যা API ফাংশনালিটি অফার করে না। পাইথনে ওয়েব স্ক্র্যাপিং Beautiful Soup, Scrapy এবং lxml মতো বিভিন্ন মডিউল দিয়ে করা যায়।
এখানে আমরা Scrapy মডিউল ব্যবহার করে ওয়েব স্ক্র্যাপিং নিয়ে আলোচনা করব।
সেজন্য, প্রথমে Scrapy ইনস্টল করতে হবে।
টার্মিনাল বা কমান্ড প্রম্পটে টাইপ করুন:
>>> pip install Scrapy
Scrapy একটি ফ্রেমওয়ার্ক হওয়ায় আমাদের একটি ইনিশিয়ালাইজিং কমান্ড চালাতে হবে:
>>> scrapy startproject tutpts
এখানে আমরা একটি ওয়েব ক্রলার/স্পাইডার তৈরি করব যাতে ওয়েবসাইট থেকে ডেটা বের করা যায়।
ক্রলার তৈরির জন্য আমরা tutptscraw.py নামক একটি আলাদা স্ক্রিপ্ট তৈরি করব। এখানে কন্টেন্ট এক্সট্রাকশনের জন্য একটি ক্লাস ডিক্লেয়ার করব। ওয়েব ক্রলারের নাম দিয়ে এবং .requests ব্যবহার করে প্রদত্ত URL থেকে ডেটা ফেচ করব।
ফেচ করা ডেটা যিল্ড করার জন্য জেনারেটর ফাংশন ব্যবহার করা হয়।
উদাহরণ
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# জেনারেটর ফাংশন
def start_requests(self):
# URL দিন
urls = ['https://www.tutorialspoint.com/index.htm/', ]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
এখানে অ্যাঙ্কর ট্যাগের ভিতরে সংলগ্ন সকল ডেটা রিকোয়েস্ট ফাংশন ব্যবহার করে ফেচ করা হয়। Scrapy একটি মিনি ফ্রেমওয়ার্ক হওয়ায় আমরা সব ফাংশনালিটি Scrapy শেলে চালাই।
Scrapy শেল এক্টিভেট করার জন্য নিচের কমান্ডগুলো ব্যবহার করুন:
scrapy shell https://www.tutorialspoint.com/index.htm/
এখন সিলেক্টর ব্যবহার করে অ্যাঙ্কর ট্যাগ থেকে ডেটা ফেচ করুন (CSS বা xpath):
response.css('a')
links = response.css('a').extract()
ওয়েব পেজে উপলব্ধ সব লিংক পেতে একটি parse মেথড তৈরি করুন। Scrapy অভ্যন্তরীণভাবে পূর্বে ভিজিট করা URL-গুলো বাইপাস করে রেন্ডারিং টাইম কমায়।
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# জেনারেটর ফাংশন
def start_requests(self):
# URL দিন
urls = ['https://www.tutorialspoint.com/index.htm/', ]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
# Parse ফাংশন
def parse(self, response):
title = response.css('title::text').extract_first()
# অ্যাঙ্কর ট্যাগ পান
links = response.css('a::attr(href)').extract()
for link in links:
yield {
'title': title,
'links': link
}
if 'tutorialspoint' in link:
yield scrapy.Request(url=link, callback=self.parse)
উপসংহার
এই টিউটোরিয়ালে আমরা পাইথনে Scrapy মডিউল ব্যবহার করে ওয়েব ক্রলার বাস্তবায়ন শিখেছি।