इस लेख में, हम प्रदर्शित करेंगे कि कैसे Booking.com वेबसाइट से पायथन के साथ डेटा एकत्र किया जाए। हम शामिल हैं, लेकिन होटल के नाम, रेटिंग, कीमतें, स्थान पते और उनके विवरण तक सीमित नहीं हैं। प्रदान किया गया कोड आपको HTML सामग्री को पार्स करके और एम्बेडेड JSON डेटा निकालकर होटल पृष्ठों से डेटा प्राप्त करने की अनुमति देता है।
Booking.com से डेटा को स्क्रैप करने के लिए कोड चलाने से पहले, आपको आवश्यक पायथन पुस्तकालयों को स्थापित करना होगा। यहां बताया गया है कि आप आवश्यक निर्भरता कैसे स्थापित कर सकते हैं:
आवश्यक लाइब्रेरी इंस्टॉल करने के लिए, आप pip का उपयोग कर सकते हैं:
pip install requests lxml
ये केवल बाहरी लाइब्रेरी हैं जिनकी आपको आवश्यकता होगी, बाकी (json, csv) पहले से ही Python में प्री-इंस्टॉल होती हैं।
Booking.com से डेटा स्क्रैप करते समय, वेबपेज की संरचना और उस डेटा को समझना महत्वपूर्ण है जिसे आप निकालना चाहते हैं। प्रत्येक होटल पेज में JSON-LD के रूप में एम्बेडेड संरचित डेटा होता है, जो नाम, स्थान और मूल्य जैसी जानकारियों को आसानी से निकालने की सुविधा देता है। हम इसी डेटा को स्क्रैप करेंगे।
चूंकि Booking.com एक डायनामिक साइट है और स्वचालित गतिविधियों को रोकने के लिए विभिन्न सुरक्षा उपाय अपनाता है, हम उचित HTTP हेडर और प्रॉक्सी का उपयोग करेंगे ताकि स्क्रैपिंग को सुचारू रूप से किया जा सके और ब्लॉक होने का खतरा न हो।
हेडर ब्राउज़र में एक उपयोगकर्ता सत्र की नकल करते हैं और Booking.com की एंटी-स्क्रैपिंग सिस्टम द्वारा पहचान होने से बचाते हैं। यदि हेडर सही तरीके से कॉन्फ़िगर नहीं किए जाते हैं, तो सर्वर स्वचालित स्क्रिप्ट को आसानी से पहचान सकता है, जिससे IP ब्लॉकिंग या कैप्चा चुनौतियां आ सकती हैं।
Booking.com के एंटी-स्क्रैपिंग मैकेनिज़्म से बचने के लिए, हम कस्टम हेडर का उपयोग करेंगे ताकि एक वास्तविक उपयोगकर्ता की ब्राउज़िंग गतिविधि का अनुकरण किया जा सके। यहां बताया गया है कि आप सही हेडर के साथ HTTP अनुरोध कैसे भेज सकते हैं:
import requests
from lxml.html import fromstring
urls_list = ["https links"]
for url in urls_list:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
प्रॉक्सी का उपयोग करना आवश्यक होता है जब हम Booking.com जैसी साइट्स से डेटा स्क्रैप कर रहे होते हैं, क्योंकि ये साइटें सख्त अनुरोध दर सीमाएँ लागू करती हैं या IP पतों को ट्रैक करती हैं। प्रॉक्सी विभिन्न IP पतों के बीच अनुरोधों का भार वितरित करने में मदद करते हैं, जिससे ब्लॉक होने से बचा जा सकता है। इस उद्देश्य के लिए, मुफ्त प्रॉक्सी और भुगतान किए गए प्रॉक्सी सेवाओं (जो उपयोगकर्ता नाम और पासवर्ड या IP पते के माध्यम से प्रमाणीकरण प्रदान करते हैं) दोनों का उपयोग किया जा सकता है। हमारे उदाहरण में, हम दूसरी विधि का उपयोग करेंगे।
proxies = {
'http': '',
'https': ''
}
response = requests.get(url, headers=headers, proxies=proxies)
अनुरोध भेजने के बाद, हम lxml का उपयोग करके HTML सामग्री को पार्स करते हैं ताकि एम्बेडेड JSON-LD डेटा का पता लगाया जा सके, जिसमें होटल से जुड़ी जानकारी होती है। यह चरण वेबपेज से संरचित डेटा निकालता है, जिसमें होटल के नाम, मूल्य, स्थान और अन्य विवरण शामिल होते हैं।
parser = fromstring(response.text)
# एम्बेडेड JSON डेटा निकालें
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
एक बार जब हमारे पास पार्सडेड JSON डेटा होता है, तो हम प्रासंगिक फ़ील्ड जैसे होटल का नाम, पता, रेटिंग और मूल्य निर्धारण कर सकते हैं। नीचे JSON से होटल की जानकारी निकालने के लिए कोड है:
name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
# डेटा को all_data सूची में जोड़ें
all_data.append({
"Name": name,
"Location": location,
"Price Range": priceRange,
"Rating": ratingValue,
"Review Count": reviewCount,
"Type": type_,
"Postal Code": postalCode,
"Address Locality": addressLocality,
"Country": addressCountry,
"Region": addressRegion,
"Street Address": streetAddress,
"URL": url,
"Image URL": image_url,
"Room Types": room_types
})
एक बार डेटा निकालने के बाद, हम इसे आगे के विश्लेषण के लिए CSV फ़ाइल में सहेज सकते हैं:
# सभी URL संसाधित होने के बाद, डेटा को CSV फ़ाइल में लिखें
with open('booking_data.csv', 'w', newline='') as csvfile:
fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code",
"Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# हेडर लिखें
writer.writeheader()
# डेटा की पंक्तियाँ लिखें
writer.writerows(all_data)
यहाँ सभी वर्गों के संयोजन का पूरा कोड है:
import requests
from lxml.html import fromstring
import json
import csv
# परिमार्जन करने के लिए होटल URL की सूची
urls_list = [
"Https link",
"Https link"
]
# सभी स्क्रैप किए गए डेटा को रखने के लिए एक खाली सूची को प्रारंभ करें
all_data = []
proxies = {
'http': ''
}
# डेटा को परिमार्जन करने के लिए प्रत्येक URL के माध्यम से लूप
for url in urls_list:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}
# वेबसाइट पर अनुरोध भेजना
response = requests.get(url, headers=headers, proxies=proxies)
# HTML सामग्री को पार्स करना
parser = fromstring(response.text)
# एम्बेडेड JSON डेटा निकालें
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
# JSON से सभी होटल विवरण निकालें
name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
# डेटा को all_data सूची में जोड़ें
all_data.append({
"Name": name,
"Location": location,
"Price Range": priceRange,
"Rating": ratingValue,
"Review Count": reviewCount,
"Type": type_,
"Postal Code": postalCode,
"Address Locality": addressLocality,
"Country": addressCountry,
"Region": addressRegion,
"Street Address": streetAddress,
"URL": url,
"Image URL": image_url,
"Room Types": room_types
})
# सभी URL संसाधित होने के बाद, डेटा को CSV फ़ाइल में लिखें
with open('booking_data.csv', 'w', newline='') as csvfile:
fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code",
"Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# हेडर लिखें
writer.writeheader()
# डेटा की पंक्तियाँ लिखें
writer.writerows(all_data)
print("Data successfully saved to booking_data.csv")
इस लेख में दिखाया गया है कि पायथन का उपयोग करके Booking.com से होटल के डेटा को कैसे परिमार्जन किया जाए। हमने एंटी-स्क्रैपिंग उपायों को बायपास करने के लिए उपयुक्त HTTP हेडर और प्रॉक्सी का उपयोग करने के महत्व पर जोर दिया। निकाले गए डेटा को आगे के विश्लेषण के लिए CSV फ़ाइल में सहेजा जा सकता है। वेबसाइटों को स्क्रैप करते समय, उल्लंघन से बचने के लिए हमेशा सेवा की शर्तों की जांच करें।
टिप्पणियाँ: 0