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

发布于:2023-01-16 ⋅ 阅读:(701) ⋅ 点赞:(0)

​​​大家好,今天是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 以上版本依旧可以。

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

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://python.org/')

print(r)

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

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

通过 dir 函数查阅

print(dir(r.html))
# 输出如下内容:
['__aiter__', '__anext__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__',
'__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_async_render', '_encoding', '_html', '_lxml', '_make_absolute', '_pq', 'absolute_links', 'add_next_symbol',
'arender', 'base_url', 'default_encoding', 'element', 'encoding', 'find', 'full_text', 'html', 'links', 'lxml', 'next',
'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解析库,现在可以直接解析了,下面我们通过小案例来感受一下

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]
        }


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

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

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

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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到