首頁 > 軟體

python selenium引數詳解和實現案例

2022-10-26 14:01:33

無頭模式新增,可以讓selenium模擬登入,進入到後臺執行
這裡以登入開啟公司內網下載資料為例,因為涉及私密問題,所以有些地方我們進行覆蓋,還請諒解
先不新增無頭模式,進行登入,並且下載檔案
因為一般selenium使用的是之前版本的瀏覽器,所以會出現以下情況,需要進行安全認證,所以可以進行直接忽略認證書的錯誤

一般是在selenium的options進行新增

options.add_argument('ignore-certificate-errors')

可以看到上面有很多目錄點選過來的,要求下載所有的含有日報的excel,需進行小框選擇後,才會出現下載按鈕

下載一般是直接下載到瀏覽器預設的地址,這裡我們可以進行自主修改,還是在options裡進行設定,函數如下

# 設定預設地址
prefs = {'download.default_directory': r'D:desktoptest_download'}
options.add_experimental_option('prefs', prefs)

完整程式碼如下

# 匯入所需要的庫
import time
import json
import warnings
from selenium import webdriver
from sqlalchemy import create_engine
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 執行時terminal裡面會出現好多警告,剔除警告
warnings.filterwarnings('ignore')
class Download():
	def __init__(self, url, year, path, chrome, username, password, elements):
		self.year = year
		self.url = url
		self.path = path
		self.chrome = chrome
		self.username = username
		self.password = password
		self.elements = elements
	# 瀏覽器設定
	def web_sets(self):
		self.options = webdriver.ChromeOptions()
		# 因為我使用的是谷歌瀏覽器
		self.c_service = Service(f'{self.chrome}')
		self.c_service.command_line_args()
		# 設定後端伺服器開始,因為會在後臺產生好多服務,為了後面的關閉
		self.c_service.start()
		# 提供預設下載地址
		self.prefs = {'download.default_directory': f'{self.path}'}
		self.options.add_experimental_option('prefs', self.prefs)
		# 設定忽略安全證書所帶來的錯誤
		self.options.add_argument('ignore-certificate-errors')
		# 一些小的設定
		self.options.add_experimental_option('excludeSwitches', ["enable-automation"])
		self.options.add_argument('--np-sanbox')
		self.options.add_argument('--disable-dev-shm-usage')
		# 加屬性避免bug
		self.options.add_argument('disable-gpu')
		# 新增無頭模式
		self.options.add_argument('headless')
		self.br = webdriver.Chrome(f'{self.chrome}', chrome_options=self.options)
		self.br.implicitly_wait(3)
	def loginPage(self):
		"""
		因為我是將所有元素儲存在json檔案裡面,這樣就不需要因為find_element而佔用好多列
		也為程式碼節省地方
		這裡需要強調的時find_element(By.XPATH)是最新selenium的使用方法,之前的使用會報錯
		"""
		self.br.get(self.url)
		time.sleep(4)
		self.br.find_element(By.XPATH, f'{self.elements[keys[2]]}').send_keys(self.username)
		time.sleep(2)
		self.br.find_element(By.XPATH, f'{self.elements[keys[3]]}').send_keys(self.password)
		time.sleep(2)
		self.br.find_element(By.XPATH, f'{self.elements[keys[4]]}').click()
		time.sleep(2)
	# 設定跳轉到最後頁面
	def skipPage(self, url):
		self.br.get(url)
		time.sleep(2)

	# 下載檔案
	def download_excel(self):
		# 獲取所有ul下面的li標籤個數
		ul2 = self.br.find_element(By.XPATH, f'{self.elements[keys[6]]}')
		# 獲取li標籤數目
		lis2 = ul2.find_elements(By.XPATH, 'li')
		time.sleep(1)
		# 迴圈li標籤
		for j in range(len(lis2)):
			# 因為li的elements都是從1開始,python列表是從0開始,所以要+1
			j+=1
			# 獲取li標籤的text
			name = self.br.find_element(By.XPATH, f'{self.elements[keys[7]][1]}'%j).get_attribute('title')
			print(f'li標籤name: {name}')
			if '日報' in name:
				print(f'第二遍過濾name: {name}')
				li_test = self.br.find_element(By.XPATH, f'{self.elements[keys[8]]}'%j)
				self.br.execute_script('arguments[0].click();',li_test)
				time.sleep(0.5)
				self.br.find_element(By.XPATH, f'{self.elements[keys[9]]}').click()
				time.sleep(0.5)
				li_test2 = self.br.find_element(By.XPATH, f'{self.elements[keys[8]]}'%j)
				time.sleep(1)
				# 設定點選覆蓋,以防止報錯
				# 因為一直要模擬點選選擇檔案,然後進行下載檔案,防止點選覆蓋
				self.br.execute_script("arguments[0].click();", li_test2)
				time.sleep(8)
		time.sleep(10)
		time.sleep(12)
		# 退出瀏覽器,推出後臺服務
		# c_service.stop()對應之前的c_service.stop()
		self.br.quit();self.c_service.stop()

JSON檔案

ul標籤的展示

li標籤下的title

在這裡順便講下如何獲取xpath的絕對路徑或者相對路徑

展示下ul標籤相對路徑和絕對路徑

xpath: //*[@id="main"]/div[2]/div/div[3]/div[1]/as-dataview/div[2]/ul
full_xpath: /html/body/div[2]/div[1]/div[2]/div/div[1]/div[2]/div/div[3]/div[1]/as-dataview/div[2]/ul

下圖是沒有c_service.stop(),後臺執行服務,不能進行關閉

執行程式碼

if __name__ == '__main__':
	jsonFile = r'JsonFileelements.json'
	with open(jsonFile, 'r') as f:
		row_data = json.load(f)
	# 獲取所有json的鍵
	keys = list(row_data.keys())
	# 讀取賬號和密碼
	filename = row_data[keys[0]]
	# 獲取賬號和密碼txt
	with open(filename, 'r') as f:
		data = f.read()
	data1 = data.split('n')
	url = 'url'
	# chromedriver.exe
	chrome = r'chromedriver.exe'
	username = data1[0]
	password = data1[1]
	path = row_data[keys[1]]
	year = time.gmtime().tm_year
	start = Download(url, year, path, chrome, username, password, row_data)
	start.web_sets()
	start.loginWeb()
	e = row_data[keys[5]]
	start.skipPage(e)
	start.download_excel()
	time.sleep(15)

為了展示出來 取消掉無頭模式 這樣可以看到瀏覽器進行下載

可以看到只有含有’日報’的資料被下載了,並且工作管理員裡面沒有剛才出現的Chrome32的服務

到此這篇關於python selenium引數詳解和實現案例的文章就介紹到這了,更多相關python selenium引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com