Поскольку вы не указали ссылку на свой файл Excel, я создал ссылку с тем же именем столбца, что и у вас.
Вы можете скачать его здесь:
https://drive.google.com/open?id=1eelHqJcnNdKNIDYL7NIgwwdNsUEFqL4U
В случае, если в будущем файл будет удален, файл Excel выглядит следующим образом:
dataSheet = pd.read_excel("URL_Test_File.xlsx")
print(dataSheet)
Выход:
URLs
0 yahoo.com
1 facebook.com
2 google.com
допущенные вами ошибки :
Первая ошибка-
for data in dataSheet
выдаст только имена всех столбцов.
Попробуйте это:
for data in dataSheet:
print(data)
ВЫХОД будет:
URLs
Чтобы перебрать столбец URL таблицы Excel, вам нужно сделать следующее:
for armyURL in dataSheet['URLs']:
print(armyURL)
Вторая ошибка:
Это не может считаться ошибкой, но, поскольку вы хотите проанализировать все сайты на одной вкладке, вы должны объявить browser
перед циклом for
.
Потому что, если вы объявите browser
внутри цикла for
, он откроет новое окно браузера для каждого URL, поэтому очистка панели поиска URL бесполезна.
Третья ошибка:
df["Speed Results"] = scoreCard
ничего не добавит в ваш фрейм данных.
Попробуйте это:
df = pd.DataFrame()
for i in range(3):
df["Speed Results"]=i
print(df)
Выход будет просто
Speed Results
Для вставки значений во фрейм данных необходимо использовать методы iloc
или loc
.
Гугл о них.
Я использовал loc
для решения.
Вам нужно передать row number
для ввода значений DataFrame, чтобы я инициализировал переменную i=0
перед циклом for
, чтобы сохранить количество строк, и увеличил его на 1 в конце цикла.
Попробуйте это:
df = pd.DataFrame()
df["Speed Results"]=""
'''
you can specify columns in Dataframe declaration too like:
df = pd.DataFrame(index=None,columns=["Speed Results"])
'''
for i in range(3):
df.loc[i]=i
print(df)
Выход:
Speed Results
0 0
1 1
2 2
Четвертая ошибка:
Поскольку вы хотите добавить оценку в ваш фрейм данных, который представляет собой текст, вам нужно использовать атрибут text
для того же.
scoreCard = browser.find_element_by_class_name('speed-report-card-score')
df.loc[i]= scoreCard.text
Что вы должны были добавить:
Иногда браузеру может потребоваться время для загрузки элементов, и тем временем, если селен ищет какой-то элемент, который еще не загружен, он может выдать ошибку.
Поэтому используйте WebDriverWait , чтобы заставить селен ожидать загрузки элемента.
Я добавил цикл while
, который ожидает загрузки карты результатов.
Полный код:
import pandas as pd
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("start-maximized")
cpath="C:/Users/Downloads/chromedriver_win32/chromedriver.exe"
dataSheet = pd.read_excel("C:/Users/Downloads/URL_Test_File.xlsx")
df = pd.DataFrame(index=None,columns=["Speed Results"])
#df["Speed Results"]=""
browser = webdriver.Chrome(chrome_options=chrome_options,executable_path=cpath)
i=0
for armyURL in dataSheet['URLs']:
browser = webdriver.Chrome(chrome_options=chrome_options,executable_path=cpath)
#browser = webdriver.Chrome('C:\\Webdriver\\chromedriver')
browser.get(('https://developers.google.com/speed/pagespeed/insights/'))
sleep(3)
searchBar = browser.find_element_by_name('url')
searchBar.send_keys(armyURL)
searchBar.send_keys(Keys.RETURN)
sleep(7)
while(True):
try:
WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'speed-report-card-score')))
break
except:
pass
scoreCard = browser.find_element_by_class_name('speed-report-card-score')
#scoreCard=browser.find_element_by_xpath('//div[@class="speed-report"]/div[@class="speed-report-card left"]/p[@class="speed-report-card-score"]/span[@class="fast"]')
df.loc[i]= scoreCard.text
clearBar = browser.find_element_by_name('url')
clearBar.clear()
i+=1
print(df)
ВЫВОД:
Speed Results
0 1.2s FCP2.2s DCL
1 1.7s FCP3.1s DCL
2 0.7s FCP0.7s DCL