代码自动下载chromedriver
注:以下浏览器举例皆为chrome
一、获取本机浏览器版本号
windows:通过注册表获取浏览器版本号,version为浏览器版本号
import winreg
string = r'Software\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96}'
handle = winreg.OpenKey(winreg.HKEY_CURRENT_USER, string, 0, (winreg.KEY_WOW64_64KEY + winreg.KEY_READ))
local_version, _type = winreg.QueryValueEx(handle, "pv")
mac:通过bash命令获取 version
cmd = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version '
m = os.popen(cmd)
result = m.readlines()[0].split(' ')
local_version = result[2]
m.close()
二、获取driver的所有版本
国内镜像源地址:
home_url=http://npm.taobao.org/mirrors/chromedriver/
国外镜像源地址:
web页面地址为:http://chromedriver.storage.googleapis.com/index.html
abroad_url=http://chromedriver.storage.googleapis.com/?delimiter=/&prefix=
获取所有版本
response = requests.get(url)
pattern = re.compile('<Prefix>(\d.*?)/</Prefix>')
raw_version_list = re.findall(pattern=pattern, string=response.text)
三、匹配版本
法一:只匹配前三位版本号,最后一个不匹配最接近的版本
version_re = re.compile(r'^[1-9]\d*\.\d*.\d*') # 匹配前3位版本号的正则表达式
match_list = []
for i in raw_version_list:
raw_v = version_re.findall(i)[0] #前3位的版本号
local_v=version_re.findall(local_version)[0]
if local_v == raw_v:
match_list.append(i)
driver_version=match_list[-1] #取列表中的最后一个
法二:匹配本机浏览器版本与driver版本最接近的版本
chrome_major_version, chrome_minor_version = local_version.rsplit('.', 1)
for version in raw_version_list:
major_version, minor_version = version.rsplit('.', 1)
if chrome_major_version == major_version:
candidate_minor_version_list.append(minor_version)
target_minor_version = candidate_minor_version_list[0]
for current_minor_version in candidate_minor_version_list[1:]:
if abs(int(current_minor_version) - int(chrome_minor_version)) \
< abs(int(target_minor_version) - int(chrome_minor_version)):
target_minor_version = current_minor_version
driver_version = chrome_major_version + '.' + target_minor_version
四、下载driver
def _download_driver(self, driver_version):
# step 1: download webdriver.zip
if PLATFORM_SYSTEM == 'windows':
remote_driver_path = "http://chromedriver.storage.googleapis.com/%s/chromedriver_win32.zip" % driver_version
local_driver_path = os.path.join(self._driver_save_path, "chromedriver.exe")
elif PLATFORM_SYSTEM == 'darwin':
remote_driver_path = "http://chromedriver.storage.googleapis.com/%s/chromedriver_mac64.zip" % driver_version
local_driver_path = os.path.join(self._driver_save_path, "chromedriver")
else:
raise ValueError('platform {} is not supported'.format(PLATFORM_SYSTEM))
filename = os.path.basename(remote_driver_path)
driver_path = os.path.join(self._driver_save_path, filename)
with open(driver_path, "ab") as f:
download_resp = requests.get(remote_driver_path)
f.write(download_resp.content)
# step 2: unzip
shutil.unpack_archive(driver_path, os.path.dirname(driver_path))
os.chmod(local_driver_path, 0o777)
补充:
目前python已经有第三方库,可自动下载管理driver
pip install webdriver_manager
使用参考
from webdriver_manager.chrome import ChromeDriverManager
driver=webdriver.Chrome(ChromeDriverManager().install())