Wyodrębnianie informacji o nieruchomościach z Zillow może zapewnić doskonałą analizę rynku i inwestycji. Ten post ma na celu omówienie skrobania ofert nieruchomości Zillow za pomocą Pythona, gdzie będzie on poświęcony najważniejszym podjętym krokom i wytycznym. Ten przewodnik pokaże ci, jak skrobać informacje z witryny Zillow przy użyciu bibliotek takich jak requests i lxml.
Zanim zaczniemy, upewnij się, że masz zainstalowany Python w swoim systemie. Konieczne będzie również zainstalowanie następujących bibliotek:
pip install requests
pip install lxml
Aby wyodrębnić dane z Zillow, musisz zrozumieć strukturę strony internetowej. Otwórz stronę z listą nieruchomości na Zillow i sprawdź elementy, które chcesz wyodrębnić (np. tytuł nieruchomości, szacunkową cenę wynajmu i cenę wyceny).
Tytuł:
Szczegóły ceny:
Teraz wyślijmy żądania HTTP. Najpierw musimy pobrać zawartość HTML strony Zillow. Użyjemy biblioteki requests do wysłania żądania HTTP GET do docelowego adresu URL. Skonfigurujemy również nagłówki żądania, aby naśladowały prawdziwe żądanie przeglądarki i użyjemy serwerów proxy, aby uniknąć blokowania adresów IP.
import requests
# Zdefiniuj docelowy adres URL dla oferty nieruchomości Zillow
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"
# Set up the request headers to mimic a browser request
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-US,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
# Skonfiguruj nagłówki żądania, aby naśladowały żądanie przeglądarki
proxies = {
'http': 'http://username:password@your_proxy_address',
'https://username:password@your_proxy_address',
}
# Wyślij żądanie HTTP GET z nagłówkami i serwerami proxy
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status() # Ensure we got a valid response
Następnie musimy przeanalizować zawartość HTML za pomocą lxml. Użyjemy funkcji fromstring z modułu lxml.html, aby przeanalizować zawartość HTML strony internetowej do obiektu Element.
from lxml.html import fromstring
# Parsowanie zawartości HTML przy użyciu lxml
parser = fromstring(response.text)
Teraz wyodrębnimy określone punkty danych, takie jak tytuł nieruchomości, szacunkowa cena czynszu i cena oszacowania za pomocą zapytań XPath na przeanalizowanej zawartości HTML.
# Wyodrębnianie tytułu właściwości przy użyciu XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))
# Wyodrębnianie szacunkowej ceny wynajmu nieruchomości przy użyciu XPath
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]
# Wyodrębnianie ceny wyceny nieruchomości przy użyciu XPath
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]
# Przechowywanie wyodrębnionych danych w słowniku
property_data = {
'title': title,
'Rent estimate price': rent_estimate_price,
'Assessment price': assessment_price
}
Na koniec zapiszemy wyodrębnione dane do pliku JSON w celu dalszego przetwarzania.
import json
# Zdefiniuj nazwę wyjściowego pliku JSON
output_file = 'zillow_properties.json'
# Otwórz plik w trybie zapisu i zrzuć dane
with open(output_file, 'w') as f:
json.dump(all_properties, f, indent=4)
print(f"Scraped data saved to {output_file}")
Aby zeskrobać wiele ofert nieruchomości, będziemy iterować po liście adresów URL i powtarzać proces ekstrakcji danych dla każdego z nich.
# Lista adresów URL do zeskrobania
urls = [
"https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/",
"https://www.zillow.com/homedetails/5678-Another-St-Some-City-CA-90210/87654321_zpid/"
]
# Lista do przechowywania danych dla wszystkich właściwości
all_properties = []
for url in urls:
# Wyślij żądanie HTTP GET z nagłówkami i serwerami proxy
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status() # Ensure we got a valid response
# Parsowanie zawartości HTML przy użyciu lxml
parser = fromstring(response.text)
# Wyodrębnianie danych przy użyciu XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]
# Przechowywanie wyodrębnionych danych w słowniku
property_data = {
'title': title,
'Rent estimate price': rent_estimate_price,
'Assessment price': assessment_price
}
# Dołączenie danych właściwości do listy
all_properties.append(property_data)
Oto kompletny kod do skrobania danych nieruchomości Zillow i zapisywania ich w pliku JSON:
import requests
from lxml.html import fromstring
import json
# Zdefiniuj docelowe adresy URL dla ofert nieruchomości Zillow
urls = [
"https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/",
"https://www.zillow.com/homedetails/5678-Another-St-Some-City-CA-90210/87654321_zpid/"
]
# Skonfiguruj nagłówki żądania, aby naśladowały żądanie przeglądarki
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-US,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
# Opcjonalnie można skonfigurować serwery proxy, aby uniknąć blokowania adresów IP.
proxies = {
'http': 'http://username:password@your_proxy_address',
'https': 'https://username:password@your_proxy_address',
}
# Lista do przechowywania danych dla wszystkich właściwości
all_properties = []
for url in urls:
try:
# Wyślij żądanie HTTP GET z nagłówkami i serwerami proxy
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status() # Ensure we got a valid response
# Parsowanie zawartości HTML przy użyciu lxml
parser = fromstring(response.text)
# Wyodrębnianie danych przy użyciu XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]
# Przechowywanie wyodrębnionych danych w słowniku
property_data = {
'title': title,
'Rent estimate price': rent_estimate_price,
'Assessment price': assessment_price
}
# Dołączenie danych właściwości do listy
all_properties.append(property_data)
except requests.exceptions.HTTPError as e:
print(f"HTTP error occurred: {e}")
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
# Zdefiniuj nazwę wyjściowego pliku JSON
output_file = 'zillow_properties.json'
# Otwórz plik w trybie zapisu i zrzuć dane
with open(output_file, 'w') as f:
json.dump(all_properties, f, indent=4)
print(f"Scraped data saved to {output_file}")
Dzięki zrozumieniu struktury stron HTML i wykorzystaniu potężnych bibliotek, takich jak requests i lxml, można skutecznie wyodrębniać szczegóły nieruchomości. Korzystanie z serwerów proxy i rotacyjnych User-Agents umożliwia wykonywanie dużej liczby żądań do witryn takich jak Zillow bez ryzyka zablokowania. Dla tych działań, statyczne proxy ISP lub rotacyjne proxy mieszkaniowe są uważane za optymalny wybór.
Komentarze: 0