$ pip install requests-html
只支持python3.6及以上
构造一个访问python.org的GET请求,从源码可以知道其实是使用requests的get方法
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://python.org/')
# 响应对象 = session.request(......)
# 响应对象 = session.get(......)
# 响应对象 = session.post(......)
r1 = session.get('https://python.org/')
# 相当于
r2 = requests.get('https://python.org/')
所以,r1和r2属性参数都是一样的,都可以使用r.url r.text等属性方法,跟requests模块使用方法是一样的,因为其内部是使用requests模块的。
2.HTMLSession()的参数
session = HTMLSession(
browser_args=[
'--no-sand', # 沙箱环境
'--user-agent=XXXXX' # 自定义UA
],
headless=False # 需要修改源码才能设置该参数,默认不能启动浏览器模拟,改了之后设置headless=False就可以模拟
)
headless源码修改:
--->HTMLSession---->BaseSession
在BaseSession的__init__
方法添加一个关键字参数headless=True
,再实例化对象添加多一个参数self.__headless = headless
在BaseSession的browser方法的返回对象self._browser
实例化传入该参数即可
注意:如果想要模拟启动浏览器,必须执行r.html.render()方法
r.html事实上就是一个解析后的html对象,是基于HTML类的
from requests_html import HTML
??? 页面上所有可被获取到的超链接,都会被转成绝对路径形式。
??? 页面的基准URL,支持``标签(了解更多)。
??? 用于编码 从HTML和html响应头中提取的内容进行编码的格式
find(selector: str = ‘‘, , containing: Union[str, typing.List[str]] = None, clean: bool = False, first: bool = False,_encoding: str = None) → Union[typing.List[_ForwardRef(‘Element‘)], _ForwardRef(‘Element‘)]
接收一个css选择器参数,返回一个Element对象或Element对象组成的列表。
*参数说明*:
和
是否进行处理CSS选择器示例:
查看CSS选择器的更多详细内容
如果first
参数被置为True
, 则只返回找到的第一个Element对象
??? 返回Element对象或HTML中的所有文本(包括链接)
??? 返回Unicode行式的HTML内容(了解更多)
??? 返回页面所有链接,并保留链接的原本形式
??? 返回lxml行式的HTML内容或lxml对象
??? 返回PyQuery行式的HTML内容
??? 返回字节行式的HTML内容(了解更多)
render(retries: int = 8, script: str = None, wait: float = 0.2, scrolldown=False, sleep: int = 0, reload: bool = True, timeout: Union[float, int] = 8.0, keep_page: bool = False)
???执行JavaScript,在Chromium里重新加载响应,并用最新获取到的HTML替换掉原来的HTML。
? r.html.render() 首次执行该方法是,模块会检查依赖,并下载chromium,chromium是什么鬼,看起来很像chrome?
搞过selenium的应该知道,这里简单对比下chrome和chromium:
Chromium是谷歌的开源项目,开发者们可以共同去改进它,然后谷歌会收集改进后的Chromium并发布改进后安装包。Chrome不是开源项目,谷歌会把Chromium的东西更新到Chrome中。你也可以这么理解Chromium是体验版,Chrome是正式版;
Chromium不用安装,下载下来的是压缩包,解压后直接就可以使用。Chrome需要安装;
Chromium功能比Chrome多,因为新功能都是先在Chromium中使用,等完善后才添加到Chrome中。相对的Chrome就要比Chromium稳定很多不容易出错;
Chromium不开放自动更新功能,所以用户需手动下载更新,而Chrome则可自动连上Google的服务器更新,但新版的推出很慢。
*参数说明*:
render
初始化后,程序会暂停n秒r.html.page
与浏览器页面交互如果scrolldown
和sleep
都指定,那么程序会在暂停相应时间后,再往后翻页面(如:scrolldown=10, sleep=1
)
如果仅指定了sleep
,程序会暂停相应时间,再返回数据
如果指定script
,他将会在运行时执行提供的JavaScript。如:
script = """
() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}
"""
返回一段JavaScript的返回值:
>>> r.html.render(script=script)
{'width': 800, 'height': 600, 'deviceScaleFactor': 1}
??? *警告*:如果你使用keep_page
, 你最好关闭已经使用过的页面,如果打开过多页面会造成浏览器崩溃。
??? *警告*:如果你第一次运行这个方法,它将会下载Chromium保存在你的家目录下。
最后,因为在爬虫中,我们使用了webdriver,浏览器会默认识别到,会去告诉服务器我们是webdriver,会进行反爬措施,所以我们需要,关掉浏览器的识别,加入下面这条js代码即可
绕过网站对webdriver的检测:
'''
() =>{
Object.defineProperties(navigator,{
webdriver:{
get: () => undefined
}
})
}
'''
**search*(template: str*) → parse.Result
??? 根据传入的模板参数,查找Element对象
参数说明:
search_all(template: str) → Union[typing.List[_ForwardRef(‘Result‘)], _ForwardRef(‘Result‘)]
??? 根据传入的模板参数,查找所有的Element对象
参数说明:
xpath(selector: str, *, clean: bool = False, first: bool = False, _encoding: str = None) → Union[typing.List[str], typing.List[_ForwardRef(‘Element‘)], str, _ForwardRef(‘Element‘)]
??? 传入一个XPath选择器参数,返回所有的Element对象
*参数说明*:
和
是否进行处理如果指定了一个子选择器(如://a/@href
),将返回一个简单的结果列表
查看更多细节Xpath示例
如果first
参数被置为True
, 则只返回找到的第一个Element对象
class requests_html.Element(*, element, url: str, default_encoding: str = None) → None ??源码
HTML的一个element对象。
*参数说明*:
absolute_links
函数会调用该参数??? 返回一个字典,该字典包括Element对象的所有html属性。
??? 页面上所有可被获取到的超链接,都会被转成绝对路径形式。
??? 页面的基准URL,支持``标签(了解更多)。
??? 用于编码从HTML和html响应头中提取的内容
**find*(selector: str = ‘‘, *, containing: Union[str, typing.List[str]] = None, clean: bool = False, first: bool = False,_encoding: str = None) → Union[typing.List[_ForwardRef(‘Element‘)], _ForwardRef(‘Element‘)]
接收一个css选择器参数,返回一个Element对象或Element对象组成的列表。
参数说明:
和
是否进行处理CSS选择器示例:
查看CSS选择器的更多详细内容
如果first
参数被置为True
, 则只返回找到的第一个Element对象
??? 返回Element对象或HTML中的所有文本(包括链接)
??? 返回Unicode行式的HTML内容(了解更多)
??? 返回页面所有链接,并保留链接的原本形式
??? 返回lxml行式的HTML内容
??? 返回PyQuery行式的HTML内容
??? 返回字节行式的HTML内容(了解更多)
search(template: str) → parse.Result
??? 根据传入的模板参数,查找Element对象
*参数说明*:
search_all(template: str) → Union[typing.List[_ForwardRef(‘Result‘)], _ForwardRef(‘Result‘)]
??? 根据传入的模板参数,查找所有的Element对象
*参数说明*:
??? 返回Element对象或HTML对象的文本内容(不包含html标签)
xpath(selector: str, *, clean: bool = False, first: bool = False, _encoding: str = None) → Union[typing.List[str], typing.List[_ForwardRef(‘Element‘)], str, _ForwardRef(‘Element‘)]
??? 传入一个XPath选择器参数,返回所有的Element对象
*参数说明*:
和
是否进行处理如果指定了一个子选择器(如://a/@href
),将返回一个简单的结果列表
查看更多细节Xpath示例
如果first
参数被置为True
, 则只返回找到的第一个Element对象
*requests_html.user_agent*(style=None) → str ?? 源码
返回一个指定风格的合法的用户代理,默认是Chrome风格的用户代理
这些sessions用于构造http请求。
class requests_html.HTMLSession(mock_browser=True) ?? 源码
它是一个可被销毁的session,可用于cookie持久化和连接池,以及其他地方。
??? 关闭一个已经被创建的浏览器
??? 发送一个DELETE请求,返回一个Response
对象
??? *参数说明*:
请求对象
的URLrequest
携带的参数(可选)??? *返回类型*:
??? ??? requests.Response
??? 返回指定url的一个合适的连接适配器
??? *返回类型*:
??? requests.adapters.BaseAdapter
??? 接收一个响应,返回重定向后的URL或none
??? 发送一个HEAD请求,返回一个Response
对象
??? *参数说明*:
请求对象
的URLrequest
携带的参数(可选)??? *返回类型*:
??? ??? requests.Response
??? 检查环境变量并与其他设置合并
??? *返回类型*:字典
??? 在前缀上注册连接适配器
??? 适配器根据前缀长度降序排序
??? 发送一个OPTIONS请求,返回一个Response
对象
??? *参数说明*:
请求对象
的URLrequest
携带的参数(可选)??? *返回类型*:
??? ??? requests.Response
??? 发送一个PATCH请求,返回一个Response
对象
??? *参数说明*:
请求对象
的URL请求对象
中,它可以是字典、字节、文件(可选参数)request
携带的参数(可选)??? *返回类型*:
??? ??? requests.Response
??? 发送一个POST请求,返回一个Response
对象
??? *参数说明*:
请求对象
的URL请求对象
中,它可以是字典、字节、文件(可选参数)请求对象
中,它是json(可选参数)request
携带的参数(可选)??? *返回类型*:
??? ??? requests.Response
??? 构造一个预请求
对象(PreparedRequest)。这个预请求对象的设置来自于已经设置好session的请求实例
。
??? *参数说明*:
请求实例
??? *返回类型*:
??? ??? requests.PreparedRequest
??? 发送一个PUT请求,返回一个Response
对象
??? *参数说明*:
请求对象
的URL请求对象
中,它可以是字典、字节、文件(可选参数)request
携带的参数(可选)??? *返回类型*:
??? ??? requests.Response
??? 当被重定向的时候,我们可能要从请求对象
中去掉认证信息,避免认证信息泄露。 本方法会自动去掉认证信息,并且重新申请授权,来避免认证信息泄露
??? 当被重定向的时候,我们可能要修改请求的方法,用来请求某个特殊的页面,或者适应某个 特殊的浏览器习惯。
??? 本方法会根据环境变量重新设置代理的配置。如果我们被重定向到一个不需要代理的URL, 我们将去掉代理的配置,否则,我们将给该URL添加缺失的代理配置(防止由于之前重定向去掉了代理而造成的请求错误)。
必要时,本方法可以替换Proxy-Authorization
头。 ??? *返回类型*:
??? ??? 字典
request(*args, **kwargs) → requests_html.HTMLResponse
??? 使用欺骗性地User–Agent
头,构造一个HTTP请求。返回HTTPResponse类
对象。
resolve_redirects(resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs)
??? 接收一个响应对象,返回响应对象或请求对象的生成器。
??? 发送预请求对象
。必要时,本方法可以替换Proxy-Authorization
头。
??? *返回类型*:
??? ??? requests.Response
无所不能的requests-html库(requests库的哥哥)
原文:https://www.cnblogs.com/guapitomjoy/p/12153574.html