Страница не загружается после .click (), даже если она отображается в браузере - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь почистить эту страницу "https://www.seloger.com/list_beta.htm?tri=initial&enterprise=0&idtypebien=2,1&idtt=2,5&naturebien=1,2,4&cp=75"

Но когда я использую .click() в первом элементе поиска, страница корректно загружается в браузере, но я не получилbody и все его дочерние элементы с методом driver.find_element, тогда как получение URL новой загруженной страницы позволяет мне найти его без проблем.driver.current_url дайте мне первую страницу, это похоже на .click(), но ничего не загружается, тогда как отрендер успешно загружен в браузер.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import visibility_of_element_located
from selenium.webdriver.support.ui import WebDriverWait
import pyautogui
import time


def cssconvert(tag):
    return '.'+tag.replace(' ', '.')


binary = r'C:\Program Files\Mozilla Firefox\firefox.exe'
options = Options()
options.set_headless(headless=False)
options.binary = binary
cap = DesiredCapabilities().FIREFOX
cap["marionette"] = True #optional
driver = webdriver.Firefox(firefox_options=options, capabilities=cap, executable_path="C:\\Users\\chrys\\Desktop\\DataScientist\\Selenium\\geckodriver_true\\geckodriver.exe")
driver.get("https://www.seloger.com/list_beta.htm?tri=initial&enterprise=0&idtypebien=2,1&idtt=2,5&naturebien=1,2,4&cp=75")

#time.sleep(2)
select = 'block__ShadowedBlock-sc-10w6hsj-0 ListContent__SmartClassifiedExtended-sc-1viyr2k-2 iddbNe classified__ClassifiedContainer-sc-1wmlctl-0 haLWMI Card__CardContainer-sc-7insep-7 jZkbME'
driver.find_element_by_css_selector(cssconvert(select)).click()
driver.find_element_by_id('js-descriptifBien')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

NoSuchElementException: Message: Unable to locate element: [id="js-descriptifBien"]

если теперь я скопирую за URL:

driver.get('https://www.seloger.com/annonces/viagers/appartement/paris-11eme-75/belleville-saint-maur/145504325.htm?projects=2,5&types=2,1&natures=1,2,4&places=[{cp:75}]&qsVersion=1.0&bd=ListToDetail')
driver.find_element_by_id('js-descriptifBien').text

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

1 Ответ

0 голосов
/ 28 сентября 2019

Вы можете прочитать о селекторах здесь и здесь .

Проблема в том, что при нажатии на элемент списка он открывается в новой вкладке,Вы должны переключиться на него перед любым действием.Вот несколько примеров того, как перемещаться между окнами:

current_window = driver.current_window_handle
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".iddbNe"))).click()
wait.until(EC.new_window_is_opened)
driver.switch_to.window(driver.window_handles[1])

С помощью Selenium решение может собирать все ссылки из списка и после перехода к ним.Для этого вы можете использовать .iddbNe a[name=classified-link] css selector.После сбора всех ссылок со всех необходимых страниц вы можете перейти к ним и собрать данные.
Вот пример того, как это сделать для первой страницы:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ...

wait = WebDriverWait(driver, 20)

# you can put loop to go throw all pages you need and add to the list
links = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".iddbNe a[name=classified-link]")))
for link in links:
    driver.get(link)
    # get you data

Лучшее решение для очистки - использовать .С кодом ниже простой пример того, как вы можете получить 100 результатов в формате JSON.В отчете вы можете найти общее количество результатов и использовать его для зацикливания и сбора всей необходимой вам информации:

import requests

headers = {
    'sec-fetch-mode': 'cors',
    'origin': 'https://www.seloger.com',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'ru,en-US;q=0.9,en;q=0.8,tr;q=0.7',
    'pragma': 'no-cache',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/77.0.3865.90 Safari/537.36',
    'content-type': 'application/json',
    'accept': 'application/json',
    'cache-control': 'no-cache',
    'authority': 'www.seloger.com',
    'referer': 'https://www.seloger.com/list_beta.htm?projects=2%2C5&types=2%2C1&natures=1%2C2%2C4&places=%5B%7Bcp'
               '%3A75%7D%5D&qsVersion=1.0&LISTING-LISTpg=2',
    'sec-fetch-site': 'same-origin',
    'dnt': '1',
}

params = (
    ('from', '0'),
    ('size', '100'),
    ('isSeo', 'false'),
)

data = '{"idPublication":null,"projects":[2,5],"types":[2,1],"natures":[1,2,4],"places":[{"label":"Paris",' \
       '"cities":null,"districts":null,"countries":null,"divisions":null,"subDivisions":["75"],"fakeCities":null}],' \
       '"searchAreas":null,"isochronePoints":null,"proximities":null,"withGeoloc":null,"price":null,' \
       '"groundSurface":null,"surface":null,"bedrooms":[],"rooms":[],"bedroom":null,"room":null,"sort":null,' \
       '"floor":null,"lastFloor":null,"hearth":null,"guardian":null,"view":null,"balcony":null,"pool":null,' \
       '"lift":null,"terrace":null,"cellar":null,"south":null,"parking":null,"box":null,"parquet":null,"locker":null,' \
       '"furnished":null,"disabledAccess":null,"alarm":null,"toilet":null,"bathtub":null,"shower":null,"hall":null,' \
       '"livingRoom":null,"diningRoom":null,"kitchen":null,"heating":null,"unobscured":null,"picture":null,' \
       '"exclusiveness":null,"priceChange":null,"privateSeller":null,"video":null,"vv":null,"enterprise":null,' \
       '"garden":null,"basement":null,"groundFloor":null,"houseboat":null} '

response = requests.post('https://www.seloger.com/list/api/externaldata', headers=headers, params=params, data=data)
print(response.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...