Скачивание html кода с помощью beautifulSoup - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь изучить основы c веб-скраппинга. Я загружаю код html с beautifulSoup и печатаю результаты в cmd. У меня проблема в том, что когда я открываю сайт в chrome, я вижу нужные мне данные HTML код в chrome

Но когда я загружаю код, часть тела выглядит так Загружено HTML код

Я думаю, что это может быть какое-то измерение безопасности, но я не уверен.

Я отменяю этот сайт

Благодарю за вашу помощь.

Ответы [ 3 ]

1 голос
/ 17 июня 2020

BeautifulSoup не может видеть элементы, которые вы пытаетесь очистить, потому что они создаются и заполняются асинхронно с использованием JavaScript. Это происходит после того, как ваш браузер сделал запрос и получил базовый HTML для страницы, который является своего рода шаблоном, который будет заполнен позже, как я уже сказал, с помощью JavaScript. BeautifulSoup видит только баребоны HTML.

Итак, вы не можете использовать BeautifulSoup. Вы можете использовать Selenium, как говорили другие, но в этом нет необходимости. Если вы регистрируете свой сетевой трафик c с помощью инструментов разработчика Google Chrome (другие браузеры имеют аналогичную функцию), вы можете увидеть, что ваш браузер делает запрос к RESTful API, который обслуживает JSON, содержащий всю информацию. вы можете когда-либо захотеть о каждой собственности. Все, что вам нужно сделать, это имитировать этот HTTP-запрос GET:

def main():

    import requests

    url = "https://www.sreality.cz/api/cs/v2/estates"

    params = {
        "building_condition": "3%7C8%7C4",
        "category_main_cb": "1",
        "category_sub_cb": "2%7C3%7C4%7C5%7C6%7C7%7C8%7C9%7C10%7C11%7C12%7C16",
        "category_type_cb": "1",
        "locality_region_id": "10",
        "per_page": "20",
        "tms": "1592389441017"
    }

    response = requests.get(url, params=params)
    response.raise_for_status()

    estates = response.json()["_embedded"]["estates"]

    for estate in estates:
        print(f"GPS: {estate['gps']}")
        print(f"Name: {estate['name']}")
        print(f"Locality: {estate['locality']}")
        print(f"Price: {estate['price']}\n")

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

Вывод:

GPS: {'lat': 50.088512, 'lon': 14.399361}
Name: Prodej bytu 5+1 145 m²
Locality: Nerudova, Praha - Praha 1
Price: 1

GPS: {'lat': 50.028564, 'lon': 14.366739}
Name: Prodej bytu 2+kk 54 m²
Locality: Wassermannova, Praha - Hlubočepy
Price: 6651072

GPS: {'lat': 50.008667, 'lon': 14.466505}
Name: Prodej bytu 2+kk 45 m²
Locality: Na domovině, Praha 4 - Libuš
Price: 3899000

GPS: {'lat': 50.104355, 'lon': 14.585402}
Name: Prodej bytu 2+1 60 m²
Locality: Bryksova, Praha - Černý Most
Price: 5019000

GPS: {'lat': 50.028564, 'lon': 14.366739}
Name: Prodej bytu 4+kk 105 m²
Locality: Wassermannova, Praha - Hlubočepy
Price: 11467890

GPS: {'lat': 50.084553, 'lon': 14.417782}
Name: Prodej bytu 4+kk 229 m²
Locality: Praha 1 - Staré Město
Price: 29900000

GPS: {'lat': 50.042973, 'lon': 14.494473}
Name: Prodej bytu 1+kk 33 m²
Locality: Klapálkova, Praha 4 - Chodov
Price: 3350000

GPS: {'lat': 50.044209, 'lon': 14.496346}
Name: Prodej bytu 3+kk 205 m²
Locality: Milínská, Praha 10 - Záběhlice
Price: 8950000

GPS: {'lat': 50.042973, 'lon': 14.494473}
Name: Prodej bytu 1+kk 33 m²
Locality: Klapálkova, Praha 4 - Chodov
Price: 3350000

GPS: {'lat': 50.042973, 'lon': 14.494473}
Name: Prodej bytu 1+kk 33 m²
Locality: Klapálkova, Praha 4 - Chodov
Price: 3420000

