zoukankan      html  css  js  c++  java
  • python接口自动化(二十六) requests-html爬虫框架

    前言

    python拥有众多的爬虫框架,其中最简单的莫过于requests-html了。它和著名的网络请求库requests是同一个作者,着重于XML数据提取,可以说是最简单的爬虫框架了。

    环境安装

    pip install requests-html

    该库旨在解析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://www.baidu.com/")
    #获取页面上的所有链接
    all_links=r.html.links
    print(all_links)
    print(type(all_links))
    print(len(all_links))
    #绝对路径链接
    all_absolute_links=r.html.absolute_links
    print(all_absolute_links)
    print(len(all_absolute_links))  

     运行结果

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

    xpath定位

    用过lxml库的小伙伴应该知道,lxml可以支持xpath查找元素对象,requests-html也可以完美的支持xpath

    接下来我需要获取目标网站:https://www.cnblogs.com/canglongdao/category/1588084.html(备注,下面尝试的是未登陆状态,所以这里的网址是不登录,可以访问的),获取所有的文章标题,

    谷歌浏览器中打开该网站,按F12,弹出DevTools,根据下图步骤,复制xpath地址。

    鼠标在href行时,xpath地址: //*[@id="main"]/div[2]/h5/a;尝试其它文章标题,xpath地址://*[@id="main"]/div[1]/h5/a;发现div后面的数字不同,所以若是想提取到所有文章的href行,则将数字去掉,//*[@id="main"]/div/h5/a

    参考代码:

    from requests_html import HTMLSession
    session=HTMLSession()
    r=session.get("https://www.cnblogs.com/canglongdao/category/1588084.html")
    #只获取第一个
    one=r.html.xpath("//*[@id='main']/div/h5/a/span",first=True).text
    print("one:{}".format(one))
    
    #获取全部
    f=r.html.xpath("//*[@id='main']/div/h5/a/span")
    print(type(f),len(f))
    u=r.html.xpath("//*[@id='main']/div/h5/a")
    for i,j in zip(f,u):
        print(i.text,j.absolute_links) #文本,链接
    

     运行结果 

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

    css定位支持

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

    from requests_html import HTMLSession
    session=HTMLSession()
    r=session.get("https://www.cnblogs.com/canglongdao/category/1588084.html")
    #只获取第一个 css语法
    one=r.html.find(".post>h5>a>span",first=True).text
    print("one:{}".format(one))
    
    #获取全部 css语法
    f=r.html.find(".post>h5>a>span")
    print(type(f),len(f))
    u=r.html.find(".post>h5>a")
    for i,j in zip(f,u):
        print(i.text,j.absolute_links) #文本,链接  

      其它方法

    from requests_html import HTMLSession
    session=HTMLSession()
    r=session.get("https://www.cnblogs.com/canglongdao/category/1588084.html")
    a=r.html.find(".post>h5",first=True)
    #1.获取文本
    print(a.text)
    #2.获取html内容
    print(a.html)
    #3.获取全部属性
    print(a.attrs)
    #4.获取链接
    print(a.absolute_links)
    #5.搜索文字
    print(a.search('python接口自动化({})  urlencode编码%E7%94%9F%E6%B4%BB与解码')[0])
    #6.继续定位子元素
    print(a.find('a'))
    #7.containing 模糊匹配 只包含‘python'文本的对象
    b=a.find('a',containing='python')
    print(b)
    

     运行结果

    python接口自动化(二十五) urlencode编码%E7%94%9F%E6%B4%BB与解码
    <h5>
    <a class="entrylistItemTitle" href="https://www.cnblogs.com/canglongdao/p/13451393.html">
    <span>python接口自动化(二十五)  urlencode编码%E7%94%9F%E6%B4%BB与解码</span>
    </a>
    </h5>
    {}
    {'https://www.cnblogs.com/canglongdao/p/13451393.html'}
    二十五
    [<Element 'a' class=('entrylistItemTitle',) href='https://www.cnblogs.com/canglongdao/p/13451393.html'>]
    [<Element 'a' class=('entrylistItemTitle',) href='https://www.cnblogs.com/canglongdao/p/13451393.html'>]
    

      

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    git fetch, git pull, git pull -rebase区别
    Git 变更远程仓库地址
    终于有人把 Docker 讲清楚了,万字详解!
    Harbor install and used
    访问gitlab从http方式改为ssh方式,gitlab使用的不是标准22端口
    Linux下的ifconfig已经过时了,试试ip命令
    在CentOS 8上使用DNF管理软件包
    搭建hadoop的HA集群模式(hadoop2.7.3+hive+spark)
    spark运行时加载配置文件(hive,hdfs)
    java 如何用pattern 和 Matcher 来使用正则表达式(一)
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13452577.html
Copyright © 2011-2022 走看看