【问题标题】:python Selenium taking instance of webdriverpython Selenium 以 webdriver 为例
【发布时间】:2022-11-02 11:41:07
【问题描述】:

我定义了两个单独的函数,用于使用 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()

【问题讨论】:

  • 我建议您了解如何将参数传递给您的函数。

标签: python function selenium selenium-webdriver instanceof


【解决方案1】:

如我所见,您试图解析来自goToUrl_Se() 中打开的每个 URL 的数据。如果是这样,更好的方法是将解析数据代码放在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:UsersAdminDownloadsurls.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:pythonProw_crawlAmznScrpBotchromedriver.exe')
        global driver
        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()

【讨论】:

    【解决方案2】:

    您应该从您的 create_driver() 函数中返回 driver

    def create_drive():
       // ...
       return driver
    

    并更改您的函数以接受参数:

    def parse_data(driver):
        // ...
    

    现在您可以通过分配获取驱动程序并将其传递给您的函数:

    driver = create_driver()
    parse_data(driver)
    

    我建议您阅读有关返回值和函数参数的更多信息,以更好地理解这一点。

    【讨论】:

      【解决方案3】:

      在此结构中,您只能在第一个函数 goToUrl_Se() 中调用第二个函数 parse_data

      喜欢:

      driver.get(xUrl)
      somoething = parse_data()
      

      并更改 parse_data 让它返回一些东西

      如果您想在自己之外同时调用它们,那么您需要做两件事:

      1. parse_data 应该得到驱动程序和参数def parse_data(driver)
      2. 你不应该在goToUrl_Se() 内退出 selenium

        如果你想按照真正应该做的那样去做,那么就使用 OOP。如果你还是不想,那么你最好在任何函数之外启动driver 名称并使用函数来更改它。例如,您可以拥有一个仅更改驱动程序选项的功能。但是,当一个函数执行多项操作时,这是一种不好的做法,例如您的 goToUrl_Se() 之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-07
        • 2021-06-08
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        相关资源
        最近更新 更多