设置headers时可接收文本格式,待测试

This commit is contained in:
g1879 2024-03-04 23:38:50 +08:00
parent e68b415edd
commit b51b2b14fe
10 changed files with 39 additions and 18 deletions

View File

@ -11,7 +11,7 @@ from requests import Session
from requests.structures import CaseInsensitiveDict from requests.structures import CaseInsensitiveDict
from .options_manage import OptionsManager from .options_manage import OptionsManager
from .._functions.web import cookies_to_tuple, set_session_cookies from .._functions.web import cookies_to_tuple, set_session_cookies, format_headers
class SessionOptions(object): class SessionOptions(object):
@ -171,6 +171,7 @@ class SessionOptions(object):
self._headers = None self._headers = None
self._del_set.add('headers') self._del_set.add('headers')
else: else:
headers = format_headers(headers)
self._headers = {key.lower(): headers[key] for key in headers} self._headers = {key.lower(): headers[key] for key in headers}
return self return self

View File

@ -49,7 +49,7 @@ class SessionOptions(object):
@property @property
def headers(self) -> dict: ... def headers(self) -> dict: ...
def set_headers(self, headers: Union[dict, None]) -> SessionOptions: ... def set_headers(self, headers: Union[dict, str, None]) -> SessionOptions: ...
def set_a_header(self, name: str, value: str) -> SessionOptions: ... def set_a_header(self, name: str, value: str) -> SessionOptions: ...

View File

@ -37,14 +37,15 @@ class SessionElement(DrissionElement):
attrs = [f"{k}='{v}'" for k, v in self.attrs.items()] attrs = [f"{k}='{v}'" for k, v in self.attrs.items()]
return f'<SessionElement {self.tag} {" ".join(attrs)}>' return f'<SessionElement {self.tag} {" ".join(attrs)}>'
def __call__(self, locator, timeout=None): def __call__(self, locator, index=1, timeout=None):
"""在内部查找元素 """在内部查找元素
ele2 = ele1('@id=ele_id') ele2 = ele1('@id=ele_id')
:param locator: 元素的定位信息可以是loc元组或查询字符串 :param locator: 元素的定位信息可以是loc元组或查询字符串
:param index: 第几个元素从1开始可传入负数获取倒数第几个
:param timeout: 不起实际作用 :param timeout: 不起实际作用
:return: SessionElement对象或属性文本 :return: SessionElement对象或属性文本
""" """
return self.ele(locator) return self.ele(locator, index=index)
def __eq__(self, other): def __eq__(self, other):
return self.xpath == getattr(other, 'xpath', None) return self.xpath == getattr(other, 'xpath', None)

View File

@ -394,3 +394,18 @@ def tree(ele_or_page):
attrs = ' '.join([f"{k}='{v}'" for k, v in ele.attrs.items()]) attrs = ' '.join([f"{k}='{v}'" for k, v in ele.attrs.items()])
print(f'<{ele.tag} {attrs}>'.replace('\n', ' ')) print(f'<{ele.tag} {attrs}>'.replace('\n', ' '))
_tree(ele) _tree(ele)
def format_headers(txt):
"""从浏览器复制的文本生成dict格式headers文本用换行分隔
:param txt: 从浏览器复制的原始文本格式headers
:return: dict格式headers
"""
if not isinstance(txt, str):
return txt
headers = {}
for header in txt.split('\n'):
if header:
name, value = header.split(': ', maxsplit=1)
headers[name] = value
return headers

View File

@ -52,4 +52,7 @@ def is_cookie_in_driver(page: ChromiumBase, cookie: dict) -> bool: ...
def get_blob(page: ChromiumBase, url: str, as_bytes: bool = True) -> bytes: ... def get_blob(page: ChromiumBase, url: str, as_bytes: bool = True) -> bytes: ...
def tree(ele_or_page:BaseParser) -> None: ... def tree(ele_or_page: BaseParser) -> None: ...
def format_headers(txt: str) -> dict: ...

View File

@ -17,7 +17,7 @@ from tldextract import extract
from .._base.base import BasePage from .._base.base import BasePage
from .._configs.session_options import SessionOptions from .._configs.session_options import SessionOptions
from .._elements.session_element import SessionElement, make_session_ele from .._elements.session_element import SessionElement, make_session_ele
from .._functions.web import cookie_to_dict from .._functions.web import cookie_to_dict, format_headers
from .._units.setter import SessionPageSetter from .._units.setter import SessionPageSetter
@ -293,7 +293,7 @@ class SessionPage(BasePage):
if 'headers' not in kwargs: if 'headers' not in kwargs:
kwargs['headers'] = {} kwargs['headers'] = {}
else: else:
kwargs['headers'] = CaseInsensitiveDict(kwargs['headers']) kwargs['headers'] = CaseInsensitiveDict(format_headers(kwargs['headers']))
# 设置referer和host值 # 设置referer和host值
parsed_url = urlparse(url) parsed_url = urlparse(url)

View File

