Python web-scraping на многослойном веб-сайте без [href] - PullRequest
0 голосов
/ 30 октября 2018

Я ищу способ очистки данных на сайтах студенческого жилья: https://www.uniplaces.com/en/accommodation/berlin.

В конце я хотел бы собрать конкретную информацию для каждого свойства, такую ​​как размер спальни, количество соседей по комнате, местоположение. Для этого мне сначала придется очистить все ссылки на свойства, а затем очистить отдельные ссылки.

Однако, даже пройдя через консоль и использовав BeautifulSoup для извлечения URL-адресов, я не смог извлечь URL-адреса, ведущие к отдельным спискам. Похоже, они не включены как [href], и я не смог идентифицировать ссылки в любом другом формате в HTML-коде.

Это код Python, который я использовал, но он также ничего не возвращал: из bs4 импортировать BeautifulSoup импорт urllib.request

resp = urllib.request.urlopen("https://www.uniplaces.com/accommodation/lisbon")
soup = BeautifulSoup(resp, from_encoding=resp.info().get_param('charset'))

for link in soup.find_all('a', href=True):
    print(link['href'])

Итак, мой вопрос: если ссылки не включены в формат http: // или на них нет ссылки [href]: есть ли способ извлечь URL списков?

Я бы очень признателен за любую поддержку в этом!

Всего наилучшего, Ханна

1 Ответ

0 голосов
/ 31 октября 2018

Если вы посмотрите на вкладку сети, вы обнаружите какой-то вызов API специально для этого URL: https://www.uniplaces.com/api/search/offers?city=PT-lisbon&limit=24&locale=en_GB&ne=38.79507211908374%2C-9.046124472314432&page=1&sw=38.68769060641113%2C-9.327992453271463

, который указывает местоположение PT-Лиссабон и в северо-восточном (ne) и юго-западном (sw) направлениях. Из этого файла вы можете получить идентификатор для каждого предложения и добавить его к текущему URL, вы также можете получить всю информацию, которую вы получаете с веб-страницы (цена, описание и т. Д.) *

Например:

import requests

resp = requests.get(
    url = 'https://www.uniplaces.com/api/search/offers', 
    params = {
        "city":'PT-lisbon',
        "limit":'24',
        "locale":'en_GB',
        "ne":'38.79507211908374%2C-9.046124472314432',
        "page":'1',
        "sw":'38.68769060641113%2C-9.327992453271463'
    })
body = resp.json()

base_url = 'https://www.uniplaces.com/accommodation/lisbon'

data = [
    (
        t['id'],                  #offer id
        base_url + '/' + t['id'], #this is the offer page
        t['attributes']['accommodation_offer']['title'], 
        t['attributes']['accommodation_offer']['price']['amount'],
        t['attributes']['accommodation_offer']['available_from']
    )
    for t in body['data']
]

print(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...