我定義了兩個單獨的函式,用于使用 selenium 打開 url,并使用 selenium 獲取資料。在我的第二個函式driver中,變數是不可分配的,因為它在第一個函式中保持本地。我不知道將硒活動以兩種不同的方式分開是否合乎邏輯,我第一次使用這種方法。有什么建議可以使用 webdriver 實體并在第二個函式中使用它?
import pandas as pd
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
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
#reading from csv file url-s
def readCSV(path_csv):
df=pd.read_csv(path_csv)
return df
fileCSV=readCSV(r'C:\Users\Admin\Downloads\urls.csv')
length_of_column_urls=fileCSV['linkamazon'].last_valid_index()
#going to urls 1-by-1
def goToUrl_Se():
for i in range(0, length_of_column_urls 1):
xUrl = fileCSV.iloc[i, 1]
print(xUrl,i)
# going to url(a,amazn) via Selenium WebDriver
chrome_options = Options()
chrome_options.headless = False
chrome_options.add_argument("start-maximized")
# options.add_experimental_option("detach", True)
chrome_options.add_argument("--no-sandbox")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
webdriver_service = Service(r'C:\pythonPro\w_crawl\AmznScrpBot\chromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=chrome_options)
driver.get(xUrl)
driver.quit()
#fetch-parse the data from url page
def parse_data():
x_title=driver.find_element(By.XPATH,'//*[@id="search"]/div[1]/div[1]/div/span[3]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[1]/h2/a/span')
goToUrl_Se()
uj5u.com熱心網友回復:
如我所見,您試圖決議來自您打開的每個 URL 的資料goToUrl_Se()。如果是這樣,更好的方法是將決議資料代碼放在goToUrl_Se()方法中使用的回圈中。
此外,無需driver每次都定義和創建。
你肯定必須改進你的定位器。非常長的絕對 XPath 非常脆弱和易碎。
以下流程對我來說似乎更好。
import pandas as pd
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
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
driver = Null
#reading from csv file url-s
def readCSV(path_csv):
df=pd.read_csv(path_csv)
return df
fileCSV=readCSV(r'C:\Users\Admin\Downloads\urls.csv')
length_of_column_urls=fileCSV['linkamazon'].last_valid_index()
def create_driver():
chrome_options = Options()
chrome_options.headless = False
chrome_options.add_argument("start-maximized")
# options.add_experimental_option("detach", True)
chrome_options.add_argument("--no-sandbox")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
webdriver_service = Service(r'C:\pythonPro\w_crawl\AmznScrpBot\chromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=chrome_options)
#going to urls 1-by-1
def goToUrl_Se():
for i in range(0, length_of_column_urls 1):
xUrl = fileCSV.iloc[i, 1]
print(xUrl,i)
# going to url(a,amazn) via Selenium WebDriver
driver.get(xUrl)
x_title=driver.find_element(By.XPATH,'//*[@id="search"]/div[1]/div[1]/div/span[3]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[1]/h2/a/span')
driver.quit()
create_driver()
goToUrl_Se()
uj5u.com熱心網友回復:
你應該driver從你的create_driver()函式中回傳:
def create_drive():
// ...
return driver
并更改您的函式以接受引數:
def parse_data(driver):
// ...
現在您可以通過分配獲取驅動程式并將其傳遞給您的函式:
driver = create_driver()
parse_data(driver)
我建議您閱讀有關回傳值和函式引數的更多資訊,以更好地理解這一點。
uj5u.com熱心網友回復:
在這種結構中,您只能parse_data在第一個函式中呼叫第二個函式goToUrl_Se()。
喜歡:
driver.get(xUrl)
somoething = parse_data()
并改變parse_data它以回傳一些東西
如果您想在自己之外同時呼叫它們,那么您需要做兩件事:
- parse_data 應該得到驅動程式和引數
def parse_data(driver) - 你不應該在里面退出硒
goToUrl_Se()
如果您想按照真正應該做的那樣去做,那么只需使用 OOP。如果你還是不想,那么你最好在driver任何函式之外啟動名稱并使用函式來更改它。例如,您可以擁有一個僅更改驅動程式選項的功能。但是,當一個函式執行多項操作(例如您的函式)時,這是一種不好的做法 goToUrl_Se()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522584.html
上一篇:如何知道警報是否彈出?
