大家好,今天是21天python打卡的第13天,上一篇讲了python中requests的用法,今天来说说requests-html的用法。
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
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选择器,使用方法也很简单
r.html.xpath('/html/body/div[2]/div[1]/div[2]/div/div[3]')[0].text
'登录\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的基本用法。
版权归原作者 爱吃饼干的小白鼠 所有, 如有侵权,请联系我们删除。