Как мне нажать кнопку «Загрузить еще» на веб-сайте Tradingview, используя Selenium и python? - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь запросить все строки с веб-сайта tradingview. Мне нужен только тикер и название акции. Я не могу нажать кнопку «Загрузить еще» внизу страницы, чтобы загрузить все строки. Есть ли у кого-нибудь решение этой проблемы?

Это код, который я написал, чтобы получить тикер и название акции (он работает до кнопки «загрузить еще»).

from bs4 import BeautifulSoup

URL = 'https://www.tradingview.com/markets/stocks-usa/sectorandindustry-industry/biotechnology/'
page = requests.get(URL)

soup = BeautifulSoup(page.content, 'html.parser')`

for tr in soup.find_all('tr'):
    #tds = tr.find_all('td')
    ticker = tr.find('a', class_='tv-screener__symbol')
    stock_name = tr.find('span', class_='tv-screener__description')
    if None in (ticker, stock_name):
        continue
    print(ticker.text.strip())
    print(stock_name.text.strip())
    print("\n\n")

Вот код селена, который я пытался написать для кнопки «Загрузить еще», но безуспешно -

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
#options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.tradingview.com/markets/stocks-usa/sectorandindustry-industry/biotechnology/")
loadMoreButton = driver.find_elements_by_xpath("//span[@class='tv-load-more__btn']")
loadMoreButton.click()
driver.quit()

И это ошибка, которую я получил:

AttributeError                            Traceback (most recent call last)
<ipython-input-80-cf801ef16cdd> in <module>
      9 driver.get("https://www.tradingview.com/markets/stocks-usa/sectorandindustry-industry/biotechnology/")
     10 loadMoreButton = driver.find_elements_by_xpath("//div[@class='tv-load-more tv-load-more--screener js-screener-load-more']")
---> 11 loadMoreButton.click()
     12 driver.quit()

AttributeError: 'list' object has no attribute 'click'


Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Напишите этот фрагмент кода, просто чтобы нажимать на кнопку Загрузить еще , пока не загрузится вся страница. Более того, я всегда предпочитаю использовать XPath вместо class имен для поиска элемента.

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

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 5)
action = ActionChains(driver)

driver.get("https://www.tradingview.com/markets/stocks-usa/sectorandindustry-industry/biotechnology/")
# Used to get a click count
i = 0

while True:
    try:
        # Given some timeout so that data will be loaded in the page
        time.sleep(2)
        Load_More = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Load More']")))
        action.move_to_element(Load_More).click().perform()
        i += 1
        print(f"Clicked {i} time.")
    except:
        print("Reached End of the Page")
        break
0 голосов
/ 07 августа 2020

Проблема: find_elements_by_xpath возвращает список. См. Ниже, используя find_element_by_xpath.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
#options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.tradingview.com/markets/stocks-usa/sectorandindustry-industry/biotechnology/")
loadMoreButton = driver.find_element_by_xpath("//span[@class='tv-load-more__btn']")
loadMoreButton.click()
driver.quit()

Я предлагаю использовать By, WebDriverWait, expected_conditions и element_to_be_clickable:

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
from selenium.webdriver.chrome.options import Options

options = Options()
#options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.tradingview.com/markets/stocks-usa/sectorandindustry-industry/biotechnology/")
loadMoreButton = WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='tv-load-more__btn']")))
loadMoreButton.click()
driver.quit()
...