Przewodnik po tworzeniu stron internetowych za pomocą Pythona za pomocą pięknej zupy

Opublikowany: 2020-06-23
Spis treści pokaż
Wprowadzenie do skrobania sieci za pomocą Pythona:
Jak działa BeautifulSoup?
Jak zeskrobać dane ze stron internetowych za pomocą BeautifulSoup?
Proces skrobania sieci:
Wniosek:

Wprowadzenie do skrobania sieci za pomocą Pythona:

Jeśli chodzi o skrobanie stron internetowych, niektóre języki programowania są preferowane od innych. Jednym z najpopularniejszych z nich jest Python. Poza tym, że jest jednym z najłatwiejszych języków do nauki ze względu na łagodniejszą krzywą uczenia się, ma również tę zaletę, że jest językiem z ogromnym wsparciem dla programistów, co doprowadziło do powstania wielu pakietów innych firm. Te pakiety mogą być używane do wielu funkcji, co może być trudne do wykonania w podstawowym Pythonie. Niektóre typowe przykłady to: do przetwarzania obrazu lub wizji komputerowej używamy OpenCV, do uczenia maszynowego używamy TensorFlow, a do kreślenia wykresów używamy MatplotLib. Jeśli chodzi o web scraping, jedną z najczęściej używanych bibliotek jest BeautifulSoup. Ta biblioteka nie pobiera specjalnie danych z Internetu, ale jeśli możesz uzyskać plik HTML strony internetowej, może pomóc wyodrębnić z niej określone punkty danych. Ogólnie biblioteka służy do wyodrębniania punktów danych z dokumentów XML i HTML.

Jak działa BeautifulSoup?

Zanim zaczniesz pisać kod w Pythonie, musisz zrozumieć, jak działa BeautifulSoup. Po wyodrębnieniu zawartości HTML ze strony internetowej i zapisaniu jej w zmiennej, powiedzmy html_obj, możesz przekonwertować ją na obiekt BeautifulSoup za pomocą tylko jednego wiersza kodu-

zupa_obj = PięknaZupa(html_obj, 'html.parser')

Gdzie html_obj to dane HTML, soup_obj to obiekt bs, który został uzyskany, a „html.parser” to parser użyty do wykonania konwersji. Gdy już masz obiekt bs o nazwie soup_obj, przemierzanie go jest bardzo łatwe, a ponieważ przemierzanie go jest wystarczająco proste, wyodrębnianie danych również staje się proste. Weźmy przykład. Załóżmy, że musisz pobrać punkt danych zwany tytułem produktu, który jest obecny na każdej stronie witryny eCommerce. Teraz pobrałeś pojedynczą stronę produktu HTML z tej witryny i zdałeś sobie sprawę, że każda strona ma nazwę produktu wymienioną na elemencie typu span o identyfikatorze jako productTitle. Jak więc pobrać te dane z, powiedzmy, 1000 stron produktów? Cóż, otrzymasz dane HTML dla każdej strony i pobierzesz punkt danych w ten sposób-

dla spans w soup.findAll('span', attrs={'id': 'productTitle'}):
nazwa_produktu = spans.text.strip()

Chociaż jest to sposób na umieszczenie danych tekstowych między pewnym elementem znacznika, możesz również pobierać dane z atrybutów znacznika.

Skrobanie sieci

Jak zeskrobać dane ze stron internetowych za pomocą BeautifulSoup?

Teraz, gdy mamy już podstawową wiedzę na temat przechodzenia przez obiekt bs, napiszmy trochę kodu i zobaczmy, jak to działa. Korzystając z poniższego fragmentu kodu, możesz bardzo łatwo zeskrobać dane z Zillow, wiodącego rynku nieruchomości z siedzibą w USA. Możesz uruchomić ten kod i wprowadzić adres URL wpisu, aby uzyskać dane wyjściowe w formacie JSON. Rozumiemy kod, wiersz po wierszu. Po pierwsze, upewnij się, że masz na swoim komputerze zainstalowany Python 3.7 lub nowszy. Użyj pip, aby zainstalować BeautifulSoup. Wszystkie inne pakiety są dostarczane z Pythonem, więc nie musisz instalować żadnego z nich. Po zakończeniu zainstaluj edytor kodu, taki jak Atom lub VS Code, i gotowe. Zrozumienie kodu jest ważne, dlatego zaczniemy od pierwszej linii. Potrzebujesz czterech instrukcji importu, aby uzyskać określoną funkcjonalność. Następnie masz trzy linie zaczynające się od „ctx”. Są one przeznaczone specjalnie do ignorowania błędów certyfikatu SSL, które możesz napotkać podczas uzyskiwania dostępu do stron internetowych za pomocą kodu. Następnie pobieramy adres URL witryny jako dane wejściowe od użytkownika. Tutaj możesz również na stałe zakodować adres URL, a nawet mieć tablicę wielu adresów URL.

Proces skrobania sieci:

