BeautifulSoup не извлекает весь контент со страницы результатов поиска Trulia.com

Я пытаюсь очистить некоторые данные со страницы результатов поиска trulia.com. Каждая страница Trulia содержит ровно 40 списков, и мне нужно очистить {price, #beds #bath #address} для каждого списка с помощью BeautifulSoup.

Проблема в том, что приведенный ниже скрипт возвращает не полный список элементов, содержащихся на странице, а только 7 первых записей из 40. Следовательно, контейнеры списка «Кровать», «Ванна» «Адрес» также содержат только 7 первых записей, а 40 ожидается. Интересно, что я успешно использовал этот код около 2 месяцев назад, и он работал, как и предполагалось, соскребая все 40 записей с каждой страницы. В чем проблема и как я могу ее преодолеть?

import requests
from urllib.parse import urlencode
from bs4 import BeautifulSoup
import pandas as pd 
import urllib.parse
import json
import numpy as np
import matplotlib.pyplot as plt

url = "https://www.trulia.com/for_sale/Hartford,CT/1p_beds/1p_baths/1p_sqft/SINGLE-FAMILY_HOME_type/"

API_KEY = 'MY_SCRAPERAPI_KEY'
params = {'api_key': API_KEY, 'url': url}

response = requests.get('http://api.scraperapi.com/', params=urlencode(params))
soup = BeautifulSoup(response.content, "html.parser")

results = soup.find(id = "resultsColumn")
elements = results.find_all("div", class_ = "Text__TextBase-sc-27a633b1-0-div Text__TextContainerBase-sc-27a633b1-1 ewcDjf keSfom")

prices=[]
for el in elements:
    p=el.text
    prices.append(p)
    print(el.text)
    
Bed=soup.select('[data-testid = "property-beds"] ')
Bath=soup.select('[data-testid = "property-baths"] ')
Addr=soup.select('[data-testid = "property-address"] ')  

Я узнал, что отложенная загрузка может быть причиной того, что приведенный выше скрипт перестал работать, поэтому я попытался изменить свой код с помощью Selenium, но безуспешно, он по-прежнему возвращает только 7 первых записей.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import requests
from urllib.parse import urlencode


url = "https://www.trulia.com/for_sale/Hartford,CT/1p_beds/1p_baths/1p_sqft/SINGLE-FAMILY_HOME_type/"
API_KEY = 'MY_API_KEY'

def get_scraperapi_url(url):
    """
        Converts url into API request for ScraperAPI.
    """
    payload = {'api_key': API_KEY, 'url': url}
    proxy_url = 'http://api.scraperapi.com/?' + urlencode(payload)
    return proxy_url


chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(options=chrome_options)
driver.get(get_scraperapi_url(url))
time.sleep(5)  # wait for the page to load

# Scroll down to load all the listings
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

# Get the HTML content and parse with BeautifulSoup
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

# Extract the listings details
results = soup.find(id = "resultsColumn")
elements = results.find_all("div", class_ = "Text__TextBase-sc-27a633b1-0-div Text__TextContainerBase-sc-27a633b1-1 ewcDjf keSfom")

prices=[]
for el in elements:
    p=el.text
    prices.append(p)
    print(el.text)
    
Bed=soup.select('[data-testid = "property-beds"] ')
Bath=soup.select('[data-testid = "property-baths"] ')
Addr=soup.select('[data-testid = "property-address"] ')  

# Close the browser
driver.quit()

Если «api.scraperapi.com» не может получить динамически загружаемый контент, вызов этого API через селен также не будет работать.

gre_gor 25.04.2023 08:45

@gre_gor, это работает с использованием селена. вы можете увидеть решение ниже.

Ajeet Verma 25.04.2023 08:49

@AjeetVerma OP вызывает API через селен, а не через страницу напрямую.

gre_gor 25.04.2023 08:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как вы можете получить данные обо всех 40 списках (домах).

import json
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC

options = ChromeOptions()
options.add_argument("--start-maximized")

driver = Chrome(options=options)

response = driver.get("https://www.trulia.com/for_sale/Hartford,CT/1p_beds/1p_baths/1p_sqft/SINGLE-FAMILY_HOME_type/")
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'ul[data-testid = "search-result-list-container"]')))

