近期需要使用Chrome访问网页,并通过browser_cookie3需要提取其Cookie作为登录验证,之前113版本的Chrome浏览器写的代码都可以正常运行,但最近总是错误频发,总不能正常运行。甚是头疼。
注:Chrome浏览器换成Edge浏览器后,正常了一段时间,后来Edge浏览器也出现报错,后改为Firefox正常。建议正常后将浏览器的自动更新关闭。目前Firefox浏览器版本为116.0.3 (64 位)。
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 1165, in chrome
return Chrome(cookie_file, domain_name, key_file).load()
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 494, in load
with _DatabaseConnetion(self.cookie_file) as con:
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 352, in __enter__
return self.get_connection()
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 388, in get_connection
con = method()
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 379, in __get_connection_legacy
shutil.copyfile(self.__database_file, self.__temp_cookie_file)
File "D:\ProgramData\anaconda3\lib\shutil.py", line 254, in copyfile
with open(src, 'rb') as fsrc:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Administrator\\AppData\\Roaming\\..\\Local\\Google\\Chrome\\User Data\\Default\\Network\\Cookies'
经研究,browser_cookie3的库文件__init__.py,将以下代码调整顺序放到第三
genararated_paths.append(
{'env': 'APPDATA', 'path': '..\\Local\\' + path.format(channel=chan)})
最终如下:
def _genarate_win_paths_chromium(paths: Union[str, list], channel: Union[str, list] = None):
"""Generate paths for chromium based browsers on windows"""
paths, channel = _normalize_genarate_paths_chromium(paths, channel)
genararated_paths = []
for chan in channel:
for path in paths:
# genararated_paths.append(
# {'env': 'APPDATA', 'path': '..\\Local\\' + path.format(channel=chan)})
genararated_paths.append(
{'env': 'LOCALAPPDATA', 'path': path.format(channel=chan)})
genararated_paths.append(
{'env': 'APPDATA', 'path': path.format(channel=chan)})
genararated_paths.append(
{'env': 'APPDATA', 'path': '..\\Local\\' + path.format(channel=chan)})
# print(genararated_paths)
return genararated_paths
路径是正确了,可依旧提示访问被拒绝!
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 1237, in load
for cookie in cookie_fn(domain_name=domain_name):
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 1164, in chrome
return Chrome(cookie_file, domain_name, key_file).load()
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 493, in load
with _DatabaseConnetion(self.cookie_file) as con:
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 351, in __enter__
return self.get_connection()
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 387, in get_connection
con = method()
File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 378, in __get_connection_legacy
shutil.copyfile(self.__database_file, self.__temp_cookie_file)
File "D:\ProgramData\anaconda3\lib\shutil.py", line 254, in copyfile
with open(src, 'rb') as fsrc:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Network\\Cookies'
con = sqlite3.connect(filename)
sqlite3.OperationalError: unable to open database file
尝试了多个方法,修改了很多代码,问题依旧。
经多日研究,发现shutil.copyfile复制文件时就出现了问题(排除网上因为目标地址是目录不是文件名而产生的报错),因为Cookies文件被Chrome浏览器打开,在占用状态是无法完成复制的。当然直接打开也是不允许的,故sqlite也无法进行Cookie的读取。
由于Chrome浏览器自动更新到114版本,对Cookies文件进行了打开占用,致使无法通过其它方法进行访问。
这个问题找到了,解决办法也就清楚了。
1、变更到老版本(113版本)的Chrome浏览器。但一定要禁止自动更新,否则一升级问题依旧。
2、将访问代码切换到browser_cookie3支持的其它浏览器。
这里笔者改为Microsoft Edge或者Firefox浏览器,代码修改如下:
#cookies = browser_cookie3.chrome(domain_name='xxxx')
cookies = browser_cookie3.edge(domain_name='xxxx')
cookies = browser_cookie3.firefox(domain_name='xxxx')
至此,问题解决。
最后,通过pip install browser_cookie3 -U 将库更新到最新版本,访问正常。
(base) C:\Users\Administrator>pip install browser_cookie3 -U
Requirement already satisfied: browser_cookie3 in d:\programdata\anaconda3\lib\site-packages (0.19.0)
Collecting browser_cookie3
Using cached browser_cookie3-0.19.1-py3-none-any.whl (14 kB)
Requirement already satisfied: pycryptodomex in d:\programdata\anaconda3\lib\site-packages (from browser_cookie3) (3.17)
Requirement already satisfied: lz4 in d:\programdata\anaconda3\lib\site-packages (from browser_cookie3) (3.1.3)
Installing collected packages: browser_cookie3
Attempting uninstall: browser_cookie3
Found existing installation: browser-cookie3 0.19.0
Uninstalling browser-cookie3-0.19.0:
Successfully uninstalled browser-cookie3-0.19.0
Successfully installed browser_cookie3-0.19.1
虽然解决方法很简单,过程中却经历了各种折腾,但也对浏览器、操作系统等有了更深的认识。
尽管在程序调试中出现一下问题,但也证明Chrome浏览器在安全方面更强一些。
另外就是解决问题就和解方程一样,一条路不通,可以换一条路。也许问题很快就可以解决!
debug虽然有时候很烦人,不过,这也是编程的乐趣之一!