Python (Selenium) - Как сохранить данные со страницы 1 до последней страницы в том же CSV - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть веб-страница, на которой мне нужно собрать все данные из таблицы, встроенной со страницы 1 до последней страницы, используя Python с селеном.

Вот веб-сайт: https://www.ageofempires.com/mods

Мне нужна помощь при создании кода go на следующей странице, пока она не достигнет последней. Проблема заключается в том, что вместо кнопок навигации, таких как «Далее» или «Предыдущая», эта веб-страница имеет нумерованные индексы в качестве кнопок для навигации. Поэтому трудно применить элементы HTML в логи c.

Кроме того, как сохранить данные с каждой страницы в один и тот же файл .CSV? Почему заголовок столбца не сохраняется в моем csv?

Ниже приведен мой тестовый код:

Тест навигации по странице:

import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
from selenium.common.exceptions import TimeoutException
import time
import csv
from datetime import datetime
from selenium.common.exceptions import WebDriverException

# Use driver to locate information
driver = webdriver.Edge(executable_path = "C://Windows//SysWOW64//MicrosoftWebDriver.exe")
driver.maximize_window()
# Using Edge to open the website
driver.get("https://www.ageofempires.com/mods")

driver.implicitly_wait(10)

while True:
    try:
        driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li[@class='pagination']/a"))))
        driver.find_element_by_xpath("//li[@class='pagination']/a").click()
        print("Navigating to Next Page")
    except (TimeoutException, WebDriverException) as e:
        print("Last page reached")
        break
driver.quit()

Открытие CSV и сохранение данные:

table = driver.find_element_by_css_selector('#mods-listing > table')
filename = datetime.now().strftime('C:/Users/username/Desktop/Output/ModsAll_%Y%m%d_%H%M.csv')
with open(filename, 'w', newline='') as csvfile:
    wr = csv.writer(csvfile)
    for row in table.find_elements_by_css_selector('tr'):
        wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])

1 Ответ

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

Я понял это сам:

table = driver.find_element_by_css_selector('#mods-listing > table')
filename = datetime.now().strftime('C:/Users/username/Desktop/Output/ModsAll_%Y%m%d_%H%M.csv')
with open(filename, 'w', newline='', encoding="utf-8") as csvfile:
    wr = csv.writer(csvfile)
    for row in table.find_elements_by_css_selector('tr'):
        wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])

driver.find_element_by_xpath('//*[@id="mods-paginav"]/ul/li[2]/button').click()
time.sleep(3)
table = driver.find_element_by_css_selector('#mods-listing > table')
with open(filename, 'a', newline='', encoding="utf-8") as csvfile:
    wr = csv.writer(csvfile)
    for row in table.find_elements_by_css_selector('tr'):
        wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])

driver.find_element_by_xpath('//*[@id="mods-paginav"]/ul/li[3]/button').click()
time.sleep(3)
table = driver.find_element_by_css_selector('#mods-listing > table')
with open(filename, 'a', newline='', encoding="utf-8") as csvfile:
    wr = csv.writer(csvfile)
    for row in table.find_elements_by_css_selector('tr'):
        wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])

i = 0
while i < 89:
    driver.find_element_by_xpath('//*[@id="mods-paginav"]/ul/li[5]/button').click()
    time.sleep(3)
    table = driver.find_element_by_css_selector('#mods-listing > table')
    with open(filename, 'a', newline='', encoding="utf-8") as csvfile:
        wr = csv.writer(csvfile)
        for row in table.find_elements_by_css_selector('tr'):
            wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])
    i += 1
else:
    print("This is the last page! ")
print("Finished... ")
driver.quit();

Мой лог c немного сложен, поэтому, если есть какие-то лучшие решения, я буду очень признателен.

С веб-страницы 4 расположение кнопок / значков страницы стабильно, поэтому я могу использовать для l oop. Для страниц 1, 2 и 3 мне приходится обрабатывать данные по отдельности из-за различий в расположении кнопок.

Чтобы сохранить данные в одном и том же файле CSV, просто запросите функцию с опцией «a», которая означает «добавить», поэтому данные будут добавлены в тот же файл.

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