@ -79,7 +79,7 @@ class SessionPage(BasePage):
params: dict | None = ..., params: dict | None = ...,
data: Union[dict, str, None] = ..., data: Union[dict, str, None] = ...,
json: Union[dict, str, None] = ..., json: Union[dict, str, None] = ...,
headers: dict | None = ..., headers: Union[dict, str, None] = ...,
cookies: Any | None = ..., cookies: Any | None = ...,
files: Any | None = ..., files: Any | None = ...,
auth: Any | None = ..., auth: Any | None = ...,
@ -140,7 +140,7 @@ class SessionPage(BasePage):
timeout: float | None = ..., timeout: float | None = ...,
params: dict | None = ..., params: dict | None = ...,
json: Union[dict, str, None] = ..., json: Union[dict, str, None] = ...,
headers: dict | None = ..., headers: Union[dict, str, None] = ...,
cookies: Any | None = ..., cookies: Any | None = ...,
files: Any | None = ..., files: Any | None = ...,
auth: Any | None = ..., auth: Any | None = ...,

View File

@ -90,7 +90,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
params: dict | None = ..., params: dict | None = ...,
data: Union[dict, str, None] = ..., data: Union[dict, str, None] = ...,
json: Union[dict, str, None] = ..., json: Union[dict, str, None] = ...,
headers: dict | None = ..., headers: Union[dict, str, None] = ...,
cookies: Any | None = ..., cookies: Any | None = ...,
files: Any | None = ..., files: Any | None = ...,
auth: Any | None = ..., auth: Any | None = ...,
@ -151,7 +151,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
timeout: float | None = ..., timeout: float | None = ...,
params: dict | None = ..., params: dict | None = ...,
json: Union[dict, str, None] = ..., json: Union[dict, str, None] = ...,
headers: dict | None = ..., headers: Union[dict, str, None] = ...,
cookies: Any | None = ..., cookies: Any | None = ...,
files: Any | None = ..., files: Any | None = ...,
auth: Any | None = ..., auth: Any | None = ...,

View File

@ -12,6 +12,7 @@ from requests.structures import CaseInsensitiveDict
from .cookies_setter import SessionCookiesSetter, CookiesSetter, WebPageCookiesSetter from .cookies_setter import SessionCookiesSetter, CookiesSetter, WebPageCookiesSetter
from .._functions.tools import show_or_hide_browser from .._functions.tools import show_or_hide_browser
from .._functions.web import format_headers
class BasePageSetter(object): class BasePageSetter(object):
@ -134,13 +135,13 @@ class ChromiumBaseSetter(BasePageSetter):
files = (files, ) files = (files, )
self._page._upload_list = [str(Path(i).absolute()) for i in files] self._page._upload_list = [str(Path(i).absolute()) for i in files]
def headers(self, headers: dict) -> None: def headers(self, headers) -> None:
"""设置固定发送的headers """设置固定发送的headers
:param headers: dict格式的headers数据 :param headers: dict格式的headers数据
:return: None :return: None
""" """
self._page.run_cdp('Network.enable') self._page.run_cdp('Network.enable')
self._page.run_cdp('Network.setExtraHTTPHeaders', headers=headers) self._page.run_cdp('Network.setExtraHTTPHeaders', headers=format_headers(headers))
def auto_handle_alert(self, on_off=True, accept=True): def auto_handle_alert(self, on_off=True, accept=True):
"""设置是否启用自动处理弹窗 """设置是否启用自动处理弹窗
@ -293,7 +294,7 @@ class SessionPageSetter(BasePageSetter):
:param headers: dict形式的headers :param headers: dict形式的headers
:return: None :return: None
""" """
self._page._headers = CaseInsensitiveDict(headers) self._page._headers = CaseInsensitiveDict(format_headers(headers))
def header(self, name, value): def header(self, name, value):
"""设置headers中一个项 """设置headers中一个项

View File

@ -58,7 +58,7 @@ class ChromiumBaseSetter(BasePageSetter):
def local_storage(self, item: str, value: Union[str, bool]) -> None: ... def local_storage(self, item: str, value: Union[str, bool]) -> None: ...
def headers(self, headers: dict) -> None: ... def headers(self, headers: Union[dict, str]) -> None: ...
def auto_handle_alert(self, on_off: bool = True, accept: bool = True) -> None: ... def auto_handle_alert(self, on_off: bool = True, accept: bool = True) -> None: ...
@ -111,7 +111,7 @@ class SessionPageSetter(BasePageSetter):
def encoding(self, encoding: Union[str, None], set_all: bool = True) -> None: ... def encoding(self, encoding: Union[str, None], set_all: bool = True) -> None: ...
def headers(self, headers: dict) -> None: ... def headers(self, headers: Union[str, dict]) -> None: ...
def header(self, name: str, value: str) -> None: ... def header(self, name: str, value: str) -> None: ...
@ -145,7 +145,7 @@ class WebPageSetter(ChromiumPageSetter):
def user_agent(self, ua: str, platform: str = None) -> None: ... def user_agent(self, ua: str, platform: str = None) -> None: ...
def headers(self, headers: dict) -> None: ... def headers(self, headers: Union[str, dict]) -> None: ...
@property @property
def cookies(self) -> WebPageCookiesSetter: ... def cookies(self) -> WebPageCookiesSetter: ...
@ -158,7 +158,7 @@ class WebPageTabSetter(TabSetter):
def user_agent(self, ua: str, platform: str = None) -> None: ... def user_agent(self, ua: str, platform: str = None) -> None: ...
def headers(self, headers: dict) -> None: ... def headers(self, headers: Union[str, dict]) -> None: ...
@property @property
def cookies(self) -> WebPageCookiesSetter: ... def cookies(self) -> WebPageCookiesSetter: ...