Skrobanie danych z Yelp może dostarczyć cennych informacji na temat lokalnych restauracji, w tym szczegółów takich jak nazwa, adres URL, kuchnie i oceny. Korzystając z bibliotek requests i lxml Pythona, ten samouczek pokaże, jak skrobać wyniki wyszukiwania Yelp. Omówionych zostanie kilka technik, w tym korzystanie z serwerów proxy, obsługa nagłówków i wyodrębnianie danych za pomocą XPath.
Przed rozpoczęciem procesu skrobania upewnij się, że masz zainstalowany Python i wymagane biblioteki:
pip install requests
pip install lxml
Te biblioteki pomogą nam wysyłać żądania HTTP do Yelp, analizować zawartość HTML i wyodrębniać potrzebne nam dane.
Najpierw musimy wysłać żądanie GET do strony wyników wyszukiwania Yelp, aby pobrać zawartość HTML. Oto jak to zrobić:
import requests
# Adres URL strony wyszukiwania Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"
# Wyślij żądanie GET, aby pobrać zawartość HTML
response = requests.get(url)
# Sprawdź, czy żądanie się powiodło
if response.status_code == 200:
print("Successfully fetched the page content")
else:
print("Failed to retrieve the page content")
Podczas wysyłania żądań do witryny internetowej konieczne jest dołączenie odpowiednich nagłówków HTTP. Nagłówki mogą zawierać metadane dotyczące żądania, takie jak agent użytkownika, który identyfikuje przeglądarkę lub narzędzie wykonujące żądanie. Uwzględnienie tych nagłówków może pomóc uniknąć blokowania lub dławienia przez docelową witrynę internetową.
Oto jak skonfigurować nagłówki:
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': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'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/127.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
Podczas skrobania dużej ilości stron istnieje ryzyko, że adres IP użytkownika zostanie zablokowany przez witrynę docelową. Aby temu zapobiec, zaleca się korzystanie z serwerów proxy. W tym przewodniku zaleca się korzystanie z dynamicznych serwerów proxy z funkcją automatycznej rotacji. W ten sposób wystarczy tylko raz skonfigurować ustawienia serwera proxy, a rotacja pomoże utrzymać dostęp poprzez okresową zmianę adresu IP, zmniejszając prawdopodobieństwo zablokowania.
proxies = {
'http': 'http://username:password@proxy-server:port',
'https': 'https://username:password@proxy-server:port'
}
response = requests.get(url, headers=headers, proxies=proxies)
Gdy mamy już zawartość HTML, następnym krokiem jest jej przeanalizowanie i wyodrębnienie odpowiednich danych. W tym celu użyjemy biblioteki lxml.
from lxml import html
# Parsowanie zawartości HTML przy użyciu lxml
parser = html.fromstring(response.content)
Musimy kierować reklamy na poszczególne listy restauracji na stronie wyników wyszukiwania. Elementy te można zidentyfikować za pomocą wyrażeń XPath. W przypadku Yelp, oferty są zwykle zawinięte w element div z określonym atrybutem data-testid.
# Wyodrębnianie poszczególnych elementów restauracji
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]
XPath to potężne narzędzie do nawigacji i wybierania węzłów z dokumentu HTML. W tym samouczku użyjemy wyrażeń XPath do wyodrębnienia nazwy restauracji, adresu URL, kuchni i oceny z każdego elementu restauracji.
Oto konkretne ścieżki XP dla każdego punktu danych:
Teraz, gdy mamy już zawartość HTML i poradziliśmy sobie z potencjalnym blokowaniem adresów IP, możemy wyodrębnić wymagane dane z każdej listy restauracji.
restaurants_data = []
# Iteracja po każdym elemencie restauracji
for element in elements:
# Wyodrębnij nazwę restauracji
name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]
# Wyodrębnij adres URL restauracji
url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]
# Wyodrębnij kuchnie
cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')
# Wyodrębnij ocenę
rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]
# Utwórz słownik do przechowywania danych
restaurant_info = {
"name": name,
"url": url,
"cuisines": cuisines,
"rating": rating
}
# Dodaj informacje o restauracji do listy
restaurants_data.append(restaurant_info)
Po wyodrębnieniu danych musimy zapisać je w ustrukturyzowanym formacie. JSON jest szeroko stosowanym formatem do tego celu.
import json
# Zapisywanie danych w pliku JSON
with open('yelp_restaurants.json', 'w') as f:
json.dump(restaurants_data, f, indent=4)
print("Data extraction complete. Saved to yelp_restaurants.json")
import requests
from lxml import html
import json
# Adres URL strony wyszukiwania Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"
# Skonfiguruj nagłówki, aby naśladować żądanie przeglądarki
headers = {
'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',
'Accept-Language': 'en-US,en;q=0.5'
}
# W razie potrzeby skonfiguruj proxy
proxies = {
'http': 'http://username:password@proxy-server:port',
'https': 'https://username:password@proxy-server:port'
}
# Wyślij żądanie GET, aby pobrać zawartość HTML
response = requests.get(url, headers=headers, proxies=proxies)
# Sprawdź, czy żądanie się powiodło
if response.status_code == 200:
print("Successfully fetched the page content")
else:
print("Failed to retrieve the page content")
# Parsowanie zawartości HTML przy użyciu lxml
parser = html.fromstring(response.content)
# Wyodrębnianie poszczególnych elementów restauracji
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]
# Inicjalizacja listy do przechowywania wyodrębnionych danych
restaurants_data = []
# Iteracja po każdym elemencie restauracji
for element in elements:
# Wyodrębnij nazwę restauracji
name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]
# Wyodrębnij adres URL restauracji
url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]
# Wyodrębnij kuchnie
cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')
# Wyodrębnij ocenę
rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]
# Utwórz słownik do przechowywania danych
restaurant_info = {
"name": name,
"url": url,
"cuisines": cuisines,
"rating": rating
}
# Dodaj informacje o restauracji do listy
restaurants_data.append(restaurant_info)
# Zapisywanie danych w pliku JSON
with open('yelp_restaurants.json', 'w') as f:
json.dump(restaurants_data, f, indent=4)
print("Data extraction complete. Saved to yelp_restaurants.json")
Kluczowe dla użytkowników jest prawidłowe skonfigurowanie nagłówków HTTP i korzystanie z serwerów proxy w celu obejścia ograniczeń i uniknięcia blokowania. Aby zoptymalizować i zwiększyć bezpieczeństwo skrobania, warto rozważyć zautomatyzowanie rotacji adresów IP. Zastosowanie dynamicznych serwerów proxy dla użytkowników indywidualnych lub mobilnych może znacznie usprawnić ten proces, zmniejszając prawdopodobieństwo wykrycia i zablokowania.
Komentarze: 0