我定义了两个单独的函数,分别用于使用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()
3条答案
按热度按时间wdebmtf21#
如我所见,您试图解析在
goToUrl_Se()
中打开的每个URL的数据。如果是这样的话,更好的方法是将解析数据代码放在goToUrl_Se()
方法中使用的循环中。而且,不需要每次都定义和创建
driver
。而且你肯定要改进你的定位器。非常长的绝对XPath是极其脆弱和易碎的。
下面的流程对我来说似乎更好。
pinkon5k2#
您应该从
create_driver()
函数返回driver
:并更改您的函数以接受参数:
现在,您可以获取具有赋值的驱动程序并将其传递给您的函数:
我建议您阅读更多关于返回值和函数参数的内容,以便更好地理解这一点。
6ljaweal3#
在此结构中,只能在第一个函数
goToUrl_Se()
中调用第二个函数parse_data
。比如:
并更改
parse_data
以使其返回一些如果你想把他们都称为自己以外的人,那么你需要做两件事:
1.parse_data应获取驱动程序和参数
def parse_data(driver)
1.在
goToUrl_Se()
内不能退出 selenium如果你真的想这么做,那就用OOP吧。如果您仍然不想这样做,那么您最好在任何函数之外启动
driver
名称,并使用函数来更改它。例如,您可以拥有一个仅更改驾驶员选项的功能。但是,当一个函数做多项工作时,这是不好的做法,比如您的goToUrl_Se()
函数。