• 【21天python打卡】第13天 网络爬虫(4)


    ​​​大家好,今天是21天python打卡的第13天,上一篇讲了python中requests的用法,今天来说说requests-html的用法。


    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。


    目录

    requests-html 模块是什么

    基本描述

    通过 dir 函数查阅

    html 对象的方法包括

    html 对象的属性包括

    怎么用

    安装requests-html

    基本使用

    高级用法

    输出结果


    requests-html 模块是什么

    requests-html 模块安装使用 pip install requests-html 即可,官方手册查询地址:requests-html.kennethreitz.org/,官方并没有直接的中文翻译,在检索过程中,确实发现了一版中文手册,在文末提供。

    基本描述

    先看一下官方对该库的基本描述:

    • Full JavaScript support!(完全支持 JS,这里手册还重点标记了一下,初学阶段可以先忽略)
    • CSS Selectors (a.k.a jQuery-style, thanks to PyQuery).(集成了 pyquery 库,支持 css 选择器)
    • XPath Selectors, for the faint at heart.(支持 XPath 选择器)
    • Mocked user-agent (like a real web browser).(mock UA 数据,这点不错)
    • Automatic following of redirects.(自动跟踪重定向)
    • Connection–pooling and cookie persistence.(持久性 COOKIE)
    • The Requests experience you know and love, with magical parsing abilities.

    Only Python 3.6 is supported. 仅支持 Python 3.6 ,实测发现 3.6 以上版本依旧可以。

    对于该库的简单使用,代码如下所示:

    1. from requests_html import HTMLSession
    2. session = HTMLSession()
    3. r = session.get('https://python.org/')
    4. print(r)

    首先从 requests_html 库导入 HTMLSession 类,然后将其实例化之后,调用其 get 方法,发送请求,得到的 r 输出为 ,后续即可使用内置的解析库对数据进行解析。

    由于该库是解析 html 对象,所以可以查看对应的 html 对象包含哪些方法与与属性。

    通过 dir 函数查阅

    1. print(dir(r.html))
    2. # 输出如下内容:
    3. ['__aiter__', '__anext__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
    4. '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__',
    5. '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
    6. '__weakref__', '_async_render', '_encoding', '_html', '_lxml', '_make_absolute', '_pq', 'absolute_links', 'add_next_symbol',
    7. 'arender', 'base_url', 'default_encoding', 'element', 'encoding', 'find', 'full_text', 'html', 'links', 'lxml', 'next',
    8. 'next_symbol', 'page', 'pq', 'raw_html', 'render', 'search', 'search_all', 'session', 'skip_anchors', 'text', 'url', 'xpath']

    该函数只能输入大概内容,细节还是需要通过 help 函数查询,例如:

    html 对象的方法包括

    • find:提供一个 css 选择器,返回一个元素列表;
    • xpath:提供一个 xpath 表达式,返回一个元素列表;
    • search: 根据传入的模板参数,查找 Element 对象;
    • search_all:同上,返回的全部数据;

    html 对象的属性包括

    • links:返回页面所有链接;
    • absolute_links:返回页面所有链接的绝对地址;
    • base_url:页面的基准 URL;
    • htmlraw_htmltext:以 HTML 格式输入页面,输出未解析过的网页,提取页面所有文本;

    有了上述内容铺垫之后,在进行 Python 爬虫的编写就会变的容易许多,requests-html 库将通过 3~4 个案例进行学习掌握,接下来进入第一个案例。

    怎么用

    安装requests-html

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

    基本使用

    学过requests库的同学看到requests-html的api应该会很熟悉,使用方法基本一致,不同的是使用requests编写爬虫时,要先把网页爬取下来,然后再交给Beautiful Soup等一些html解析库,现在可以直接解析了,下面我们通过小案例来感受一下

    1. from requests_html import HTMLSession
    2. session = HTMLSession()
    3. def parse():
    4. r = session.get('http://www.qdaily.com/')
    5. # 获取首页新闻标签、图片、标题、发布时间
    6. for x in r.html.find('.packery-item'):
    7. yield {
    8. 'tag': x.find('.category')[0].text,
    9. 'image': x.find('.lazyload')[0].attrs['data-src'],
    10. 'title': x.find('.smart-dotdotdot')[0].text if x.find('.smart-dotdotdot') else x.find('.smart-lines')[0].text,
    11. 'addtime': x.find('.smart-date')[0].attrs['data-origindate'][:-6]
    12. }


    通过简短的几行代码,就可以把整个首页的文章抓取下来,下面我来分别介绍一下案例中使用的几个方法

    • ind( ) 可以接收两个参数

      • 第一个参数可以是class名称或ID
      • 第二个参数first=True时,只选取第一条数据
    • text 获取元素的文本内容

    • attrs 获取元素的属性,返回值是个字典。如:

    {'class': ('smart-date',), 'data-origindate': '2018-11-02 10:27:10 +0800'}
    
    • html 获取元素的html内容

    此外还支持xpath选择器,使用方法也很简单

    1. r.html.xpath('/html/body/div[2]/div[1]/div[2]/div/div[3]')[0].text
    2. '登录\n登录查看你的好奇心指数'

    高级用法

    对 JavaScript的支持无疑是requests-html最大的亮点,上篇文章分享Python爬虫实战——搭建自己的IP代理池时,我们就遇到这样一个问题,代理的端口号都是js渲染的,我们不得不去分析他们的加密方式,然后再来解密,虽然最后也能成功解密,但是费时费力,现在使用requests-html我们可以轻松解决这个问题。

    下面我们来演示一下使用方法

    1. from requests_html import HTMLSession
    2. from re
    3. session = HTMLSession()
    4. def parse():
    5. r = session.get('http://www.goubanjia.com')
    6. r.html.render()
    7. reg = re.compile('|<.*?>', re.S)
    8. for x in r.html.find('.ip'):
    9. data = re.sub(reg, '', str(x.html))
    10. yield data

    输出结果

    def main():
        for x in parse():
            print(x)
            
    # IP代理地址
    103.212.236.5:80
    103.31.45.106:23500

    同样是简短的几行代码,和之前的破解js相比,真是大大提升了我们的爬虫效率,这里主要是用了render函数,我们来一起看一下它的源代码

    1. def render(self, retries: int = 8, script: str = None,
    2. wait: float = 0.2, scrolldown=False, sleep: int = 0,
    3. reload: bool = True, timeout: Union[float, int] = 8.0,
    4. keep_page: bool = False):
    5. """
    6. retries: 加载次数
    7. script: 页面加载时要执行的js脚步(可选).
    8. wait: 加载页面之前等待的秒数,防止超时 (可选).
    9. scrolldown: 页面向下滚动的次数
    10. sleep: 初始渲染后要等多长时间
    11. reload: 如果等于False,内容不会从浏览器加载,而是将从内存中加载.
    12. keep_page: 如果是True 将允许您通过``r.html.page`页面与浏览器进行交互.
    • 需要注意的是第一次使用这个方法,他会先下载Chromium,然后使用Chromium来执行代码,但是下载的时候你可能需要一个梯子,这里就不展开讨论了。

    今天就介绍到这里,下一篇我们继续介绍Beautiful Soup的基本用法。

  • 相关阅读:
    视频号小店所需资金明细,2023最新费用详解!
    【第54篇】一种用于视觉识别的快速知识蒸馏框架
    中手游上半年扭亏为盈,仙剑IP魅力不减?
    Linux|qtcreator编译可执行程序双击运行
    机器学习笔记之配分函数(二)——随机最大似然
    CH559L单片机ADC多通道采样数据串口打印案例
    【探索SpringCloud】服务发现-Nacos服务端数据结构和模型
    使用go语言高效解析json详解(含多个json库的对比)
    python http.server 的测试和常见问题解决方法
    Vue-springboot通讯录管理系统maven项目 idea
  • 原文地址:https://blog.csdn.net/BROKEN__Y/article/details/126354631