Веб-сканирование в Python Selenium - Не могу найти кнопку - PullRequest
1 голос
/ 07 мая 2020

Итак, я пытаюсь получить доступ к некоторым данным с этой веб-страницы http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/empresas-listadas.htm. Я пытаюсь нажать на кнопку с названием «Setor de atuação» с селеном. Проблема в том, что библиотека запросов возвращает мне HTML, отличное от того, которое я вижу, когда проверяю страницу. Я уже пытался отправить заголовок с моим запросом, но это не было решением. Хотя, когда я печатаю содержимое в

browser.page_source

, я все равно получаю неполную часть страницы, которую я хочу. Чтобы попытаться решить проблему, я заметил, что при инициализации сайта отправляются два запроса: print1

Ну, я не уверен, что мне теперь делать. Если кто-нибудь может мне помочь или прислать учебник, объяснить, что происходит, я был бы очень рад. Заранее спасибо. Я сделал только простой веб-скрейпинг, поэтому я не уверен, что делать дальше. Я также проверил другие вопросы на форумах, и ни один из них не похож на мою проблему.

import bs4 as bs
import requests
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito') #private
#options.add_argument('--headless') # doesnt open page

browser = webdriver.Chrome('/home/itamar/Desktop/chromedriver', chrome_options=options)

site = 'http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/empresas-listadas.htm'

browser.get(site)

Это мой код до сих пор. У меня проблемы с поиском и щелчком по кнопке элемента "Setor de Atuação". Я пробовал использовать X_path, class, id, но ничего не работает.

Ответы [ 3 ]

3 голосов
/ 07 мая 2020

Нацеленная кнопка находится внутри iframe, в этом случае вам придется использовать функцию switch_to из вашего драйвера селена, таким образом переключая драйвер на iframe DOM, и только тогда вы можете искать кнопку. Я поиграл с предоставленной страницей, и она сработала - правда, только с использованием Selenium, в Beautiful Soup нет необходимости. Это мой код:

from selenium import webdriver
import time

class B3:
    def __init__(self):
        self.bot = webdriver.Firefox()

    def start(self):
        bot = self.bot
        bot.get('http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/empresas-listadas.htm')
        time.sleep(2)

        iframe = bot.find_element_by_xpath('//iframe[@id="bvmf_iframe"]')
        bot.switch_to.frame(iframe)
        bot.implicitly_wait(30)

        tab = bot.find_element_by_xpath('//a[@id="ctl00_contentPlaceHolderConteudo_tabMenuEmpresaListada_tabSetor"]')
        time.sleep(3)
        tab.click()
        time.sleep(2)

if __name__ == "__main__":
    worker = B3()
    worker.start()

Надеюсь, он вам подходит!

ссылки: https://www.techbeamers.com/switch-between-iframes-selenium-python/

1 голос
/ 07 мая 2020

В этом случае я предлагаю вам работать только с Selenium, потому что это зависит от обработки Javascripts.

Вы можете проверить элементы и использовать XPath для выбора и выбора элементов.

XPath : //*[@id="ctl00_contentPlaceHolderConteudo_tabMenuEmpresaListada_tabSetor"]/span/span

Итак, ваш код будет выглядеть так:

elementSelect = driver.find_elements_by_xpath('//*[@id="ctl00_contentPlaceHolderConteudo_tabMenuEmpresaListada_tabSetor"]/span/span')
elementSelect[0].click()
time.sleep(5)  # Wait the page to load.

PS: Я рекомендую вам поискать службу API для B3. Я нашел эту ссылку , но не читал. Возможно, они уже удалили такие данные.

О XPath: https://www.guru99.com/xpath-selenium.html

0 голосов
/ 07 мая 2020

Я не могу понять проблему, поэтому, если вы можете показать фрагмент кода, будет лучше. И я предлагаю вам использовать BeautifulSoup для парсинга веб-страниц.

...