zoukankan      html  css  js  c++  java
  • python接口自动化28-requests-html爬虫框架

    前言

    requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html。之前解析html页面用过了lxml和bs4,
    requests-html集成了一些常用爬虫库的优点,依然是为人类服务:HTML Parsing for Humans。
    目前只支持python3.6
    相关安装包版本

    • requests 2.22.0
    • requests-html 0.10.0
    • requests-toolbelt 0.8.0

    环境准备

    requests-html的GitHub地址https://github.com/kennethreitz/requests-html,使用pip就能直接安装了。

    pip install requests-html==0.10.0

    该库旨在使解析HTML(例如,抓取Web)尽可能简单直观, 有以下优势:

    • 完整的JavaScript支持!
    • CSS Selectors(又名jQuery风格,感谢PyQuery)。
    • XPath Selectors,对于胆小的人来说。
    • 模拟用户代理(如真实的Web浏览器)。
    • 自动跟踪重定向。
    • 连接池和cookie持久性。
    • 令人欣喜的请求体验,具有神奇的解析能力。
    • 异步支持

    抓页面url地址

    先发个get请求,返回response对象,通过r.html.links获取页面的全部链接,包含一些相对路径的地址,如果只想获取绝对路径的地址,可以用r.html.absolute_links

    from requests_html import HTMLSession
    session = HTMLSession()
    
    r = session.get('https://python.org/')
    
    # 获取页面上的所有链接
    all_links = r.html.links
    print(all_links)
    
    # 绝对路径链接
    all_absolute_links = r.html.absolute_links
    print(all_absolute_links)
    

    运行结果, 返回内容太多,省略了一部分:

    {'http://pycon.blogspot.com/', '/community/', 'http://python.org/dev/peps/', '/events/python-events/831/', , 'http://www.scipy.org'}
    {'http://pycon.blogspot.com/', 'https://www.python.org/dev/',  'https://wiki.qt.io/PySide', 'https://www.python.org/events/python-events/817/'}
    

    从返回的结果可以看出,返回的是set集合,会自动的去除重复的链接地址

    xpath定位

    用过lxml库的小伙伴应该知道https://www.cnblogs.com/yoyoketang/p/9661273.html,lxml可以支持xpath查找元素对象,requests-html也可以完美的支持xpath

    接下来我需要获取目标网站:https://www.cnblogs.com/yoyoketang/tag/django/, 获取所有的文章标题,xpath语法:.//*[@id='myposts']/div/div/a

    参考代码

    from requests_html import HTMLSession
    session = HTMLSession()
    
    r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
    # 只获取第一个
    f = r.html.xpath(".//*[@id='myposts']/div/div/a", first=True).text
    print(f)
    
    # 获取全部
    all = r.html.xpath(".//*[@id='myposts']/div/div/a")
    for i in all:
        print(i.text)            # 获取文本
        print(i.absolute_links)  # 获取链接
    

    运行结果

    python测试开发django-49.allow_tags和mark_safe
    python测试开发django-49.allow_tags和mark_safe
    {'https://www.cnblogs.com/yoyoketang/p/10659137.html'}
    python测试开发django-48.xadmin上传图片django-stdimage
    {'https://www.cnblogs.com/yoyoketang/p/10655601.html'}
    python测试开发django-47.xadmin上传图片和文件
    {'https://www.cnblogs.com/yoyoketang/p/10653878.html'}
    

    xpath方法返回是一个list,加上 first=True参数返回第一个结果

    css定位支持

    requests-html同样支持CSS Selector的方法,把上面案例用css定位也可以实现同样效果

    from requests_html import HTMLSession
    session = HTMLSession()
    
    r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
    # 只获取第一个 css语法
    f = r.html.find(".PostList>div>a", first=True).text
    print(f)
    
    # 获取全部 css语法
    all = r.html.find(".PostList>div>a")
    for i in all:
        print(i.text)          # 获取文本
        print(i.absolute_links)  # 获取链接
    

    其它方法

    from requests_html import HTMLSession
    session = HTMLSession()
    
    r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
    
    about = r.html.find(".PostList>div", first=True)
    
    # 1.获取文本
    print(about.text)
    
    # 2.获取html内容
    print(about.html)
    
    # 3.获取全部属性
    print(about.attrs)
    
    # 4.获取链接
    print(about.absolute_links )
    
    # 5.搜索文字
    print(about.search('python测试开发{}和mark_safe')[0])
    
    # 6.继续定位子元素
    print(about.find('a'))  # 返回list element对象
    
    # 7.containing 模糊匹配 只包含'django'文本的对象
    a = about.find('a', containing='django')
    print(a)
    
    
    

    运行结果

    python测试开发django-49.allow_tags和mark_safe
    <div class="postTitl2"><a href="https://www.cnblogs.com/yoyoketang/p/10659137.html" id="PostsList1_rpPosts_TitleUrl_0">python测试开发django-49.allow_tags和mark_safe</a></div>
    {'class': ('postTitl2',)}
    {'https://www.cnblogs.com/yoyoketang/p/10659137.html'}
    django-49.allow_tags
    [<Element 'a' href='https://www.cnblogs.com/yoyoketang/p/10659137.html' id='PostsList1_rpPosts_TitleUrl_0'>]
    [<Element 'a' href='https://www.cnblogs.com/yoyoketang/p/10659137.html' id='PostsList1_rpPosts_TitleUrl_0'>]
    

    这些只是一些基本的功能,requests-html还可以支持JavaScript渲染页面,看下一篇python接口自动化29-requests-html支持JavaScript渲染页面

  • 相关阅读:
    C++中的函数
    C++基本语句
    面向对象程序设计
    数据结构中的算法
    数据结构开篇
    条件编译
    文件包含
    简单的宏替换
    系统启动过程
    parted 命令学习
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10662679.html
Copyright © 2011-2022 走看看