selenium 以WebDriver的示例为例的PYTHONSE

ctehm74n  于 2022-11-10  发布在  Python
关注(0)|答案(3)|浏览(131)

我定义了两个单独的函数,分别用于使用Selify打开url和使用Selify获取数据。在我的第二个函数中,变量driver是不可赋值的,因为它保留在第一个函数中的局部。我不知道将 selenium 的活性分成两种不同的方法是否合乎逻辑,我是第一次使用这种方法。对于在第二个函数中使用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()
wdebmtf2

wdebmtf21#

如我所见,您试图解析在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:\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')
        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()
pinkon5k

pinkon5k2#

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

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

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

def parse_data(driver):
    // ...

现在,您可以获取具有赋值的驱动程序并将其传递给您的函数:

driver = create_driver()
parse_data(driver)

我建议您阅读更多关于返回值和函数参数的内容,以便更好地理解这一点。

6ljaweal

6ljaweal3#

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

driver.get(xUrl)
somoething = parse_data()

并更改parse_data以使其返回一些
如果你想把他们都称为自己以外的人,那么你需要做两件事:
1.parse_data应获取驱动程序和参数def parse_data(driver)
1.在goToUrl_Se()内不能退出 selenium
如果你真的想这么做,那就用OOP吧。如果您仍然不想这样做,那么您最好在任何函数之外启动driver名称,并使用函数来更改它。例如,您可以拥有一个仅更改驾驶员选项的功能。但是,当一个函数做多项工作时,这是不好的做法,比如您的goToUrl_Se()函数。

相关问题