Następnie uzyskujemy dostęp do strony internetowej za pomocą funkcji Request urllib. Pamiętaj, aby dodać User-Agent w nagłówku, aby witryna uwierzyła, że ​​używasz przeglądarki. Powodem tego jest to, że strony internetowe mają być dostępne dla przeglądarek, a nie kodu, a zatem mogą blokować Twój adres IP, jeśli Cię złapią. Gdy to zrobimy, wykonaliśmy wszystkie podstawowe kroki, a następnie przekonwertujemy obiekt HTML na obiekt bs, a następnie upiększymy go do formatu utf-8, aby obsłużyć znaki specjalne i symbole na stronie. Po wykonaniu tej czynności wyodrębniamy tytuł, krótkie szczegóły i inne właściwości, analizując obiekt bs. Jak widać, w tagu skryptu z typem atrybutu = application/ld+json jest wiele punktów danych przechowywanych w formacie JSON. Widać również, że używamy sprawdzenia i==0 oraz i==1. Dzieje się tak, ponieważ na stronie znajdują się dwa tagi skryptu (z tym samym atrybutem). Pierwszy tag daje nam kilka punktów danych, a drugi resztę. Po wyodrębnieniu wszystkich punktów danych możesz je zapisać w pliku JSON i zapisać tak, jak mamy. Możesz także zapisać, przesłać go do witryny, a nawet skorzystać z interfejsu API z danymi, jeśli chcesz.

importuj json
importuj ssl
z urllib.request import Żądanie, urlopen
z bs4 importuj BeautifulSoup

# Ignoruj ​​błędy certyfikatu SSL
ctx = ssl.utwórz_domyślny_kontekst()
ctx.check_hostname = Fałsz
ctx.verify_mode = ssl.CERT_Brak

# Weź adres URL aukcji Zillow jako dane wejściowe
url = input('Wprowadź adres URL wykazu domów Zillow- ')

# Spraw, aby strona uwierzyła, że ​​używasz przeglądarki
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
strona internetowa = urlopen(req).read()

# Strona HTML -> Zupa obiektowa BeautifulSoup = BeautifulSoup(strona internetowa, 'html.parser')
html = zupa.prettify('utf-8')
property_details = {'details_long': {}, 'adres': {}}

# Wyodrębnij różne punkty danych z listy nieruchomości
dla tytułu w soup.findAll('title'):
property_details['Tytuł'] = title.text.strip()
przerwanie

dla meta w soup.findAll('meta', attrs={'name': 'description'}):
property_details['details_short'] = meta['content'].strip()

for div in soup.findAll('div', attrs={'class': 'character-count-truncated'}):
property_details['details_long']['Opis'] = div.text.strip()

for (i, skrypt) in enumerate(soup.findAll('script',
attrs={'type': 'aplikacja/ld+json'})):
jeśli ja == 0:
json_data = json.loads(skrypt.tekst)
property_details['details_long']['no_of_rooms'] = json_data['numberOfRooms']
property_details['details_long']['floor_size_in_sqrft'] = json_data['floorSize']['value']
property_details['address']['ulica'] = json_data['address']['ulica']
property_details['address']['locality'] = json_data['address']['addressLocality']
property_details['address']['region'] = json_data['address']['addressRegion']
property_details['address']['postal_code'] = json_data['address']['postalCode']
jeśli ja == 1:
json_data = json.loads(skrypt.tekst)
property_details['price_in_dollars'] = json_data['offers']['price']
property_details['inage'] = json_data['image']
przerwanie

z open('house_listing_data.json', 'w') jako outfile:
json.dump(property_details, outfile, indent=4)

z open('house_listing_data.html', 'wb') jako plik:
file.write(html)

print('———-Rozpakowywanie danych zakończone. Sprawdź plik json.———-')

Wyjściowy JSON powinien wyglądać mniej więcej tak:

{
„details_long”: {
„liczba_pokojów”: 3,
„rozmiar_podłogi_w_sqrft”: „1392”
},
"adres zamieszkania": {
„ulica”: „22516 Joanna Dr”,
„miejscowość”: „Kalifornia”,
„region”: „MD”,
„kod_pocztowy”: „20619”
},
„Tytuł”: „22516 Joan Dr, Kalifornia, MD 20619 | Numer MLS #MDSM167670”,
„details_short”: „22516 Joan Dr , Kalifornia, MD 20619-3175 to dom jednorodzinny wystawiony na sprzedaż za 150 000 USD. Dom o powierzchni 1392 stóp kwadratowych to 3 łóżka, 2,0 łazienek. Znajdź 40 zdjęć domu 22516 Joan Dr na Zillow. Zobacz więcej szczegółów dotyczących nieruchomości, historii sprzedaży i danych Zestimate w Zillow. Numer MLS MDSM167670”,
„cena_w_dolarach”: 150000,
„w wieku”: „https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg”
}

Wniosek:

Używanie BeautifulSoup do Twoich potrzeb związanych z web scrapingiem może być łatwe, o ile możesz najpierw ręcznie analizować strony HTML i decydować o tagach, na które należy kierować. Może działać na stronach, które nie mają żadnej zawartości dynamicznej i nie znajdują się za stroną logowania. W przypadku bardziej złożonych stron internetowych będziesz potrzebować bardziej złożonych narzędzi. Nasz zespół w PromptCloud pomaga firmom, które chcą wykorzystać dane i podejmować decyzje oparte na danych. Pomagamy nie tylko konfigurować w pełni zautomatyzowane silniki do przeszukiwania sieci, które działają w częstych odstępach czasu w chmurze, ale także pomagamy firmom analizować dane w celu wyodrębnienia trendów i innych przydatnych informacji.