美文网首页Python
Python爬虫实战——requests-html

Python爬虫实战——requests-html

作者: 沐码人 | 来源:发表于2018-11-05 20:08 被阅读0次

    编写爬虫时requests+BeautifulSoup是一对完美的组合,现在requests库的作者又发布了一个功能强大的新库requests-html

    Stephen Kraakmo

    用过requests库的同学都应该都喜欢他的简洁优雅,现在requests-html同样优雅,而且从名称可以看出应该是解析html的库,下面先简单的介绍一下使用方法,然后再来编写一个爬虫

    从requests-html的Github的主页,我们可以看到这个库有以下功能特点:

    • 支持JavaScript
    • 支持CSS选择器。
    • 支持xpath选择器
    • 模拟用户代理
    • 自动重定向
    • 连接池和cookie持久性
    • 支持异步

    安装requests-html

    pip install requests-html
    
    • 需要注意的是这个库目前只支持python3.6版本

    基本使用

    学过requests库的同学看到requests-html的api应该会很熟悉,使用方法基本一致,不同的是使用requests编写爬虫时,要先把网页爬取下来,然后再交给BeautifulSoup等一些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 获取元素的属性,返回值是个字典。如:

    {'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来执行代码,但是下载的时候你可能需要一个梯子,这里就不展开讨论了。

    更多方法可以参考requests-html的Github主页

    总结:requests-html在某些方面并不一定能代替requests+BeautifulSoup这对完美组合,正是因为这些优秀的库才让我们现在编写爬虫越来越简单。

    参考文档

    https://github.com/kennethreitz/requests-html

    爬虫源代码

    https://github.com/iyuyoung/spider

    相关文章

      网友评论

        本文标题:Python爬虫实战——requests-html

        本文链接:https://www.haomeiwen.com/subject/ftrexqtx.html