• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python - scraping adresu URL poprzez Xpath

Object Storage Arubacloud
0 głosów
481 wizyt
pytanie zadane 28 września 2019 w Python przez Michal321 Nowicjusz (120 p.)

Witam wszystkich. Z góry przepraszam, jeśli błędnie napisałem/umieściłem post.

Mój problem prezentuje się następująco: Programistycznie jestem absolutnie zielony. Potrzebuję na studia skonstruować bazę danych na podstawie której później będę robił różne analizy. Kod nie musi być piękny, najważniejsze bym osiągnął cel. Po długim przeszukiwaniu internetu udało mi się w końcu utworzyć kod, dzięki któremu scrapuję konkretną daną tekstową (wykorzystuję serwis otodom.pl). Na przykładzie konkretnej aukcji, chcę z niej wyciągnąć informację o tym, na którym piętrze znajduje się mieszkanie:

import requests
from lxml import html

url = "https://www.otodom.pl/59646415"


response = requests.get(url)
byte_data = response.content
source_code = html.fromstring(byte_data)

xpath_dana = '/html/body/div[1]/article/div[3]/div[1]/section[1]/div/ul/li[5]/strong'
tree_dana = source_code.xpath(xpath_dana)

if len(tree_dana) != 0:
    dana = tree_dana[0].text_content()
    print(dana)

Wynik: parter. A więc wszystko się zgadza.

Problem pojawił się, gdy chciałem wyciągnąć współrzędne korzystając z mapki Google. Współrzędne te odnalazłem po kliknięciu "zbadaj", w adresie URL prowadzącym do tej mapki:

Mając ten link będę już w stanie wyciągnąć z niego współrzędne.

Klikając "Copy Xpath" otrzymuję: /html/body/div[1]/article/div[3]/div[1]/section[4]/div/div/div/div/div[1]/div/div/div/div[2]/a

Mam jednak świadomość, że wklejając tą ścieżkę do kodu, w wyniku nie dostanę widocznego wyżej adresu. Przeszukując internet znalazłem informacje, że należy na końcu dodać /@href. Niestety, ta opcja, ani żadna podobna typu: 

/html/body/div[1]/article/div[3]/div[1]/section[4]/div/div/div/div/div[1]/div/div/div/div[2]//a/@href

również nie działają, wynik jest pusty.

Czy jest jakieś rozwiązanie tego problemu? Z góry dziękuję za każdą pomoc.

2 odpowiedzi

0 głosów
odpowiedź 28 września 2019 przez adrian17 Ekspert (344,860 p.)
Czy aby cała ta część strony z mapą nie doładowuje się dynamicznie, gdy zjedziesz niżej na stronie? Jak tak, to parsując samego HTMLa nie będziesz w stanie tego wyciągnąć (chyba, że być może w jakimś innym elemencie lub w zapytaniach sieciowych coś na temat znajdziesz).

Być może będzie trzeba otworzyć stronę w zautomatyzowanej przeglądarce (nie musi być pełna przeglądarka, wystarczy headless) i pozwolić stronie doładować mapę - wtedy da się wyciągnąć tamten element.
komentarz 28 września 2019 przez Michal321 Nowicjusz (120 p.)
Dziękuję za pomoc.

Czyli podany wyżej kod się do tego nie nada, będzie trzeba od początku zrobić to w inny sposób? Czy jest może jakaś przeglądarka online (na zasadzie proxy), która od razu załaduje mi pełną treść strony?

Na szybko wyszukałem, w jaki sposób skorzystać z headless chrome - niestety nie wygląda zbyt przyjaźnie. Zastanawiam się czy nie będzie prościej ograniczyć się do +/- 1000 rekordów, chwilę nad tym posiedzieć i po prostu ręcznie te współrzędne przekopiować.
0 głosów
odpowiedź 29 września 2019 przez RafalS VIP (122,820 p.)
print(byte_data)

i zobaczysz, że nie ma elementu mapy. Potrzebujesz całej przeglądarki, żeby otrzymać pełną wersje strony - elementy ładowane dynamicznie.

Najprościej użyć selenium.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


# otwierasz przegladarke
driver = webdriver.Chrome("./chromedriver")


# ustawiasz limit czekania na znalezienie elementu
driver.implicitly_wait(10)

driver.get("https://www.otodom.pl/59646415")

# scrolujemy do dolu, bo mapa wczytuje sie dopiero gdy przescroolujesz :P
html = driver.find_element_by_tag_name('html')
html.send_keys(Keys.END)

map_xpath = '//*[@id="root"]/article/div[3]/div[1]/section[4]/div/div/div/div/div[1]/div/div/div/div[2]/a'
print(driver.find_element_by_xpath(map_xpath).get_attribute("href"))

 

Podobne pytania

0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 2 sierpnia 2021 w Python przez Hellmick Początkujący (270 p.)
0 głosów
0 odpowiedzi 385 wizyt
0 głosów
4 odpowiedzi 651 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez W1ck Nowicjusz (150 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...