Я делаю парсинг на портале недвижимости <www.immobiliare.it>
В частности, я получаю некоторую информацию со страницы поиска, которая содержит 25 свойств на странице. Мне удалось получить почти все, но у меня возникли проблемы с получением src изображения карты, которое есть у каждого свойства. Эта карта находится после селектора CSS.
Структура HTML следующая:
Я смог получить эти данные с помощью селена: https://stackoverflow.com/a/75020969/14461986
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
Options = Options()
Options.headless = True
driver = webdriver.Chrome(options=Options, service=Service(ChromeDriverManager().install()))
url = 'https://www.immobiliare.it/vendita-case/milano/forlanini/?criterio=dataModifica&ordine=desc&page=3'
driver.get(url)
soup = BeautifulSoup(driver.page_source)
data = []
# Each property is contained under each li in-realEstateResults__item
for property in soup.select('li.in-realEstateResults__item'):
data.append({
'id': property.get('id'),
'MapUrl': property.select_one('[alt = "mappa"]').get('src') if property.select_one('[alt = "mappa"]') else None
})
print(data)
Однако после 4-го изображения MapUrl становится пустым. Свойства загружены правильно, так как я проверил идентификаторы, а также HTML для остальных изображений тот же, но по какой-то причине я не понимаю, что MapUrl не извлекается. Я также приветствовал бы любые советы о том, как сделать этот сценарий более эффективным.
Вручную вы можете передать изображения и добраться до карты для каждого свойства. Кроме того, проверив html-код в браузере, вы также можете найти каждый из источников карты.






Однако проблема здесь заключается в ленивой загрузке, поэтому вам нужно взаимодействовать с веб-сайтом и прокручивать вниз, чтобы принудительно загрузить.
Возможно, вам придется принять/закрыть некоторые всплывающие окна (необязательно):
driver.find_element(By.CSS_SELECTOR,'#didomi-notice-agree-button').click()
driver.find_element(By.CSS_SELECTOR,'.nd-dialogFrame__close').click()
driver.find_element(By.CSS_SELECTOR,'section h1').click()
Теперь мы можем начать прокрутку (простое, но работающее решение, которое можно улучшить):
for i in range(30):
driver.find_element(By.CSS_SELECTOR,'body').send_keys(Keys.PAGE_DOWN)
time.sleep(0.3)
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
url = 'https://www.immobiliare.it/vendita-case/milano/forlanini/?criterio=dataModifica&ordine=desc'
driver.get(url)
driver.find_element(By.CSS_SELECTOR,'#didomi-notice-agree-button').click()
driver.find_element(By.CSS_SELECTOR,'.nd-dialogFrame__close').click()
driver.find_element(By.CSS_SELECTOR,'section h1').click()
for i in range(30):
driver.find_element(By.CSS_SELECTOR,'body').send_keys(Keys.PAGE_DOWN)
time.sleep(0.3)
soup = BeautifulSoup(driver.page_source)
data = []
for e in soup.select('li.in-realEstateResults__item'):
data.append({
'title':e.a.get('title'),
'imgUrls':[i.get('src') for i in e.select('.nd-list__item img')],
'imgMapInfo': e.select_one('[alt = "mappa"]').get('src') if e.select_one('[alt = "mappa"]') else None
})
data
Единственная модификация, которую я бы добавил: эти два после нескольких выполнений (открытие нескольких страниц с одним и тем же драйвером), похоже, терпят неудачу. Если я удалю их, скрипт работает отлично. driver.find_element(By.CSS_SELECTOR,'#didomi-notice-agree-button').click() driver.find_element(By.CSS_SELECTOR,'.nd-dialogFrame__close').click()
Это правильно, если это выходит за рамки примера и необходимо обрабатывать дальнейшие страницы результатов, я бы проверял наличие элементов и выполнял действия в зависимости от них или проектировал поток таким образом, чтобы они использовались только изначально при вызове и инкапсулировать итерацию страниц.
Для меня скрипт работает без щелчка по этим элементам, поэтому я решил их удалить.
С точки зрения эффективности, есть ли способ ускорить этот процесс? Я только что использовал Options.headless = True для драйвера, но мне нужно было бы сделать его еще легче.
Пока я углублялся в это, я смог найти решение requests и beautifulsoup. Лес за деревьями - я никогда не перестаю учиться. Исправил мой первоначальный подход stackoverflow.com/a/75020969/14461986
Я разработал свой алгоритм на основе вашего ответа (я извлекаю гораздо больше данных), и решение потрясающее. Идет сверхбыстро. Большое спасибо!
Может быть, этот элемент не отображается, а где-то за кадром?