Я пытаюсь очистить некоторые данные со страницы результатов поиска 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()
@gre_gor, это работает с использованием селена. вы можете увидеть решение ниже.
@AjeetVerma OP вызывает API через селен, а не через страницу напрямую.






Вот как вы можете получить данные обо всех 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 и многое другое, включая историю собственности.
Хотя этот код может решить вопрос, включение объяснения того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются.
Если «api.scraperapi.com» не может получить динамически загружаемый контент, вызов этого API через селен также не будет работать.