requests-html 模块是什么
requests-html 模块安装使用 pip install requests-html 即可,官方手册查询地址:requests-html.kennethreitz.org/,官方并没有直接的中文翻译,在检索过程中,确实发现了一版中文手册,在文末提供。
基本描述
先看一下官方对该库的基本描述:
- Full JavaScript support!(完全支持 JS,这里手册还重点标记了一下,初学阶段可以先忽略)
- CSS Selectors (a.k.a jQuery-style, thanks to PyQuery).(集成了 pyquery 库,支持 css 选择器)
XPath Selectors, for the faint at heart.(支持 XPath 选择器)
Mocked user-agent (like a real web browser).(mock UA 数据,这点不错)
Automatic following of redirects.(自动跟踪重定向)
Connection–pooling and cookie persistence.(持久性 COOKIE)
The Requests experience you know and love, with magical parsing abilities.
Only Python 3.6 is supported. 仅支持 Python 3.6 ,实测发现 3.6 以上版本依旧可以。
对于该库的简单使用,代码如下所示:
from requests_html import HTMLSession session = HTMLSession() r = session.get('https://python.org/') print(r)
首先从 requests_html 库导入 HTMLSession 类,然后将其实例化之后,调用其 get 方法,发送请求,得到的 r 输出为 <Response [200]>,后续即可使用内置的解析库对数据进行解析。
由于该库是解析 html 对象,所以可以查看对应的 html 对象包含哪些方法与与属性。
通过 dir
函数查阅
print(dir(r.html)) # 输出如下内容: ['__aiter__', '__anext__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_async_render', '_encoding', '_html', '_lxml', '_make_absolute', '_pq', 'absolute_links', 'add_next_symbol', 'arender', 'base_url', 'default_encoding', 'element', 'encoding', 'find', 'full_text', 'html', 'links', 'lxml', 'next', 'next_symbol', 'page', 'pq', 'raw_html', 'render', 'search', 'search_all', 'session', 'skip_anchors', 'text', 'url', 'xpath']
该函数只能输入大概内容,细节还是需要通过 help 函数查询,例如:
html 对象的方法包括
find
:提供一个 css 选择器,返回一个元素列表;xpath
:提供一个 xpath 表达式,返回一个元素列表;search
: 根据传入的模板参数,查找 Element 对象;search_all
:同上,返回的全部数据;
html 对象的属性包括
links
:返回页面所有链接;absolute_links
:返回页面所有链接的绝对地址;base_url
:页面的基准 URL;html
,raw_html
,text
:以 HTML 格式输入页面,输出未解析过的网页,提取页面所有文本;
有了上述内容铺垫之后,在进行 Python 的编写就会变的容易许多,requests-html
库将通过 3~4 个案例进行学习掌握,接下来进入第一个案例。
怎么用
安装requests-html
pip install requests-html
- 需要注意的是这个库目前只支持python3.6版本
基本使用
学过requests库的同学看到requests-html的api应该会很熟悉,使用方法基本一致,不同的是使用requests编写爬虫时,要先把网页下来,然后再交给Beautiful Soup等一些html解析库,现在可以直接解析了,下面我们通过小案例来感受一下
from requests_html import HTMLSession session = HTMLSession() def parse(): r = session.get('http://www.qdaily.com/') # 获取首页新闻标签、图片、标题、发布时间 for x in r.html.find('.packery-item'): yield { 'tag': x.find('.category')[0].text, 'image': x.find('.lazyload')[0].attrs['data-src'], 'title': x.find('.smart-dotdotdot')[0].text if x.find('.smart-dotdotdot') else x.find('.smart-lines')[0].text, 'addtime': x.find('.smart-date')[0].attrs['data-origindate'][:-6] }
通过简短的几行代码,就可以把整个首页的文章抓取下来,下面我来分别介绍一下案例中使用的几个方法
ind( ) 可以接收两个参数
第一个参数可以是class名称或ID
第二个参数first=True时,只选取第一条数据
text 获取元素的文本内容
attrs 获取元素的属性,返回值是个字典。如:
{'class': ('smart-date',), 'data-origindate': '2018-11-02 10:27:10 +0800'}
- html 获取元素的html内容
此外还支持xpath选择器,使用方法也很简单
1. r.html.xpath('/html/body/div[2]/div[1]/div[2]/div/div[3]')[0].text 2. 3. '登录\n登录查看你的好奇心指数'
高级用法
对 JavaScript的支持无疑是requests-html最大的亮点,上篇文章分享Python爬虫实战——搭建自己的IP代理池时,我们就遇到这样一个问题,代理的端口号都是js渲染的,我们不得不去分析他们的加密方式,然后再来解密,虽然最后也能成功解密,但是费时费力,现在使用requests-html我们可以轻松解决这个问题。
下面我们来演示一下使用方法
from requests_html import HTMLSession from re session = HTMLSession() def parse(): r = session.get('http://www.goubanjia.com') r.html.render() reg = re.compile('<p.*?/p*>|<.*?>', re.S) for x in r.html.find('.ip'): data = re.sub(reg, '', str(x.html)) yield data
输出结果
def main():
for x in parse():
print(x)
# IP代理地址
103.212.236.5:80
103.31.45.106:23500
同样是简短的几行代码,和之前的破解js相比,真是大大提升了我们的爬虫效率,这里主要是用了render函数,我们来一起看一下它的源代码
def render(self, 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): """ retries: 加载次数 script: 页面加载时要执行的js脚步(可选). wait: 加载页面之前等待的秒数,防止超时 (可选). scrolldown: 页面向下滚动的次数 sleep: 初始渲染后要等多长时间 reload: 如果等于False,内容不会从浏览器加载,而是将从内存中加载. keep_page: 如果是True 将允许您通过``r.html.page`页面与浏览器进行交互.
- 需要注意的是第一次使用这个方法,他会先下载Chromium,然后使用Chromium来执行代码,但是下载的时候你可能需要一个梯子,这里就不展开讨论了。
今天就介绍到这里,下一篇我们继续介绍Beautiful Soup的基本用法。