![](/img/trans.png)
[英]Iterating through multiple Excel files, Saving specific Cells into a Dataframe using python
[英]Calling on cells in dataframe using Selenium - iterating through a dataframe to write into a website search bar
到目前為止,我擁有一個Python腳本,可以在Chromedriver上調用該URL,輸入一個唯一的url,並從頁面速度讀取中讀取結果。
我要做什么 :創建一個循環,一次從一個excel文件中獲取多個URL,加載頁面速度測試,提取結果,然后重復該過程,直到讀取完所有URL。
from selenium import webdriver
import time
import pandas as pd
dataSheet = pd.read_excel("URL_Test_File.xlsx")
df = pd.DataFrame()
pageSpeed = []
for data in dataSheet:
armyURL = dataSheet['URLs']
browser = webdriver.Chrome('C:\\Webdriver\\chromedriver')
browser.get(('https://developers.google.com/speed/pagespeed/insights/'))
time.sleep(3)
searchBar = browser.find_element_by_name('url')
searchBar.send_keys(armyURL)
searchBar.send_keys(u'\ue007')
time.sleep(7)
scoreCard = browser.find_element_by_class_name('speed-report-card-score')
df["Speed Results"] = scoreCard
clearBar = browser.find_element_by_name('url')
clearBar.clear()
(我對編碼還比較陌生,所以我知道目前情況有點草率)
由於您沒有為您的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
要遍歷Excel工作表的“ URL”列,您需要執行以下操作:
for armyURL in dataSheet['URLs']:
print(armyURL)
第二個錯誤:這不能被認為是錯誤,但是由於您要分析同一選項卡中的所有站點,因此需要在for
循環之前聲明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
方法在數據框中插入值。 Google關於他們。 我已經使用loc
作為解決方案。 您需要傳遞row number
以輸入值DataFrame,因此在for
循環之前我已初始化了變量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)
OUTPUT:
Speed Results
0 1.2s FCP2.2s DCL
1 1.7s FCP3.1s DCL
2 0.7s FCP0.7s DCL
假設您是從Excel工作表中獲取數據,並且解析正確進行,則此新代碼應該可以執行您想要的操作。 您需要將數據追加到df
或者可以使用類似我在這里的東西pd.DataFrame.from_dict()
函數從數據字典創建數據框架:
from selenium import webdriver
import time
import pandas as pd
dataSheet = pd.read_excel("URL_Test_File.xlsx")
#df = pd.DataFrame() # We will create the df at the end
pageSpeed = []
url_list = [] # Create a list to collect your URLs as you iterate
for data in dataSheet:
armyURL = dataSheet['URLs']
browser = webdriver.Chrome('C:\\Webdriver\\chromedriver')
browser.get(('https://developers.google.com/speed/pagespeed/insights/'))
time.sleep(3)
searchBar = browser.find_element_by_name('url')
searchBar.send_keys(armyURL)
searchBar.send_keys(u'\ue007')
time.sleep(7)
scoreCard = browser.find_element_by_class_name('speed-report-card-score')
pageSpeed.append(scoreCard) # Add the speed data to your pageSpeed[] list
url_list.append(armyURL) # Add the URL data to your url_list[] list
clearBar = browser.find_element_by_name('url')
clearBar.clear()
browser.quit() # Close the browser since we'll open a new one up the next time (and we should always have a .quit() at the end of our Selenium code)
speed_test_dict = {'Pages': url_list, 'Page Speed': pageSpeed}
df = pd.DataFrame.from_dict(speed_test_dict)
由於我沒有您的Excel文件,因此無法完全測試,但這應該可行(否則,如果有任何問題,我將進行編輯/修改)
您是否正在尋找這樣的東西?
...
# add the right number of columns based on the number of elements in
# scoreCard_list (see below)
result = pd.DataFrame(columns=["column a", "column b"])
counter = 0
for data in dataSheet:
counter += 1
...
scoreCard_list = scoreCard.text.split("\s+") # or choose other delimiter to split on
result.loc[counter] = scoreCard_list
...
更新 :
我意識到我的初始代碼中的缺陷多於預期,尤其是在循環中調用數據幀,該循環使用數據幀作為周邊。 這就是我最終寫出的使該循環起作用的內容(感謝Leo和dblclik對此進行了研究)。
from selenium import webdriver
import time
import pandas as pd
dataSheet = pd.read_excel("URL_Test_File.xlsx") #test file is has column label URLs
df = pd.DataFrame()
pageSpeed = []
browser = webdriver.Chrome('C:\\Webdriver\\chromedriver')
browser.get(('https://developers.google.com/speed/pagespeed/insights/'))
time.sleep(3)
for i in dataSheet["URLs"]: #Specifying the exact part of the data frame to iterate over
enterURL = i
searchBar = browser.find_element_by_name('url')
searchBar.send_keys(armyURL)
searchBar.send_keys(u'\ue007')
time.sleep(7)
scoreCard = browser.find_element_by_class_name('speed-report-card-score')
df["Speed Results"] = scoreCard.text
clearBar = browser.find_element_by_name('url')
clearBar.clear()
在使用此功能時,在准確地收集和附加信息方面仍然存在一些問題,仍然需要解決,但是對於那些在使用Selenium遍歷數據框時遇到相同問題的人,這應該是一個不錯的開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.