#python #selenium #web-scraping
Вопрос:
Я пытаюсь извлечь рыночные данные из инструмента dex с помощью selenium и Django и до сих пор не могу удалить все рыночные данные. вы заметите, что данные о рынке инструментов dex загружаются медленно, что означает, что новые данные загружаются после прокрутки вниз или при нажатии на следующую страницу, поскольку все данные не могут отображаться на одной веб-странице, данные разделены до 35 веб-страниц . на данный момент я могу очистить только 1-ю страницу, которая появляется на экране, приведенный ниже код не удаляет все данные. как я могу улучшить код, чтобы очистить все значения данных 35-страниц
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
def getData(url):
driver = webdriver.Chrome(
executable_path='C:/Users/denni/OneDrive/Desktop/DextoolScrapper/app/chromedriver.exe'
)
driver.get('https://www.dextools.io/app/uniswap/pair-explorer/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d')
# get table
tableElement = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, 'ngx-datatable'))
)
# scroll into table view
driver.execute_script("arguments[0].scrollIntoView();", tableElement)
# scrolling through the table body to the bottom
tableBodyelement = tableElement.find_element_by_tag_name('datatable-body-cell')
driver.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight)", tableBodyelement)
rowWrapper = tableElement.find_elements_by_tag_name('datatable-row-wrapper')
for row in rowWrapper:
cells = row.find_elements_by_tag_name('datatable-body-cell')
date = cells[0].text
type = cells[1].text
price_usd = cells[2].text
price_eth = cells[3].text
amount_cuminu = cells[4].text
total_eth = cells[5].text
maker = cells[6].find_element_by_tag_name('a').get_attribute('href')
print(date, type, price_usd, price_eth, amount_cuminu, total_eth, maker)
print('----')
это результат приведенного выше кода
1-я страница очищенных данных
Ответ №1:
Просто поместите код в while True
цикл и нажмите next
в конце этого цикла. Вы можете использовать try/except
для обнаружения ошибок, когда больше нет next
страниц для выхода из цикла.
В конце концов, это может потребоваться sleep()
после click()
того, как у JavaScript будет время заменить значения в уже существующей таблице ngx-datatable
.
ИЗМЕНИТЬ: теперь используйте код pandas.DataFrame
для сохранения всего в файле Excel.
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
def getData(url):
driver = webdriver.Chrome(
executable_path='C:/Users/denni/OneDrive/Desktop/DextoolScrapper/app/chromedriver.exe'
)
#driver = webdriver.Chrome()
#driver = webdriver.Firefox()
driver.get('https://www.dextools.io/app/uniswap/pair-explorer/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d')
page = 0
all_results = [] # list for all rows
while True:
page = 1
print('--- page:', page, '---')
# get table
tableElement = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, 'ngx-datatable'))
)
# scroll into table view
driver.execute_script("arguments[0].scrollIntoView();", tableElement)
# scrolling through the table body to the bottom
tableBodyelement = tableElement.find_element_by_tag_name('datatable-body-cell')
driver.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight)", tableBodyelement)
rowWrapper = tableElement.find_elements_by_tag_name('datatable-row-wrapper')
for row in rowWrapper:
cells = row.find_elements_by_tag_name('datatable-body-cell')
date = cells[0].text
type = cells[1].text
price_usd = cells[2].text
price_eth = cells[3].text
amount_cuminu = cells[4].text
total_eth = cells[5].text
maker = cells[6].find_element_by_tag_name('a').get_attribute('href')
print(date, type, price_usd, price_eth, amount_cuminu, total_eth, maker)
print('----')
# add row to list
all_results.append( [date, type, price_usd, price_eth, amount_cuminu, total_eth, maker] )
try:
next_page = driver.find_element_by_xpath('//a[@aria-label="go to next page"]')
next_page.click()
time.sleep(0.5)
except Exception as ex:
print("last page???")
break
# after loop convert to DataFrame and write it to excel
import pandas as pd
df = pd.DataFrame(all_results, columns=['date', 'type', 'price_usd', 'price_eth', 'amount_cuminu', 'total_eth', 'maker'])
df.to_excel('results.xlsx')
# ---
getData(None)