0


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

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


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

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


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的基本用法。


本文转载自: https://blog.csdn.net/BROKEN__Y/article/details/126354631
版权归原作者 爱吃饼干的小白鼠 所有, 如有侵权,请联系我们删除。

“【21天python打卡】第13天 网络爬虫(4)”的评论:

还没有评论