簡體   English   中英

使用Selenium調用數據框中的單元格-遍歷數據框以寫入網站搜索欄

[英]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

您需要使用ilocloc方法在數據框中插入值。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM