#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. большое вам спасибо!