На странице источника не отображаются рекламные объявления для селена / Python - PullRequest
1 голос
/ 01 февраля 2020

Это должен быть очень простой поиск элементов, который просто не происходит, я добавил очень долгое неявное ожидание, чтобы страница полностью загрузилась

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.get("https://www.smh.com.au")
driver.find_elements_by_class_name("img_ad")

, а также ожидание загрузки на основе на месте расположения элемента

timeout = 10    
try:
    element_present = EC.presence_of_element_located((By.CLASS_NAME, '"img_ad'))
    WebDriverWait(driver, timeout).until(element_present)
except TimeoutException:
    print("Timed out waiting for page to load")

Однако этот элемент не отображается, несмотря на то, что я ясно вижу его в режиме проверки в firefox

<img src="https://tpc.googlesyndication.com/simgad/9181016285467049325" alt="" class="img_ad" width="970" height="250" border="0">

Это объявление на странице, поэтому я думаю, там может быть какой-то забавный код, который не отображается в драйвере, какой-нибудь совет, как его собрать?

1 Ответ

1 голос
/ 02 февраля 2020

Реклама находится в iFrame, поэтому вам нужно сначала переключить этот кадр.

Но я обнаружил, что после нескольких загрузок страницы реклама перестала появляться на веб-странице. Я обнаружил, что реклама загружается почти каждый раз, используя driver = webdriver.Opera(), но не в Chrome из Firefox, даже используя частный просмотр и очистку всех данных просмотра.

Если они появились, этот код работал.

Чтобы найти элемент по частичному имени класса, я сначала использовал find_element_by_css_selector("amp-img[class^='img_ad']"). Иногда элемент с классом img_ad отсутствует, поэтому вы можете использовать driver.find_element_by_id("aw0"), который чаще находит данные. Иногда веб-страница HTML даже не имеет этого идентификатора, поэтому мой код печатает HTML.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException


driver = webdriver.Firefox()
driver.get("https://www.smh.com.au")
driver.implicitly_wait(10)

iFrame = driver.find_elements_by_tag_name("iframe")[1]
driver.switch_to.frame(iFrame)

try:
    # element = driver.find_element_by_css_selector("amp-img[class^='img_ad']")
    # print(element.get_attribute('outerHTML'))
    element = driver.find_element_by_id("aw0")
    print(element.get_attribute('innerHTML'))
except NoSuchElementException:
    print("Advert not found")
    print(driver.page_source)

driver.quit()

Выходы:

<amp-img alt="" class="img_ad i-amphtml-layout-fixed i-amphtml-layout-size-defined i-amphtml-element i-amphtml-layout" height="250" i-amphtml-layout="fixed" i-amphtml-ssr="" src="https://tpc.googlesyndication.com/simgad/16664324514375864185" style="width:970px;height:250px;" width="970"><img alt="" class="i-amphtml-fill-content i-amphtml-replaced-content" decoding="async" src="https://tpc.googlesyndication.com/simgad/16664324514375864185"></amp-img>

или:

<img src="https://tpc.googlesyndication.com/simgad/10498242030813793376" border="0" width="970" height="250" alt="" class="img_ad">

или:

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