python爬虫新类库requests-html,事半功倍
用过requests库的同学都应该都喜欢他的简洁优雅,现在requests-html同样优雅,而且从名称可以看出应该是解析html的库,下面先简单的介绍一下使用方法,然后再来编写一个爬虫
从requests-html的Github的主页,我们可以看到这个库有以下功能特点:
支持JavaScript
支持CSS选择器。
支持xpath选择器
模拟用户代理
自动重定向
连接池和COOKIE持久性
支持异步
一、安装
pip install requests-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] }
通过简短的几行代码,就可以把整个首页的文章抓取下来,下面我来分别介绍一下案例中使用的几个方法
find( ) 可以接收两个参数
第一个参数可以是class名称或ID
第二个参数first=True时,只选取第一条数据
text 获取元素的文本内容
attrs 获取元素的属性,返回值是个字典。如
此外还支持xpath选择器,使用方法也很简单 r.html.xpath('/html/body/div[2]/div[1]/div[2]/div/div[3]')[0].text
二、高级用法
对 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函数
需要注意的是第一次使用这个方法,他会先下载Chromium,然后使用Chromium来执行代码,但是下载的时候你可能需要一个梯子,这里就不展开讨论了。
网友评论0