Соскоб виджет

1

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

 from selenium import webdriver

url = 'http://www.tradingview.com/screener'
driver = webdriver.Firefox()
driver.get(url)

SCROLL_PAUSE_TIME = 2

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

# will give a list of all tickers
tickers = driver.find_elements_by_css_selector('a.tv-screener__symbol') 

# will give a list of all company names
company_names = driver.find_elements_by_css('span.tv-screener__description') 

# will give a list of all close values
close_values = driver.find_elements_by_xpath("//td[@class = 'tv-data-table__cell tv-screener-table__cell tv-screener-table__cell--numeric']/span") 

# will give a list of all percentage changes
percentage_changes = driver.find_elements_by_xpath('//tbody/tr/td[3]') 

# will give a list of all value changes
value_changes = driver.find_elements_by_xpath('//tbody/tr/td[4]')

# will give a list of all ranks
ranks = driver.find_elements_by_xpath('//tbody/tr/td[5]/span')

# will give a list of all volumes
volumes = driver.find_elements_by_xpath('//tbody/tr/td[6]')

# will give a list of all market caps
market_caps = driver.find_elements_by_xpath('//tbody/tr/td[7]')

# will give a list of all PEs
pes = driver.find_elements_by_xpath('//tbody/tr/td[8]')

# will give a list of all EPSs
epss = driver.find_elements_by_xpath('//tbody/tr/td[9]')

# will give a list of all EMPs
emps = driver.find_elements_by_xpath('//tbody/tr/td[10]')

# will give a list of all sectors
sectors = driver.find_elements_by_xpath('//tbody/tr/td[11]')

for index in range(len(tickers)):
   print("Row " + index + " " + tickers[index].text + " " + company_names[index].text + " ")
Теги:
selenium

1 ответ

1
Лучший ответ

Вы пытаетесь найти неправильный элемент. Это:

element = driver.find_elements_by_id('js-screener-container')

следует заменить на:

# will give a list of all tickers
tickers = driver.find_elements_by_css_selector('a.tv-screener__symbol') 

# will give a list of all company names
company_names = driver.find_elements_by_css_selector('span.tv-screener__description') 

# will give a list of all close values
close_values = driver.find_elements_by_xpath("//td[@class = 'tv-data-table__cell tv-screener-table__cell tv-screener-table__cell--numeric']/span") 

# will give a list of all percentage changes
percentage_changes = driver.find_elements_by_xpath('//tbody/tr/td[3]') 

# will give a list of all value changes
value_changes = driver.find_elements_by_xpath('//tbody/tr/td[4]')

# will give a list of all ranks
ranks = driver.find_elements_by_xpath('//tbody/tr/td[5]/span')

# will give a list of all volumes
volumes = driver.find_elements_by_xpath('//tbody/tr/td[6]')

# will give a list of all market caps
market_caps = driver.find_elements_by_xpath('//tbody/tr/td[7]')

# will give a list of all PEs
pes = driver.find_elements_by_xpath('//tbody/tr/td[8]')

# will give a list of all EPSs
epss = driver.find_elements_by_xpath('//tbody/tr/td[9]')

# will give a list of all EMPs
emps = driver.find_elements_by_xpath('//tbody/tr/td[10]')

# will give a list of all sectors
sectors = driver.find_elements_by_xpath('//tbody/tr/td[11]')

Итак, теперь у вас есть все данные, хранящиеся в списках. Если вы хотите построить строки данных, вы можете использовать что-то вроде этого:

for index in range(len(tickers)):
   print("Row " + tickers[index].text + " " + company_names[index].text + " " + ....)

Результат будет примерно таким:

Row AAPL APPLE INC. 188.84 -1.03% -1.96 Neutral 61.308M 931.386B 17.40 10.98 123K Technology 
Row AMZN AMAZON.COM INC 1715.97 -0.46% -7.89 Buy 4.778M 835.516B 270.53 6.54 566K Consumer Cyclicals
...

PS:

Я думаю

SCROLL_PAUSE_TIME = 0.5

слишком мало времени, так как иногда загрузка нового контента с помощью прокрутки на нижней части страницы может быть больше 0.5 seconds. Я бы увеличил это значение, чтобы убедиться, что все содержимое будет загружено.

  • 0
    Привет, спасибо за код. Я изменил ваш код в исходном сообщении, но ничего не печатает? Есть идеи, если я сделал что-то не так? Спасибо
  • 0
    Извините, у меня была ошибка в цикле for. String и int не могут быть объединены таким образом. Так что код отредактирован. Если это не сработает, попробуйте напечатать один элемент print(tickers[0].text)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню