நிலையான மற்றும் இயங்குநிலை உள்ளடக்க scraping ஆகியவற்றின் அடிப்படைகளை நன்கு கற்றுக்கொண்டுள்ள நிலையில், இப்போது இன்னும் விரிவான ஒரு சவாலைக் கையாண்டு பார்க்க வேண்டிய நேரம் வந்துவிட்டது: பல-பக்க கிராலிங். இந்த பகுதி, ஒன்றோடொன்று இணைக்கப்பட்ட பல பக்கங்கள் கொண்ட இணையதளங்களில் திறமையாகச் சென்று, அவற்றிலிருந்து தரவை எடுப்பதில் கவனம் செலுத்துகிறது.
பல-பக்க இணையதளங்களை கிரால் செய்வதற்கு இரண்டு முக்கிய அணுகுமுறைகள் உள்ளன:
- இணைப்பு-அடிப்படையிலான கிராலிங் - பக்கங்களுக்கு இடையிலான இணைப்புகளைப் பின்தொடருவது
- Sitemap-அடிப்படையிலான கிராலிங் - sitemap.xml கோப்பைப் பயன்படுத்துவது
Sitemap கிராலிங்கிற்காக, பெரும்பாலான இணையதளங்கள் அனைத்து முக்கிய URL-களையும் பட்டியலிடும் sitemap.xml கோப்பை வழங்குகின்றன. இந்த ஒழுங்கமைக்கப்பட்ட XML கோப்பில் பின்வருவன அடங்கும்:
- பக்க URL-கள்
- கடைசியாக மாற்றப்பட்ட தேதிகள்
- மாற்றத் தோற்றம்
- முன்னுரிமை மதிப்புகள்
Sitemap-ஐ பயன்படுத்துவது, இணைப்பு கிராலிங்கை விட அதிக திறனுள்ளதாக இருக்கலாம், ஏனெனில் அது:
- பக்கங்களின் முழுமையான பட்டியலை முன்கூட்டியே வழங்குகிறது
- பக்கங்களின் முக்கியத்துவம் மற்றும் புதுப்பித்த தன்மை குறித்த metadata-ஐ உள்ளடக்குகிறது
- தேவையற்ற பக்கங்களை கிரால் செய்வதைத் தவிர்க்கிறது
- server சுமையை குறைக்கிறது
ஆனால் இந்த அத்தியாயத்தில், பல-பக்க e-commerce தளத்திற்கான ஒரு crawler-ஐ உருவாக்க Crawlee-ஐ பயன்படுத்தி, இணைப்பு-அடிப்படையிலான கிராலிங்கில் நாம் கவனம் செலுத்தப் போகிறோம். Crawlee, web crawling-இன் பல சிக்கலான அம்சங்களை நம்முக்காக கையாளுகிறது. அவற்றில் சில:
- தானியங்கி queue நிர்வாகம் மற்றும் URL deduplication
- உட்பொதிக்கப்பட்ட rate limiting மற்றும் retry logic
- அமைத்துக்கொள்ளக்கூடிய request handling மற்றும் routing
- தரவு சேமிப்பு மற்றும் export
நாம் கிரால் செய்யப் போகும் தளத்தின் கட்டமைப்பு இப்படியாக இருக்கும்:
Homepage
├── Category: Electronics
│ ├── Phones
│ ├── Laptops
│ └── Accessories
├── Category: Clothing
│ ├── Men's
│ └── Women's
└── Featured Products
ஒவ்வொரு product பக்கத்திற்கும் category-ஐப் பொறுத்து வெவ்வேறு layout-கள் இருக்கும். ஆனால் நாம் ஒரே மாதிரியான தகவலை எடுத்தாக வேண்டும்:
// Example data structure we want to build
interface ProductData {
name: string;
price: number;
rating: { score: number, count: number };
features: string[];
status: string; // In Stock, Out of Stock, etc.
}
interface ResultData {
categories: {
electronics: {
phones: ProductData[];
laptops: ProductData[];
accessories: ProductData[];
};
clothing: {
mens: {
shirts: ProductData[];
pants: ProductData[];
};
womens: {
dresses: ProductData[];
tops: ProductData[];
};
};
};
featured_products: FeaturedProduct[];
}
Crawlee உடன் முக்கிய கிராலிங் கருத்துகள்
- Request Queue Management
Crawlee queue-ஐ தானாகவே கையாளுகிறது. ஆனால் அதை நாம் எப்படி அமைக்கிறோம் என்பது இதோ:
import { CheerioCrawler } from 'crawlee';
const crawler = new CheerioCrawler({
// Handles each request
async requestHandler({ $, request, enqueueLinks }) {
// Process the page
const data = extractPageData($);
// Automatically queue new URLs found on the page
await enqueueLinks({
selector: 'a',
baseUrl: request.loadedUrl,
});
},
// Limit concurrent requests
maxConcurrency: 10,
});
- URL Handling
Crawlee, உட்பொதிக்கப்பட்ட URL handling மற்றும் normalization வசதிகளை வழங்குகிறது:
await crawler.run([startUrl]);
// Or with more configuration:
await crawler.addRequests([{
url: startUrl,
userData: {
label: 'start',
},
}]);
- Route Handling
வேறுபட்ட URL-களை குறிப்பிட்ட handler-களுக்கு route செய்யுங்கள்:
const crawler = new CheerioCrawler({
async requestHandler({ $, request }) {
const { label } = request.userData;
switch (label) {
case 'category':
return handleCategory($);
case 'product':
return handleProduct($);
default:
return handleHomepage($);
}
},
});
- Data Collection
சேகரிக்கப்பட்ட தரவிற்கான உட்பொதிக்கப்பட்ட storage-ஐ Crawlee வழங்குகிறது:
const crawler = new CheerioCrawler({
async requestHandler({ $, pushData }) {
const productData = extractProduct($);
await pushData(productData);
},
});
Web Crawling சிறந்த நடைமுறைகள்
கீழ்மட்டத்தில் உள்ள பல அம்சங்களை Crawlee கையாளுகிறதெனினும், நீங்கள் இன்னும் பின்வருவனைக் கருத்தில் கொள்ள வேண்டும்:
-
Configuration
- பொருத்தமான rate limit-களை அமைக்கவும்
- retry strategy-களை அமைத்துக்கொள்ளவும்
- பொருள் உள்ள user-agent string-களை அமைக்கவும்
-
Error Handling
- Crawlee-யின் உட்பொதிக்கப்பட்ட error handling-ஐ பயன்படுத்தவும்
- தனிப்பயன் error callback-களை செயல்படுத்தவும்
- பயனுள்ள diagnostic தகவலை பதிவு செய்யவும்
-
Data Organization
- உங்கள் தரவை ஒரே மாதிரியாக ஒழுங்கமைக்கவும்
- routing-க்காக request label-களை பயன்படுத்தவும்
- Crawlee-யின் dataset அம்சங்களைப் பயன்படுத்திக் கொள்ளவும்
-
Resource Management
- maxConcurrency-ஐ பொருத்தமாக அமைக்கவும்
- தேவையானபோது maxRequestsPerCrawl-ஐ பயன்படுத்தவும்
- memory பயன்பாட்டைக் கண்காணிக்கவும்
சவால்
நீங்கள் செய்ய வேண்டிய பணி, பின்வருவனவற்றைச் செய்யும் Crawlee-அடிப்படையிலான crawler-ஐ உருவாக்குவது:
- homepage-இல் தொடங்கி அனைத்து product category-களையும் கண்டறிதல்
- ஒவ்வொரு category மற்றும் subcategory பக்கத்தையும் பார்வையிடுதல்
- ஒவ்வொரு listing-இலிருந்தும் product தகவலை எடுப்பது
- தரவை ஒழுங்கமைக்கப்பட்ட கட்டமைப்பாக அமைத்தல்
- பல இடங்களில் தோன்றும் product-களை கையாளுதல் (உதா., featured மற்றும் category)
இந்த தளத்தில் சுமார் 25-30 product-கள் பல்வேறு category-களில் உள்ளன; அவற்றின் layout-களும் தகவல் கட்டமைப்புகளும் மாறுபடுகின்றன. உங்கள் crawler, category-களுக்கும் product-களுக்கும் இடையிலான படிநிலை உறவைப் பாதுகாத்து, முழுமையான dataset ஒன்றை உருவாக்க வேண்டும்.
உங்கள் தீர்வை சோதிப்பது
பின்வருவனவற்றைச் சோதியுங்கள்:
- முழுமை: நீங்கள் அனைத்து product-களையும் கண்டுபிடித்தீர்களா?
- துல்லியம்: எடுத்த தரவு சரியாக உள்ளதா?
- கட்டமைப்பு: தரவு சரியாக ஒழுங்குபடுத்தப்பட்டுள்ளதா?
- திறன்: நீங்கள் எத்தனை request-களைச் செய்தீர்கள்?
exercises/chapter-06/solution/src/ இல் உள்ள reference solution, Crawlee-ஐ பயன்படுத்திய செயல்படும் ஒரு implementation-ஐ வழங்குகிறது. திறமையான பல-பக்க கிராலிங் மற்றும் தரவு ஒழுங்கமைப்பிற்காக library-யின் அம்சங்களை எப்படி பயன்படுத்துவது என்பதைப் புரிந்துகொள்ள அதைப் படியுங்கள்.
மகிழ்ச்சியான கிராலிங்!