Airbnb डेटा तक पहुंच प्राप्त करना अचल संपत्ति बाजार का विश्लेषण करने, किराये की कीमत की गतिशीलता पर शोध करने, प्रतिस्पर्धी विश्लेषण करने और समीक्षाओं और रेटिंग का आकलन करने के लिए महत्वपूर्ण है। यह वेब डेटा को स्क्रैप करके पूरा किया जा सकता है। हालांकि, इस डेटा तक पहुंचना चुनौतीपूर्ण हो सकता है क्योंकि स्क्रैपिंग साइट के उपयोग की शर्तों का उल्लंघन कर सकता है।
इसके बाद, हम पायथन और सेलेनियम का उपयोग करके एयरबीएनबी लिस्टिंग से डेटा निकालने के लिए एक वेब स्क्रैपर विकसित करने के लिए एक चरण-दर-चरण गाइड का पता लगाएंगे। यह गाइड यह भी कवर करेगा कि मंच द्वारा लगाए गए संभावित ब्लॉकों और प्रतिबंधों से कैसे बचा जाए।
वेब स्क्रैपर बनाने में पहला कदम यह समझ रहा है कि आपके द्वारा रुचि रखने वाले वेब पेजों तक कैसे पहुंचना है, क्योंकि वेबसाइटों की संरचना अक्सर बदल सकती है। किसी साइट की संरचना के साथ खुद को परिचित करने के लिए, आप वेब पेज के HTML का निरीक्षण करने के लिए ब्राउज़र के डेवलपर टूल का उपयोग कर सकते हैं।
डेवलपर टूल तक पहुंचने के लिए, वेबपेज पर राइट-क्लिक करें और "निरीक्षण" चुनें या शॉर्टकट का उपयोग करें:
प्रत्येक लिस्टिंग कंटेनर को निम्न विशेषता के साथ एक DIV तत्व में लपेटा जाता है: class = "g1qv1ctd"।
"स्थान" और टाइपिंग "लंदन, यूके" पर क्लिक करके हम लंदन में दिए गए स्थान तक पहुंच सकते हैं। वेबसाइट चेक-इन और चेक-आउट तिथियों को जोड़ने का सुझाव देती है। यह उन्हें कमरों की कीमत की गणना करने की अनुमति देता है।
इस पृष्ठ के लिए URL कुछ इस तरह दिखेगा:
url = "https://www.airbnb.com/s/London--United-Kingdom/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_lengths%5B%5D=one_week&monthly_start_date=2024-01-01&monthly_length=3&price_filter_input_type=0&channel=EXPLORE&query=London%2C%20United%20Kingdom&place_id=ChIJdd4hrwug2EcRmSrV3Vo6llI&date_picker_type=calendar&source=structured_search_input_header&search_type=autocomplete_click"
खोज पृष्ठ से, हम उत्पाद लिस्टिंग डेटा की निम्न विशेषताओं को परिमार्जन करेंगे:
Airbnb डेटा के लिए वेब स्क्रैपिंग शुरू करने के लिए, आपको पहले अपना विकास वातावरण स्थापित करना होगा। यहाँ ऐसा करने के लिए कदम हैं:
आभासी वातावरण आपको विभिन्न परियोजनाओं के लिए पायथन पैकेज और उनकी निर्भरता को अलग करने की अनुमति देता है। यह संघर्षों को रोकने में मदद करता है और यह सुनिश्चित करता है कि प्रत्येक परियोजना में सही निर्भरताएं स्थापित हैं।
व्यवस्थापक विशेषाधिकारों के साथ एक कमांड प्रॉम्प्ट खोलें और "VENV" नामक एक नया आभासी वातावरण बनाने के लिए निम्न कमांड चलाएं:
python -m venv venv
आभासी वातावरण को सक्रिय करें:
venv\Scripts\activate
एक टर्मिनल खोलें और "VENV" नामक एक नया आभासी वातावरण बनाने के लिए निम्न कमांड चलाएं:
sudo python3 -m venv venv
आभासी वातावरण को सक्रिय करें:
source venv/bin/activate
आभासी वातावरण को निष्क्रिय करने के लिए, बस निम्न कमांड चलाएं:
deactivate
अब जब आपके पास एक आभासी वातावरण है, तो आप आवश्यक पुस्तकालयों को स्थापित कर सकते हैं।
अपने सक्रिय आभासी वातावरण के भीतर, आवश्यक पुस्तकालयों को स्थापित करने के लिए निम्न कमांड चलाएं:
pip install selenium beautifulsoup4 lxml seleniumwire
सेलेनियम को चुने हुए ब्राउज़र के साथ इंटरफेस करने के लिए एक ड्राइवर की आवश्यकता होती है। हम इस गाइड के लिए क्रोम का उपयोग करेंगे। हालाँकि, कृपया सुनिश्चित करें कि आपने अपनी पसंद के ब्राउज़र के लिए उपयुक्त WebDriver स्थापित किया है।
एक बार डाउनलोड होने के बाद, सुनिश्चित करें कि ड्राइवर को आपके सिस्टम के पथ पर्यावरण चर द्वारा सुलभ निर्देशिका में रखा गया है। यह सेलेनियम को ड्राइवर को खोजने और ब्राउज़र को नियंत्रित करने की अनुमति देगा।
अपनी पायथन फ़ाइल की शुरुआत में, सेलेनियमवायर और ब्यूटीफुल लाइब्रेरी आयात करें। इसे आपको इसी तरह करना होगा:
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import csv
import random
हम विभिन्न उपयोगिताओं के लिए `यादृच्छिक`,` समय ', और `सीएसवी` पुस्तकालयों को भी आयात करेंगे।
इसके बाद, हम Airbnb द्वारा अवरुद्ध होने से बचने के लिए प्रॉक्सी की एक सूची को परिभाषित करते हैं। प्रीमियम प्रॉक्सी के बिना अनुरोध भेजने की कोशिश करते समय, आप "एक्सेस इनकारित" प्रतिक्रिया का सामना कर सकते हैं।
आप निम्नानुसार एक प्रॉक्सी सेट कर सकते हैं:
# प्रॉक्सी की सूची
proxies = [
"username:password@Your_proxy_IP_Address:Your_proxy_port1",
"username:password@Your_proxy_IP_Address:Your_proxy_port2",
"username:password@Your_proxy_IP_Address:Your_proxy_port3",
"username:password@Your_proxy_IP_Address:Your_proxy_port4",
"username:password@Your_proxy_IP_Address:Your_proxy_port5",
]
प्रॉक्सी-विक्रेता से प्राप्त वास्तविक प्रॉक्सी पते के साथ "your_proxy_ip_address" और "your_proxy_port" को बदलना सुनिश्चित करें और अपने वास्तविक क्रेडेंशियल्स के साथ "उपयोगकर्ता नाम" और "पासवर्ड" के मूल्यों को भी बदल दें।
रोटिंग प्रॉक्सी वेब स्क्रैपिंग का एक महत्वपूर्ण पहलू है। जब वे एक ही आईपी पते से कई अनुरोध प्राप्त करते हैं, तो वेबसाइटें अक्सर बॉट और स्क्रेपर्स तक पहुंच को अवरुद्ध या प्रतिबंधित करती हैं। विभिन्न प्रॉक्सी आईपी पते के माध्यम से घूमने से, आप पता लगाने से बच सकते हैं, कई कार्बनिक उपयोगकर्ताओं के रूप में दिखाई दे सकते हैं, और वेबसाइट पर लागू किए गए अधिकांश एंटी-स्क्रैपिंग उपायों को बायपास कर सकते हैं।
प्रॉक्सी रोटेशन सेट करने के लिए, "यादृच्छिक" पुस्तकालय आयात करें। हम अपनी सूची से एक प्रॉक्सी का चयन करने के लिए एक फ़ंक्शन `get_proxy ()` को भी परिभाषित करते हैं। यह फ़ंक्शन यादृच्छिक रूप से यादृच्छिक.चॉइस () विधि का उपयोग करके प्रॉक्सी की सूची से एक प्रॉक्सी का चयन करता है और चयनित प्रॉक्सी लौटाता है।
def get_proxy():
return random.choice(proxies)
अगला, हम `लिस्टिंग ()` नामक मुख्य फ़ंक्शन को परिभाषित करते हैं। यह वह जगह है जहाँ हम अपने "Chromedriver" की स्थापना करेंगे। यह फ़ंक्शन प्रॉपर्टी लिस्टिंग पेज को नेविगेट करने के लिए सेलेनियम का उपयोग करता है, पेज को लोड करने के लिए इंतजार करता है, और सुंदर सूप का उपयोग करके HTML को पार्स करता है।
def listings(url):
proxy = get_proxy()
proxy_options = {
"proxy": {
"http": f"http://{proxy}",
"https": f"http://{proxy}",
"no_proxy": "localhost,127.0.0.1",
}
}
chrome_options = Options()
chrome_options.add_argument("--headless")
s = Service(
"C:/Path_To_Your_WebDriver"
) # Chromedriver के लिए अपने पथ के साथ बदलें
driver = webdriver.Chrome(
service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
)
driver.get(url)
time.sleep(8) # वेबसाइट के लोड समय के आधार पर समायोजित करें
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit()
यहां, हम एक यादृच्छिक प्रॉक्सी का चयन करके और प्रॉक्सी विकल्पों को सेट करके शुरू करते हैं। इन विकल्पों का उपयोग प्रॉक्सी सर्वर का उपयोग करने के लिए WebDriver को कॉन्फ़िगर करने के लिए किया जाएगा। अगला, हम क्रोम विकल्प सेट करते हैं। ब्राउज़र को हेडलेस मोड में चलाने के लिए -हेडलेस तर्क जोड़ें, जिसका अर्थ है कि ब्राउज़र एक ग्राफिकल यूजर इंटरफेस के बिना पृष्ठभूमि में चलेगा।
फिर सेवा, सेलेनियमवायर विकल्प और क्रोम विकल्प के साथ WebDriver को इनिशियलाइज़ करें। WebDriver तब दिए गए URL पर नेविगेट करने के लिए उपयोग किया जाता है। हम पृष्ठ को पूरी तरह से लोड करने की अनुमति देने के लिए 8 सेकंड का नींद का समय जोड़ते हैं, और फिर सुंदर सूप का उपयोग करके लौटे HTML को पार्स करते हैं। पार्सिंग होने के बाद, यह वेबड्राइवर को बंद कर देता है।
एक बार जब आप HTML सामग्री को सफलतापूर्वक प्राप्त कर लेते हैं, तो अगला कदम प्रत्येक लिस्टिंग के लिए प्रासंगिक डेटा निकालना है। BeartherSoup का उपयोग करते हुए, हम HTML संरचना के माध्यम से आसानी से नेविगेट कर सकते हैं और लिस्टिंग जानकारी वाले तत्वों का पता लगा सकते हैं।
सबसे पहले, हम पृष्ठ पर सभी लिस्टिंग तत्वों की पहचान करते हैं। इन तत्वों में वह डेटा होता है जिसमें हम रुचि रखते हैं, जैसे कि लिस्टिंग URL, शीर्षक, विवरण, रेटिंग, मूल्य और अतिरिक्त जानकारी।
listing_elements = soup.find_all("div", class_="g1qv1ctd")
for listing_element in listing_elements:
यह कोड BeautifulSoup के Find_all () विधि का उपयोग करता है, जो सभी DIV तत्वों को "G1QV1CTD" के साथ पता लगाने के लिए है। ये तत्व Airbnb पृष्ठ पर व्यक्तिगत लिस्टिंग का प्रतिनिधित्व करते हैं। यह तब संबंधित डेटा को निकालने के लिए इन लिस्टिंग तत्वों में से प्रत्येक के माध्यम से लूप करता है।
पाए गए प्रत्येक लिस्टिंग तत्व के लिए, हम लिस्टिंग के URL को निकालते हैं।
URL_element = soup.find("a", class_="rfexzly")
listing_data["Listing URL"] = (
"https://www.airbnb.com" + URL_element["href"] if URL_element else ""
)
यहाँ, हम कक्षा "rfexzly" के साथ एक लंगर टैग के लिए अपने "सूप" ऑब्जेक्ट के भीतर खोजते हैं। यदि यह इस तत्व को ढूंढता है, तो यह 'HREF' विशेषता (जिसमें सापेक्ष URL होता है) को निकाला जाता है और इसे पूर्ण लिस्टिंग URL बनाने के लिए आधार URL में जोड़ता है। यदि तत्व नहीं पाया जाता है, तो यह त्रुटियों से बचने के लिए एक खाली स्ट्रिंग प्रदान करता है।
सबसे पहले, हम प्रत्येक लिस्टिंग के लिए URL निकालेंगे। यह हमें जरूरत पड़ने पर बाद में व्यक्तिगत लिस्टिंग पृष्ठों पर जाने की अनुमति देगा।
title_element = listing_element.find("div", class_="t1jojoys")
listing_data["Title"] = (
title_element.get_text(strip=True) if title_element else ""
)
शीर्षक "T1jojoys" वर्ग के साथ एक "DIV" तत्व के भीतर समाहित है। हम इस तत्व की पाठ सामग्री को पुनः प्राप्त करते हैं, किसी भी अग्रणी या अनुगामी व्हाट्सएप को छीनते हैं। यदि तत्व नहीं पाया जाता है तो एक खाली स्ट्रिंग संग्रहीत की जाती है।
Description_element = listing_element.find("span", class_="t6mzqp7")
listing_data["Description"] = (
Description_element.get_text(strip=True) if Description_element else ""
)
शीर्षक निष्कर्षण के समान, यह कोड "T6MZQP7" वर्ग के साथ एक स्पैन तत्व पाता है। फिर हम इस तत्व की पाठ सामग्री को निकालते हैं और साफ करते हैं, जिसमें लिस्टिंग का संक्षिप्त विवरण होता है।
rating_element = listing_element.find("span", class_="ru0q88m")
listing_data["Rating"] = (
rating_element.get_text(strip=True) if rating_element else ""
)
जैसा कि ऊपर दिए गए कोड में देखा गया है, वर्ग "RU0Q88M" के साथ एक स्पैन तत्व रेटिंग मान रखता है। हम इस मूल्य को निकालते हैं, किसी भी अनावश्यक व्हाट्सएप को पट्टी करने के लिए सुनिश्चित करते हैं।
अंत में, हम लिस्टिंग की कीमत निकालते हैं।
price_element = listing_element.select_one("._1y74zjx")
listing_data["Price"] = (
f"{price_element.get_text(strip=True)} per night" if price_element else ""
)
यह कोड वर्तमान लिस्टिंग_लमेंट के भीतर "_1Y74ZJX" वर्ग के साथ तत्व का पता लगाता है। यदि यह तत्व, जिसमें आमतौर पर मूल्य की जानकारी होती है, तो पाया जाता है, इसकी पाठ सामग्री को अधिक जानकारीपूर्ण मूल्य स्ट्रिंग बनाने के लिए "प्रति रात" के साथ निकाला जाता है, साफ किया जाता है, और संलग्न किया जाता है।
कुछ लिस्टिंग में अतिरिक्त जानकारी हो सकती है जिसे हम निकाल सकते हैं।
listing_info_element = listing_element.find("span", {"aria-hidden": "true"})
listing_data["Additional Listing information"] = (
listing_info_element.get_text(strip=True) if listing_info_element else ""
)
हम लिस्टिंग के बारे में कोई अतिरिक्त जानकारी खोजने के लिए विशेषता आरिया-हिडन = "ट्रू" के साथ एक स्पैन तत्व की खोज करते हैं। प्रत्येक लिस्टिंग तत्व से सभी प्रासंगिक डेटा निकालने के बाद, हम एकत्र किए गए डेटा को लिस्टिंग की सूची में जोड़ते हैं।
listings.append(listing_data)
एक बार जब सभी लिस्टिंग संसाधित हो जाती हैं, तो हम लिस्टिंग की सूची वापस कर देते हैं, प्रत्येक को निकाले गए डेटा वाले शब्दकोश के रूप में दर्शाया जाता है।
return listings
Airbnb के लिस्टिंग पृष्ठों से डेटा को सफलतापूर्वक स्क्रैप करने के बाद, अगला महत्वपूर्ण कदम भविष्य के विश्लेषण और संदर्भ के लिए इस मूल्यवान जानकारी को संग्रहीत कर रहा है। हम इस कार्य के लिए CSV लाइब्रेरी का उपयोग करते हैं। हम राइट मोड में एक CSV फ़ाइल खोलते हैं और CSV.DICTWRITER ऑब्जेक्ट बनाते हैं। हम तब हेडर और डेटा को फ़ाइल में लिखते हैं।
airbnb_listings = listings(url)
csv_file_path = "proxy_web_listings_output.csv"
with open(csv_file_path, "w", encoding="utf-8", newline="") as csv_file:
fieldnames = [
"Listing URL",
"Title",
"Description",
"Rating",
"Price",
"Additional Listing information",
]
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for listing in airbnb_listings:
writer.writerow(listing)
print(f"Data has been exported to {csv_file_path}")
यहाँ एक पूर्ण कोड है जिसका उपयोग हमने इस ट्यूटोरियल के लिए किया है:
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import csv
import random
# प्रॉक्सी की सूची
proxies = [
"username:password@Your_proxy_IP_Address:Your_proxy_port1",
"username:password@Your_proxy_IP_Address:Your_proxy_port2",
"username:password@Your_proxy_IP_Address:Your_proxy_port3",
"username:password@Your_proxy_IP_Address:Your_proxy_port4",
"username:password@Your_proxy_IP_Address:Your_proxy_port5",
]
def get_proxy():
return random.choice(proxies)
def listings(url):
proxy = get_proxy()
proxy_options = {
"proxy": {
"http": f"http://{proxy}",
"https": f"http://{proxy}",
"no_proxy": "localhost,127.0.0.1",
}
}
chrome_options = Options()
chrome_options.add_argument("--headless")
s = Service(
"C:/Path_To_Your_WebDriver"
) # Chromedriver के लिए अपने पथ के साथ बदलें
driver = webdriver.Chrome(
service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
)
driver.get(url)
time.sleep(8) # वेबसाइट के लोड समय के आधार पर समायोजित करें
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit()
listings = []
# पृष्ठ पर सभी लिस्टिंग तत्वों का पता लगाएं
listing_elements = soup.find_all("div", class_="g1qv1ctd")
for listing_element in listing_elements:
# प्रत्येक लिस्टिंग तत्व से डेटा निकालें
listing_data = {}
# लिस्टिंग URL
URL_element = soup.find("a", class_="rfexzly")
listing_data["Listing URL"] = (
"https://www.airbnb.com" + URL_element["href"] if URL_element else ""
)
# शीर्षक
title_element = listing_element.find("div", class_="t1jojoys")
listing_data["Title"] = (
title_element.get_text(strip=True) if title_element else ""
)
# विवरण
Description_element = listing_element.find("span", class_="t6mzqp7")
listing_data["Description"] = (
Description_element.get_text(strip=True) if Description_element else ""
)
# रेटिंग
rating_element = listing_element.find("span", class_="ru0q88m")
listing_data["Rating"] = (
rating_element.get_text(strip=True) if rating_element else ""
)
# कीमत
price_element = listing_element.select_one("._1y74zjx")
listing_data["Price"] = (
f"{price_element.get_text(strip=True)} per night" if price_element else ""
)
# अतिरिक्त लिस्टिंग जानकारी
listing_info_element = listing_element.find("span", {"aria-hidden": "true"})
listing_data["Additional Listing information"] = (
listing_info_element.get_text(strip=True) if listing_info_element else ""
)
# लिस्टिंग डेटा को सूची में जोड़ें
listings.append(listing_data)
return listings
url = "https://www.airbnb.com/s/London--United-Kingdom/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_lengths%5B%5D=one_week&monthly_start_date=2024-01-01&monthly_length=3&price_filter_input_type=0&channel=EXPLORE&query=London%2C%20United%20Kingdom&place_id=ChIJdd4hrwug2EcRmSrV3Vo6llI&date_picker_type=calendar&source=structured_search_input_header&search_type=autocomplete_click"
airbnb_listings = listings(url)
csv_file_path = "proxy_web_listings_output.csv"
with open(csv_file_path, "w", encoding="utf-8", newline="") as csv_file:
fieldnames = [
"Listing URL",
"Title",
"Description",
"Rating",
"Price",
"Additional Listing information",
]
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for listing in airbnb_listings:
writer.writerow(listing)
print(f"Data has been exported to {csv_file_path}")
कोड का यह हिस्सा यह सुनिश्चित करता है कि स्क्रैप किया गया डेटा "PROXY_WEB_LISTINGS_OUTPUT.CSV" नामक CSV फ़ाइल में संग्रहीत है।
हमारे स्क्रैपर के परिणामों को "PROXY_WEB_LISTINGS_OUTPUT.CSV" नामक CSV फ़ाइल में सहेजा जाता है।
यह गाइड प्रभावी रूप से बताता है कि पायथन का उपयोग करके एयरबीएनबी लिस्टिंग से डेटा को कैसे परिमार्जन किया जाए, जो कीमतों, उपलब्धता और समीक्षाओं जैसे प्रमुख विवरणों के निष्कर्षण को सक्षम करता है। यह एयरबीएनबी के एंटी-बॉट उपायों द्वारा अवरुद्ध होने से रोकने के लिए प्रॉक्सी का उपयोग करने और उन्हें घुमाने के महत्व पर जोर देता है।
टिप्पणियाँ: 0