bs4 обнаруживает, что не собирает все данные с других страниц веб-сайта

#python #web-scraping #beautifulsoup

Вопрос:

Я пытаюсь наскрести сайт по недвижимости с помощью BeautifulSoup. Я пытаюсь получить список цен на аренду в Лондоне. Это работает, но только для первой страницы на веб-сайте. Их более 150, так что я упускаю много данных. Я хотел бы иметь возможность собирать все цены со всех страниц. Вот код, который я использую:

 import requests
from bs4 import BeautifulSoup as soup

url  = 'https://www.zoopla.co.uk/to-rent/property/central-london/?beds_max=5amp;price_frequency=per_monthamp;q=Central Londonamp;results_sort=newest_listingsamp;search_source=home'
response = requests.get(url)
response.status_code

data  = soup(response.content, 'lxml')

prices = []
for line in data.findAll('div', {'class': 'css-1e28vvi-PriceContainer e2uk8e7'}):
    price = str(line).split('>')[2].split(' ')[0].replace('£', '').replace(',','')
    price = int(price)
    prices.append(price)

 

Есть идеи, почему я не могу собрать цены со всех страниц, используя этот скрипт?

Дополнительный вопрос : есть ли способ получить доступ к цене с помощью супа, т. е. с помощью любых манипуляций со списком/строкой? Когда я звоню data.find('div', {'class': 'css-1e28vvi-PriceContainer e2uk8e7'}) , я получаю строку следующего вида <div class="css-1e28vvi-PriceContainer e2uk8e7" data-testid="listing-price"><p class="css-1o565rw-Text eczcs4p0" size="6">£3,012 pcm</p></div>

Любая помощь будет очень признательна!

Ответ №1:

Вы можете добавить amp;pn=<page number> параметр к URL-адресу, чтобы получить следующие страницы:

 import re
import requests
from bs4 import BeautifulSoup as soup

url = "https://www.zoopla.co.uk/to-rent/property/central-london/?beds_max=5amp;price_frequency=per_monthamp;q=Central Londonamp;results_sort=newest_listingsamp;search_source=homeamp;pn="

prices = []
for page in range(1, 3):  # <-- increase number of pages here
    data = soup(requests.get(url   str(page)).content, "lxml")

    for line in data.findAll(
        "div", {"class": "css-1e28vvi-PriceContainer e2uk8e7"}
    ):
        price = line.get_text(strip=True)
        price = int(re.sub(r"[^d]", "", price))
        prices.append(price)
        print(price)
    print("-" * 80)

print(len(prices))
 

С принтами:

 
...

1993
1993
--------------------------------------------------------------------------------
50
 

Комментарии:

1. большое вам спасибо!