soup = BeautifulSoup(driver.page_source, "html.parser")
data = soup.find('script', {"id": "__NEXT_DATA__"}).text
json_data = json.loads(data)
homes = json_data['props']['searchData']['homes']

homes_data = []
for home in homes:
    homes_data.append({
        'address': home['location']['fullLocation'],
        'coordinates': home['location']['coordinates'],
        'price': home['price']['formattedPrice'],
        'link': 'https://www.trulia.com'+home['url'],
        'bedrooms': home['bedrooms']['formattedValue'],
        'bathrooms': home['bathrooms']['formattedValue'],
    })

print(homes_data)
print(len(homes_data))

выход:

[{'address': '17 Whiting Rd, East Hartford, CT 06118', 'coordinates': {'latitude': 41.75663, 'longitude': -72.63926, '__typename': 'HOME_Coordinates'}, 'price': '$244,900', 'link': 'https://www.trulia.com/p/ct/east-hartford/17-whiting-rd-east-hartford-ct-06118--2004864749', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '35 Shadow Ln, West Hartford, CT 06110', 'coordinates': {'latitude': 41.73251, 'longitude': -72.751526, '__typename': 'HOME_Coordinates'}, 'price': '$499,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/35-shadow-ln-west-hartford-ct-06110--1063205863', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '194 Branford St, Hartford, CT 06112', 'coordinates': {'latitude': 41.79863, 'longitude': -72.69995, '__typename': 'HOME_Coordinates'}, 'price': '$120,000', 'link': 'https://www.trulia.com/p/ct/hartford/194-branford-st-hartford-ct-06112--2004848778', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '836 Prospect Ave, Hartford, CT 06105', 'coordinates': {'latitude': 41.773373, 'longitude': -72.714935, '__typename': 'HOME_Coordinates'}, 'price': '$739,000', 'link': 'https://www.trulia.com/p/ct/hartford/836-prospect-ave-hartford-ct-06105--2004797196', 'bedrooms': '6bd', 'bathrooms': '4ba'}, {'address': '6 Haynes Rd, West Hartford, CT 06117', 'coordinates': {'latitude': 41.78482, 'longitude': -72.7334, '__typename': 'HOME_Coordinates'}, 'price': '$379,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/6-haynes-rd-west-hartford-ct-06117--2004861292', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '575 Mountain Rd, West Hartford, CT 06117', 'coordinates': {'latitude': 41.783073, 'longitude': -72.76635, '__typename': 'HOME_Coordinates'}, 'price': '$545,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/575-mountain-rd-west-hartford-ct-06117--2004860826', 'bedrooms': '3bd', 'bathrooms': '4ba'}, {'address': '105 Hartford Ave, Newington, CT 06111', 'coordinates': {'latitude': 41.714645, 'longitude': -72.7221, '__typename': 'HOME_Coordinates'}, 'price': '$286,000', 'link': 'https://www.trulia.com/p/ct/newington/105-hartford-ave-newington-ct-06111--2004835115', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '160 Harding Ave, Newington, CT 06111', 'coordinates': {'latitude': 41.709923, 'longitude': -72.73317, '__typename': 'HOME_Coordinates'}, 'price': '$294,900', 'link': 'https://www.trulia.com/p/ct/newington/160-harding-ave-newington-ct-06111--2004837571', 'bedrooms': '2bd', 'bathrooms': '2ba'}, {'address': '19 Cornell Rd, West Hartford, CT 06107', 'coordinates': {'latitude': 41.748463, 'longitude': -72.75974, '__typename': 'HOME_Coordinates'}, 'price': '$579,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/19-cornell-rd-west-hartford-ct-06107--2004807092', 'bedrooms': '3bd', 'bathrooms': '3ba'}, {'address': '6 Old Oak Rd, West Hartford, CT 06117', 'coordinates': {'latitude': 41.787216, 'longitude': -72.767296, '__typename': 'HOME_Coordinates'}, 'price': '$399,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/6-old-oak-rd-west-hartford-ct-06117--2004861305', 'bedrooms': '3bd', 'bathrooms': '3ba'}, {'address': '345 Auburn Rd, West Hartford, CT 06119', 'coordinates': {'latitude': 41.776436, 'longitude': -72.73012, '__typename': 'HOME_Coordinates'}, 'price': '$520,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/345-auburn-rd-west-hartford-ct-06119--2004874172', 'bedrooms': '4bd', 'bathrooms': '3ba'}, {'address': '41 Steep Hollow Ln, West Hartford, CT 06107', 'coordinates': {'latitude': 41.731915, 'longitude': -72.76247, '__typename': 'HOME_Coordinates'}, 'price': '$649,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/41-steep-hollow-ln-west-hartford-ct-06107--2004809291', 'bedrooms': '4bd', 'bathrooms': '3ba'}, {'address': '12 Woodmont Rd, West Hartford, CT 06117', 'coordinates': {'latitude': 41.803677, 'longitude': -72.75183, '__typename': 'HOME_Coordinates'}, 'price': '$449,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/12-woodmont-rd-west-hartford-ct-06117--2004857480', 'bedrooms': '3bd', 'bathrooms': '4ba'}, {'address': '86 Hills St, East Hartford, CT 06118', 'coordinates': {'latitude': 41.74081, 'longitude': -72.60012, '__typename': 'HOME_Coordinates'}, 'price': '$189,000', 'link': 'https://www.trulia.com/p/ct/east-hartford/86-hills-st-east-hartford-ct-06118--2004870911', 'bedrooms': '2bd', 'bathrooms': '1ba'}, {'address': '92 Lafayette Ave, East Hartford, CT 06118', 'coordinates': {'latitude': 41.73601, 'longitude': -72.619934, '__typename': 'HOME_Coordinates'}, 'price': '$140,000', 'link': 'https://www.trulia.com/p/ct/east-hartford/92-lafayette-ave-east-hartford-ct-06118--2004871209', 'bedrooms': '2bd', 'bathrooms': '1ba'}, {'address': '26 Briarwood Rd, West Hartford, CT 06107', 'coordinates': {'latitude': 41.746475, 'longitude': -72.76434, '__typename': 'HOME_Coordinates'}, 'price': '$329,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/26-briarwood-rd-west-hartford-ct-06107--2004807915', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '29 Ranger Ln, West Hartford, CT 06117', 'coordinates': {'latitude': 41.777344, 'longitude': -72.75849, '__typename': 'HOME_Coordinates'}, 'price': '$462,500', 'link': 'https://www.trulia.com/p/ct/west-hartford/29-ranger-ln-west-hartford-ct-06117--2004859361', 'bedrooms': '3bd', 'bathrooms': '3ba'}, {'address': '161 Marlborough St, Newington, CT 06111', 'coordinates': {'latitude': 41.669212, 'longitude': -72.746124, '__typename': 'HOME_Coordinates'}, 'price': '$299,900', 'link': 'https://www.trulia.com/p/ct/newington/161-marlborough-st-newington-ct-06111--2004837607', 'bedrooms': '3bd', 'bathrooms': '1ba'}, {'address': '156 Roseleah Ave, Newington, CT 06111', 'coordinates': {'latitude': 41.71366, 'longitude': -72.71912, '__typename': 'HOME_Coordinates'}, 'price': '$295,000', 'link': 'https://www.trulia.com/p/ct/newington/156-roseleah-ave-newington-ct-06111--2004837290', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '37 Butternut Dr, East Hartford, CT 06118', 'coordinates': {'latitude': 41.75523, 'longitude': -72.596115, '__typename': 'HOME_Coordinates'}, 'price': '$270,000', 'link': 'https://www.trulia.com/p/ct/east-hartford/37-butternut-dr-east-hartford-ct-06118--2004867385', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '1192 Trout Brook Dr, West Hartford, CT 06119', 'coordinates': {'latitude': 41.770657, 'longitude': -72.73642, '__typename': 'HOME_Coordinates'}, 'price': '$239,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/1192-trout-brook-dr-west-hartford-ct-06119--2004872070', 'bedrooms': '3bd', 'bathrooms': '1ba'}, {'address': '40 Cleveland Ave, Hartford, CT 06120', 'coordinates': {'latitude': 41.79462, 'longitude': -72.66701, '__typename': 'HOME_Coordinates'}, 'price': '$239,900', 'link': 'https://www.trulia.com/p/ct/hartford/40-cleveland-ave-hartford-ct-06120--2004877763', 'bedrooms': '4bd', 'bathrooms': '2ba'}, {'address': '44 Brightview Dr, West Hartford, CT 06117', 'coordinates': {'latitude': 41.78946, 'longitude': -72.751335, '__typename': 'HOME_Coordinates'}, 'price': '$303,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/44-brightview-dr-west-hartford-ct-06117--2004860214', 'bedrooms': '3bd', 'bathrooms': '3ba'}, {'address': '30 Kowal Ct, Newington, CT 06111', 'coordinates': {'latitude': 41.65506, 'longitude': -72.71265, '__typename': 'HOME_Coordinates'}, 'price': '$259,900', 'link': 'https://www.trulia.com/p/ct/newington/30-kowal-ct-newington-ct-06111--2004841493', 'bedrooms': '2bd', 'bathrooms': '2ba'}, {'address': '27 Kenyon Pl, East Hartford, CT 06108', 'coordinates': {'latitude': 41.77476, 'longitude': -72.6288, '__typename': 'HOME_Coordinates'}, 'price': '$169,900', 'link': 'https://www.trulia.com/p/ct/east-hartford/27-kenyon-pl-east-hartford-ct-06108--2004815091', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '44 Sedgwick Rd, East Hartford, CT 06108', 'coordinates': {'latitude': 41.79585, 'longitude': -72.62273, '__typename': 'HOME_Coordinates'}, 'price': '$289,900', 'link': 'https://www.trulia.com/p/ct/east-hartford/44-sedgwick-rd-east-hartford-ct-06108--2004816722', 'bedrooms': '4bd', 'bathrooms': '2ba'}, {'address': '42 Woodridge Cir, West Hartford, CT 06107', 'coordinates': {'latitude': 41.730164, 'longitude': -72.75981, '__typename': 'HOME_Coordinates'}, 'price': '$699,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/42-woodridge-cir-west-hartford-ct-06107--2004809358', 'bedrooms': '4bd', 'bathrooms': '3ba'}, {'address': '50 Hemlock St, Newington, CT 06111', 'coordinates': {'latitude': 41.689648, 'longitude': -72.74199, '__typename': 'HOME_Coordinates'}, 'price': '$279,777', 'link': 'https://www.trulia.com/p/ct/newington/50-hemlock-st-newington-ct-06111--1063993173', 'bedrooms': '2bd', 'bathrooms': '2ba'}, {'address': '8 Coolidge Rd, West Hartford, CT 06117', 'coordinates': {'latitude': 41.785965, 'longitude': -72.75728, '__typename': 'HOME_Coordinates'}, 'price': '$399,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/8-coolidge-rd-west-hartford-ct-06117--2004861846', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '178 W  Ridge Dr, West Hartford, CT 06117', 'coordinates': {'latitude': 41.78777, 'longitude': -72.758835, '__typename': 'HOME_Coordinates'}, 'price': '$559,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/178-w-ridge-dr-west-hartford-ct-06117--2088454765', 'bedrooms': '4bd', 'bathrooms': '4ba'}, {'address': '128 Highland St, Wethersfield, CT 06109', 'coordinates': {'latitude': 41.683517, 'longitude': -72.67795, '__typename': 'HOME_Coordinates'}, 'price': '$850,000', 'link': 'https://www.trulia.com/p/ct/wethersfield/128-highland-st-wethersfield-ct-06109--2004820633', 'bedrooms': '4bd', 'bathrooms': '5ba'}, {'address': '985 Maple St, Wethersfield, CT 06109', 'coordinates': {'latitude': 41.67048, 'longitude': -72.66961, '__typename': 'HOME_Coordinates'}, 'price': '$389,000', 'link': 'https://www.trulia.com/p/ct/wethersfield/985-maple-st-wethersfield-ct-06109--2004829960', 'bedrooms': '3bd', 'bathrooms': '3ba'}, {'address': '178 Hunter Dr, West Hartford, CT 06107', 'coordinates': {'latitude': 41.76749, 'longitude': -72.77633, '__typename': 'HOME_Coordinates'}, 'price': '$769,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/178-hunter-dr-west-hartford-ct-06107--2004806703', 'bedrooms': '5bd', 'bathrooms': '6ba'}, {'address': '67 Ringgold St, West Hartford, CT 06119', 'coordinates': {'latitude': 41.754868, 'longitude': -72.7191, '__typename': 'HOME_Coordinates'}, 'price': '$299,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/67-ringgold-st-west-hartford-ct-06119--1064649502', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '43 Hollywood Ave, West Hartford, CT 06110', 'coordinates': {'latitude': 41.72978, 'longitude': -72.71523, '__typename': 'HOME_Coordinates'}, 'price': '$210,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/43-hollywood-ave-west-hartford-ct-06110--2004833091', 'bedrooms': '2bd', 'bathrooms': '1ba'}, {'address': '341 Main St, Wethersfield, CT 06109', 'coordinates': {'latitude': 41.716423, 'longitude': -72.6528, '__typename': 'HOME_Coordinates'}, 'price': '$399,900', 'link': 'https://www.trulia.com/p/ct/wethersfield/341-main-st-wethersfield-ct-06109--1063150956', 'bedrooms': '4bd', 'bathrooms': '2ba'}, {'address': '44 Seymour Ave, West Hartford, CT 06119', 'coordinates': {'latitude': 41.753174, 'longitude': -72.72396, '__typename': 'HOME_Coordinates'}, 'price': '$319,900', 'link': 'https://www.trulia.com/p/ct/west-hartford/44-seymour-ave-west-hartford-ct-06119--2004874602', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '1655 Asylum Ave, West Hartford, CT 06117', 'coordinates': {'latitude': 41.778393, 'longitude': -72.72725, '__typename': 'HOME_Coordinates'}, 'price': '$450,000', 'link': 'https://www.trulia.com/p/ct/west-hartford/1655-asylum-ave-west-hartford-ct-06117--2004857933', 'bedrooms': '4bd', 'bathrooms': '2ba'}, {'address': '81 Central Ave, East Hartford, CT 06108', 'coordinates': {'latitude': 41.768265, 'longitude': -72.64077, '__typename': 'HOME_Coordinates'}, 'price': '$269,900', 'link': 'https://www.trulia.com/p/ct/east-hartford/81-central-ave-east-hartford-ct-06108--2004818823', 'bedrooms': '3bd', 'bathrooms': '2ba'}, {'address': '35 Monte Vista Ave, Newington, CT 06111', 'coordinates': {'latitude': 41.67905, 'longitude': -72.75242, '__typename': 'HOME_Coordinates'}, 'price': '$145,000', 'link': 'https://www.trulia.com/p/ct/newington/35-monte-vista-ave-newington-ct-06111--2004842262', 'bedrooms': '2bd', 'bathrooms': '1ba'}]
40

Вы даже можете получить более подробную информацию о каждой собственности (доме), например, floorSpace, lotSize и многое другое, включая историю собственности.

Другие вопросы по теме