diff --git a/DrissionPage/config.py b/DrissionPage/config.py index 7af5f54..998f7d3 100644 --- a/DrissionPage/config.py +++ b/DrissionPage/config.py @@ -15,8 +15,11 @@ from selenium.webdriver.chrome.options import Options class OptionsManager(object): """管理配置文件内容的类""" + def __init__(self, path: str = None): - """初始化,读取配置文件,如没有设置临时文件夹,则设置并新建""" + """初始化,读取配置文件,如没有设置临时文件夹,则设置并新建 + :param path: ini文件的路径,默认读取模块文件夹下的 + """ self.path = path or Path(__file__).parent / 'configs.ini' self._conf = ConfigParser() self._conf.read(self.path, encoding='utf-8') @@ -46,13 +49,17 @@ class OptionsManager(object): option[j[0]] = self._conf.get(section, j[0]) return option - def set_item(self, section: str, item: str, value: str): + def set_item(self, section: str, item: str, value: str) -> None: """设置配置值""" self._conf.set(section, item, str(value)) - def save(self): - """保存配置文件""" - self._conf.write(open(self.path, 'w')) + def save(self, path: str = None) -> None: + """保存配置文件 + :param path: ini文件的路径,默认保存到模块文件夹下的 + :return: None + """ + path = path or Path(__file__).parent / 'configs.ini' + self._conf.write(open(path, 'w')) class DriverOptions(Options): @@ -68,25 +75,28 @@ class DriverOptions(Options): 'experimental_options'] if 'experimental_options' in options_dict else {} self._debugger_address = options_dict['debugger_address'] if 'debugger_address' in options_dict else None - def save(self): - """保存设置到文件""" + def save(self, path: str = None) -> None: + """保存设置到文件 + :param path: ini文件的路径,默认保存到模块文件夹下的 + :return: None + """ om = OptionsManager() options = _chrome_options_to_dict(self) for i in options: om.set_item('chrome_options', i, options[i]) - om.save() + om.save(path) - def remove_argument(self, value: str): + def remove_argument(self, value: str) -> None: """移除一个设置""" if value in self._arguments: self._arguments.remove(value) - def remove_experimental_option(self, key: str): + def remove_experimental_option(self, key: str) -> None: """移除一个实验设置,传入key值删除""" if key in self._experimental_options: self._experimental_options.pop(key) - def remove_all_extensions(self): + def remove_all_extensions(self) -> None: """移除所有插件 因插件是以整个文件储存,难以移除其中一个,故如须设置则全部移除再重设""" self._extensions = [] diff --git a/DrissionPage/configs.ini b/DrissionPage/configs.ini index f7ab093..d70e3c2 100644 --- a/DrissionPage/configs.ini +++ b/DrissionPage/configs.ini @@ -1,65 +1,31 @@ [paths] -;chromedriver_path = D:\python\Google Chrome\Chrome\chromedriver81.exe -chromedriver_path = D:\python\Google Chrome\Chrome\chromedriver.exe -global_tmp_path = D:\python\projects\fsjy\upload_news\DrissionPage\tmp +chromedriver_path = +global_tmp_path = [chrome_options] debugger_address = -;127.0.0.1:9222 -;binary_location = C:\Program Files (x86)\Google\Chrome\Application\chrome.exe -binary_location = D:\python\Google Chrome\Chrome\chrome.exe +binary_location = arguments = [ - ; 隐藏浏览器窗口 - '--headless', - ; 静音 - '--mute-audio', - ; 不使用沙盒 - '--no-sandbox', - ; 不加载图片 - ; '--blink-settings=imagesEnabled=false', - ; 指定用户文件夹路径 - ; r'--user-data-dir="E:\tmp\chrome_tmp"', - ; 指定缓存路径 - ; '-–disk-cache-dir=""', - ; 编码格式 - 'zh_CN.UTF-8', - ; 设置代理 - ; "--proxy-server=http://127.0.0.1:1081", - ; 隐藏滚动条 - ; '--hide-scrollbars', - ; 浏览器窗口最大化 - ; '--start-maximized', - ; 禁用JavaScript - ; "--disable-javascript", - ; 模拟移动设备 - ; 'user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"', - ; 谷歌文档提到需要加上这个属性来规避bug - '--disable-gpu' - ] + '--headless', + '--no-sandbox', + '--disable-gpu' + ] extensions = [] experimental_options = { - 'prefs': { - ; 设置下载路径 - 'download.default_directory': r'D:\python\projects\fsjy\upload_news\DrissionPage\tmp', - ; 下载不弹出窗口 - 'profile.default_content_settings.popups': 0, - ; 无弹窗 - 'profile.default_content_setting_values': {'notifications': 2}, - ; 禁用PDF插件 - 'plugins.plugins_list': [{"enabled": False, "name": "Chrome PDF Viewer"}], - ; 设置为开发者模式,防反爬虫(无用) - 'excludeSwitches': ["ignore-certificate-errors", "enable-automation"], - 'useAutomationExtension': False - } - } + 'prefs': { + 'profile.default_content_settings.popups': 0, + 'profile.default_content_setting_values': {'notifications': 2}, + 'plugins.plugins_list': [{"enabled": False, "name": "Chrome PDF Viewer"}], + 'excludeSwitches': ["ignore-certificate-errors", "enable-automation"], + 'useAutomationExtension': False + } + } [session_options] headers = { - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - "Accept-Language": "zh-cn", - "Connection": "keep-alive", - "Accept-Charset": "GB2312,utf-8;q=0.7,*;q=0.7" - } -;proxies = { "http": "127.0.0.1:8888", "https": "http://127.0.0.1:8888" } + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Connection": "keep-alive", + "Accept-Charset": "utf-8;q=0.7,*;q=0.7" + } diff --git a/README.md b/README.md index 352e41c..d2916d1 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,13 @@ DrissionPage,即driver和session的合体。 除了合并两者,本库还以网页为单位封装了常用功能,简化了selenium的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。 +**项目地址:** + +- https://github.com/g1879/DrissionPage +- https://gitee.com/g1879/DrissionPage + +**联系邮箱:**g1879@qq.com + # 特性 *** @@ -234,41 +241,80 @@ element.location # 元素位置 ## 保存配置 -因chrome和headers配置繁多,故设置一个ini文件专门用于保存常用配置,你可使用OptionsManager对象获取和保存配置,用DriverOptions对象修改chrome配置。 +因chrome和headers配置繁多,故设置一个ini文件专门用于保存常用配置,你可使用OptionsManager对象获取和保存配置,用DriverOptions对象修改chrome配置。你也可以保存多个ini文件,按不同项目须要调用。 ### ini文件内容 -ini文件默认拥有三部分配置:paths、chrome_options、session_options。 +ini文件默认拥有三部分配置:paths、chrome_options、session_options,初始内容如下。 ```ini [paths] -chromedriver_path = ; chromedriver.exe路径 -global_tmp_path = +chromedriver_path = ; 临时文件夹路径,用于保存截图、文件下载等 +global_tmp_path = [chrome_options] -debugger_address = ; 已打开的浏览器地址和端口,如127.0.0.1:9222 -binary_location = +debugger_address = ; chrome.exe路径 -arguments = [] -; 配置信息,如'--headless', -extensions = [] +binary_location = +; 配置信息 +arguments = [ + ; 隐藏浏览器窗口 + '--headless', + ; 静音 + '--mute-audio', + ; 不使用沙盒 + '--no-sandbox', + ; 谷歌文档提到需要加上这个属性来规避bug + '--disable-gpu' + ] ; 插件 -experimental_options = {} +extensions = [] ; 实验性配置 +experimental_options = { + 'prefs': { + ; 下载不弹出窗口 + 'profile.default_content_settings.popups': 0, + ; 无弹窗 + 'profile.default_content_setting_values': {'notifications': 2}, + ; 禁用PDF插件 + 'plugins.plugins_list': [{"enabled": False, "name": "Chrome PDF Viewer"}], + ; 设置为开发者模式,防反爬虫(无用) + 'excludeSwitches': ["ignore-certificate-errors", "enable-automation"], + 'useAutomationExtension': False + } + } [session_options] headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - "Accept-Language": "zh-cn", "Connection": "keep-alive", - "Accept-Charset": "GB2312,utf-8;q=0.7,*;q=0.7" + "Accept-Charset": "utf-8;q=0.7,*;q=0.7" } ``` +### 使用示例 + +```python +from DrissionPage import * +from DrissionPage.configs import * + +driver_options = DriverOptions() # 从默认ini文件读取配置 +driver_options = DriverOptions('D:\\settings.ini') # 从传入的ini文件读取配置 +driver_options.add_argument('--headless') # 添加配置 +driver_options.remove_experimental_options('prefs') # 移除配置 +driver_options.save() # 保存配置 +driver_options.save('D:\\settings.ini') # 保存到其它路径 + +options_manager = OptionsManager() # 创建OptionsManager对象 +driver_path = options_manager.get_value('paths', 'chromedriver_path') # 读取路径信息 + +drission = Drission(driver_options, driver_path) # 使用配置创建Drission对象 +``` + ### OptionsManager对象 OptionsManager对象用于读取、设置和保存配置。 @@ -277,9 +323,12 @@ OptionsManager对象用于读取、设置和保存配置。 get_value(section, item) -> str # 获取某个配置的值 get_option(section) -> dict # 以字典格式返回配置全部属性 set_item(section, item, value) # 设置配置属性 -save() # 保存配置到ini文件 +save() # 保存配置到默认ini文件 +save('D:\\settings.ini') # 保存到其它路径 ``` +**注意**:保存时若不传入路径,会保存到模块目录下的ini文件,即使读取的不是默认ini文件也一样。 + ### DriverOptions对象 DriverOptions对象继承自selenium.webdriver.chrome.options的Options对象,在其基础上增加了以下方法: @@ -289,24 +338,9 @@ remove_argument(value) # 删除某argument值 remove_experimental_option(key) # 删除某experimental_option设置 remove_all_extensions() # 删除全部插件 save() # 保存配置到ini文件 +save('D:\\settings.ini') # 保存到其它路径 ``` -### 使用示例 - -```python -from DrissionPage import * -from DrissionPage.configs import * - -driver_options = DriverOptions() # 默认从ini文件读取配置 -driver_options.add_argument('--headless') # 添加配置 -driver_options.remove_experimental_options('prefs') # 移除配置 -driver_options.save() # 保存配置 - -options_manager = OptionsManager() # 创建OptionsManager对象 -driver_path = options_manager.get_value('paths', 'chromedriver_path') # 读取路径信息 - -drission = Drission(driver_options, driver_path) # 使用配置创建Drission对象 -``` # PO模式 @@ -1127,10 +1161,14 @@ session模式的元素对象,包装了一个Element对象,并封装了常用 ### save -​ save() -> None +​ save(path: str = None) -> None ​ 保存设置到文件。 +​ 参数说明: + +- path - ini文件的路径,默认保存到模块文件夹下的 + ## DriverOptions类 @@ -1171,6 +1209,10 @@ session模式的元素对象,包装了一个Element对象,并封装了常用 ### save() -​ save() -> None +​ save(path: str = None) -> None ​ 保存设置到文件。 + +​ 参数说明: + +- path - ini文件的路径,默认保存到模块文件夹下的 \ No newline at end of file