Расшифровка названий классов на Facebook через Selenium - PullRequest
0 голосов
/ 05 марта 2019

Я заметил, что в facebook есть странные имена классов, которые выглядят сгенерированными компьютером.Чего я не знаю, так это того, являются ли эти классы постоянными с течением времени или они изменяются через некоторый промежуток времени?Может быть, кто-то, кто имеет опыт с этим, может ответить.Единственное, что я вижу, это то, что когда я выхожу из Chrome и снова открываю его, он остается прежним, так что, по крайней мере, они не меняют каждый сеанс браузера.

Так что я думаю, что лучший способ сделать этоСкраб Facebook должен был бы использовать некоторые элементы в пользовательском интерфейсе и предполагать, что структура всегда одинакова, как, например, чтобы получить адрес из раздела «О программе» примерно так:

from selenium import webdriver
driver = webdriver.Chrome("C:/chromedriver.exe")

driver.get("https://www.facebook.com/pg/Burma-Superstar-620442791345784/about/?ref=page_internal")
# wait some time
address_elements = driver.find_elements_by_xpath("//span[text()='FIND US']/../following-sibling::div//button[text()='Get Directions']/../../preceding-sibling::div[1]/div/span")
for item in address_elements:
    print item.text

1 Ответ

0 голосов
/ 15 марта 2019

Вы были довольно правы. Facebook построен через ReactJS , что очень заметно по наличию следующих ключевых слов и тегов в HTML DOM:

  • {"react_render":true,"reflow":true}
  • <!-- react-mount-point-unstable -->
  • ["React-prod"]
  • ["ReactDOM-prod"]
  • ReactComposerTaggerType:{r:["t5r69"],be:1}

Итак, динамически генерируемые имена классов неизбежно изменятся после определенных временных интервалов .


Решение

Решением будет использование атрибутов static для создания динамического стратегии локатора .

Чтобы получить первую строку адреса чуть ниже текста НАЙТИ США , вам нужно вызвать WebDriverWait в сочетании с Ожидаемые_условия как visibility_of_element_located(), и вы можете использовать следующее оптимизированное решение:

print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[normalize-space()='FIND US']//following::span[2]"))))

Ссылки

Вы можете найти некоторые соответствующие обсуждения в:


Outro

Примечание : Утилизация Facebook нарушает их Условия обслуживания в разделе 3.2.3 , и вы можете быть допрошены и можетедаже приземлиться в Facebook Jail .Вместо этого используйте Facebook Graph API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...