美文网首页虫虫Python精选Python
python爬虫新库:requests-html,一个库顶2个用

python爬虫新库:requests-html,一个库顶2个用

作者: 大白python | 来源:发表于2019-08-02 19:37 被阅读5次

    爬虫三步走:

    1. 发送请求获取网页HTML
    2. 解释网页HTML,得到数据或连接
    3. 下载或保存数据
      现有的资料基本上都是每一步用一个库。

    大白学习爬虫第一步时,用得最多的库还是requests,第二步时会用BeautifulSoup库。
    现在requests作者出一个新的库:requests-html,它可以帮你用一个库,完成爬虫的第一步与第二步,使得写代码与运行也简便与快捷多了。

    requests-html只支持Python 3.6及更新的版本,所以使用老版本的Python的同学需要更新一下Python版本了。

    安装:

    pip install requests-html

    使用

    requests-html库核心是学习其HTML类

    第一步:获取网页HTML:

    from requests_html import HTMLSession
    
    session = HTMLSession()
    r = session.get("http://www.jianshu.com")
    
    #第一步:获取网页HTML:
    print(r.html.html)
    
    #打印出简书的HTML网页代码
    

    第二步:解释网页HTML,得到数据或连接

    links和 absolute_links两个属性分别返回HTML对象所包含的所有链接和绝对链接(均不包含锚点)。

    from requests_html import HTMLSession
    
    session = HTMLSession()
    r = session.get("http://www.jianshu.com")
    
    #第一步:获取网页HTML:
    #print(r.html.html)
    
    #打印出简书的HTML网页代码
    
    #第二步:解释网页HTML,得到数据或连接
    #返回的数据是一个set集合
    print("links返回的数据类型:"+ str(type(r.html.links)))
    for html in r.html.links:
        print(html)
    
    print("-" * 30)
    
    print("absolute_links返回的数据类型:"+     str(type(r.html.absolute_links)))
    for html in r.html.links:
        print(html)
    

    以下是打印结果:

    links返回的数据类型:<class 'set'>
    https://www.jianshu.com/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
    /p/e3e0734f2d52
    /p/c22ed25a7094#comments
    /u/c0b66cf61400
    https://www.jianshu.com/p/a37929ad1994?utm_medium=index-banner&utm_source=desktop
    http://218.242.124.22:8081/businessCheck/verifKey.do?showType=extShow&serial=9031000020171107081457000002158769-SAIC_SHOW_310000-20171115131223587837&signData=MEQCIADWZ5aTcBeER5SOVp0ly+ElvKnwtjczum6Gi6wZ7/wWAiB9MAPM22hp947ZaBobux5PDkd0lfqoCOkVV7zjCYME6g==
    /p/c22ed25a7094
    /u/530f5d6d4108
    /sign_up
    /mobile/club


    absolute_links返回的数据类型:<class 'set'>
    https://www.jianshu.com/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
    https://www.jianshu.com/p/5d6f22ebacd2#comments
    https://www.jianshu.com/mobile/club

    获取元素

    request-html支持CSS选择器语法来选取HTML元素。
    CSS选择器语法,它需要使用HTML的find函数,该函数有5个参数,作用如下:

    • selector,要用的CSS选择器;
    • clean,布尔值,如果为真会忽略HTML中style和script标签造成的影响(原文是sanitize,大概这么理解);
    • containing,如果设置该属性,会返回包含该属性文本的标签;
    • first,布尔值,如果为真会返回第一个元素,否则会返回满足条件的元素列表;
    • _encoding,编码格式。

    以下一行代码就可以获取元素,取其text属性就可以得到元素的内容,过程中少了加载BeautifulSoup库,写代码也更方便了。

    from requests_html import HTMLSession
    
    session = HTMLSession()
    r = session.get("http://www.jianshu.com")
    
    #获取首页span元素的内容:首页
    print(r.html.find("span.menu-text",first=True).text)
    #打印:首页
    

    处理JavaScript

    有些网站是使用JavaScript渲染的,这样的网站爬取到的结果只有一堆JS代码,这样的网站requests-html也可以处理,关键一步就是在HTML结果上调用一下render函数,它会在用户目录(默认是 ~/.pyppeteer/)中下载一个chromium,然后用它来执行JS代码。

    from requests_html import HTMLSession
    session = HTMLSession()
    r = session.get('http://python-requests.org/')
    r.html.render()
    [W:pyppeteer.chromium_downloader] start chromium download.
    Download  may take a few minutes.
    [W:pyppeteer.chromium_downloader] chromium download done.
    [W:pyppeteer.chromium_downloader] chromium extracted to: C:\Users\xxxx\.pyppeteer\local-chromium\571375
    r.html.search('Python 2 will retire in only {months} months!')['months']
    '<time>25</time>'
    

    render函数还有一些参数,顺便介绍一下(这些参数有的还有默认值,直接看源代码方法参数列表即可):

    retries: 加载页面失败的次数

    • script: 页面上需要执行的JS脚本(可选)
    • wait: 加载页面钱的等待时间(秒),防止超时(可选)
    • scrolldown: 页面向下滚动的次数
    • sleep: 在页面初次渲染之后的等待时间
    • reload: 如果为假,那么页面不会从浏览器中加载,而是从内存中加载
    • keep_page: 如果为真,允许你用 r.html.page访问页面

    PS: 这个库更似是将2个库合为一个库来使用,不管怎样,它给我们节省了时间,加快了代码运行速度,甚是好用。

    大白python.png

    相关文章

      网友评论

        本文标题:python爬虫新库:requests-html,一个库顶2个用

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