GPS: {'lat': 50.070419, 'lon': 14.383278}
Name: Prodej bytu 3+kk 83 m²
Locality: Pod Radnicí, Praha 5 - Košíře
Price: 7800000

GPS: {'lat': 50.00695, 'lon': 14.416012}
Name: Prodej bytu atypické 191 m² (Podkrovní)
Locality: Československého exilu, Praha 4 - Modřany
Price: 1

GPS: {'lat': 50.028564, 'lon': 14.366739}
Name: Prodej bytu 5+kk 129 m²
Locality: Wassermannova, Praha - Hlubočepy
Price: 15706444

GPS: {'lat': 50.088615, 'lon': 14.469955}
Name: Prodej bytu 3+kk 96 m²
Locality: Jeseniova, Praha 3 - Žižkov
Price: 11500000

GPS: {'lat': 50.028564, 'lon': 14.366739}
Name: Prodej bytu 3+kk 67 m²
Locality: Wassermannova, Praha - Hlubočepy
Price: 7753995

GPS: {'lat': 50.11171, 'lon': 14.47769}
Name: Prodej bytu 2+kk 39 m²
Locality: Pod Labuťkou, Praha 8 - Libeň
Price: 3590000

GPS: {'lat': 50.126289, 'lon': 14.505613}
Name: Prodej bytu 2+kk 57 m²
Locality: Kytlická, Praha 9 - Prosek
Price: 1

GPS: {'lat': 50.057446, 'lon': 14.427087}
Name: Prodej bytu 2+kk 51 m²
Locality: Na Dolinách, Praha 4 - Podolí
Price: 3900000

GPS: {'lat': 50.016838, 'lon': 14.584877}
Name: Prodej bytu 3+kk 96 m²
Locality: K dálnici, Praha 10 - Pitkovice
Price: 8499000

GPS: {'lat': 50.028564, 'lon': 14.366739}
Name: Prodej bytu 5+kk 129 m²
Locality: Wassermannova, Praha - Hlubočepy
Price: 14942321

GPS: {'lat': 50.028564, 'lon': 14.366739}
Name: Prodej bytu 5+kk 131 m²
Locality: Wassermannova, Praha - Hlubočepy
Price: 14779177

Вы можете изменить строку запроса per_page в словаре params, чтобы запросить больше чем 20 объектов одновременно. Эти параметры строки запроса я также получил, просто просмотрев URL-адрес запроса в сетевом трафике c logger.

0 голосов
/ 17 июня 2020

Здравствуйте, вы можете найти этот тег div, используя имя класса в Beautiful Soup

def match_class(target):
target = target.split()
def do_match(tag):
    try:
        classes = dict(tag.attrs)["class"]
    except KeyError:
        classes = ""
    classes = classes.split()
    return all(c in classes for c in target)
return do_match

html = """<div class="feeditemcontent cxfeeditemcontent">
<div class="feeditembodyandfooter">
<div class="feeditembody">
<span>The actual data is some where here</span>
</div>
</div>
</div>"""

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(html)

matches = soup.findAll(match_class("feeditemcontent cxfeeditemcontent"))
for m in matches:
    print m
    print "-"*10

matches = soup.findAll(match_class("feeditembody"))
for m in matches:
    print m
    print "-"*10
0 голосов
/ 17 июня 2020

Причина, по которой вы видите то, что видите в загруженном коде HTML, заключается в том, что сайт на самом деле является прогрессивным веб-приложением (PWA) . Это означает, что HTML отображается из Javascript в вашем браузере, поэтому его нельзя получить с помощью beautifulsoup.

Однако есть хорошие новости. Вам просто нужно использовать другой инструмент, например Selenium автоматизация браузера. После того, как вы загрузили визуализированный HTML с помощью селена, вы можете продолжить работу с ним, используя bs4 или любой другой инструмент.

Что делает селен, требуется обычный браузер (называемый веб-драйвером), например Chrome, Firefox или Safari, и автоматизирует его. Открывает страницу, которую вы хотите очистить, и отображает содержимое, как это делает обычный браузер.

После отображения содержимого вы можете получить исходный код HTML или даже выполнять более сложные действия, например нажимать кнопки, регистрировать in et c.

...