banner
andrewji8

Being towards death

Heed not to the tree-rustling and leaf-lashing rain, Why not stroll along, whistle and sing under its rein. Lighter and better suited than horses are straw sandals and a bamboo staff, Who's afraid? A palm-leaf plaited cape provides enough to misty weather in life sustain. A thorny spring breeze sobers up the spirit, I feel a slight chill, The setting sun over the mountain offers greetings still. Looking back over the bleak passage survived, The return in time Shall not be affected by windswept rain or shine.
telegram
twitter
github

selenium的新一代替代品---DrissionPage

今天给大家推荐一款基于 Python 的网页自动化工具:DrissionPage。这款工具既能控制浏览器,也能收发数据包,甚至能把两者合而为一,简单来说:集合了 WEB 浏览器自动化的便利性和 requests 的高效率优点。

对网页实现自动化,通常会有两类形式:

直接向服务器发送请求数据包,获取需要的数据,模拟数据流向操作。

控制浏览器跟网页进行交互,模拟用户界面操作。

前者轻量级,速度快,例如 requests 库。但 requests 面对需要登录的网站时,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,开发效率不高。

而后者直接使用浏览器,模拟用户行为,如 Selenium 库,可以很大程度上绕过这些坑,但浏览器运行效率不高。

因此,DrissionPag 设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。

image
特点:

无 webdriver 特征

无需为不同版本的浏览器下载不同的驱动

运行速度更快

可以跨 iframe 查找元素,无需切入切出

把 iframe 看作普通元素,获取后可直接在其中查找元素,逻辑更清晰

可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,无需切换

可以直接读取浏览器缓存来保存图片,无需用 GUI 点击另存

可以对整个网页截图,包括视口外的部分(90 以上版本浏览器支持)

可处理非 open 状态的 shadow-root

项目地址:

https://gitee.com/g1879/DrissionPage

使用 pip 安装 DrissionPage:

pip install DrissionPage -i https://pypi.tuna.tsinghua.edu.cn/simple
应用实例 :采集猫眼电影 TOP100 榜

这个示例演示用浏览器采集数据。

目标网址:https://www.maoyan.com/board/4

示例代码

以下代码可直接运行。

须要注意的是,这里用到记录器对象,详见 DataRecorder

from DrissionPage import ChromiumPage
from DataRecorder import Recorder
# 创建页面对象

page = ChromiumPage()
# 创建记录器对象
recorder = Recorder('data.csv')
# 访问网页
page.get('https://www.maoyan.com/board/4')


while True:

    # 遍历页面上所有 dd 元素


    for mov in page.eles('t:dd'):

        # 获取须要的信息


        num = mov('t:i').text
        score = mov('.score').text
        title = mov('@data-act=boarditem-click').attr('title')
        star = mov('.star').text
        time = mov('.releasetime').text
        # 写入到记录器


        recorder.add_data((num, title, star, time, score))

    # 获取下一页按钮,有就点击
    btn = page('下一页', timeout=2)
    if btn:
        btn.click()
        page.wait.load_start()
    # 没有则退出程序
    else:
        break
recorder.record()

现在说一下这个好用的库,DataRecorder

https://gitee.com/huiwei13/data-recorder
虽然小众,但是好用

可以缓存数据到一定数量再一次写入,减少文件读写次数,降低开销。

支持多线程同时写入数据。

写入时如文件打开,会自动等待文件关闭再写入,避免数据丢失。

对断点续爬提供良好支持。

可方便地批量转移数据。

可根据字典数据自动创建表头。

自动创建文件和路径,减少代码量。

记录器 Recorder

Recorder 的功能简单直观高效实用,只做一个动作,就是不断接收数据,按顺序往文件里添加。可以接收单行数据,或二维数据一次写入多行。

它支持 csv、xlsx、json、txt 四种格式文件。

from DataRecorder import Recorder


data = ((1, 2, 3, 4), 
        (5, 6, 7, 8))


r = Recorder('data.csv')
r.add_data(data)  # 一次记录多行数据
r.add_data('abc')  # 记录单行数据

表格填充器 Filler

Filler 用于对表格文件填写数据,可以指定填其坐标。它的使用非常灵活,可以指定坐标为左上角,填入一片二维数据。还封装了记录数据处理进度的功能(比如断点续爬)。除此以外,它还能给单元格设置链接。
它只支持 csv 和 xlsx 格式文件。

from DataRecorder import Filler
f = Filler('results.csv')
f.add_data((1, 2, 3, 4), 'a2')  # 从A2单元格开始,写入一行数据
f.add_data(((1, 2), (3, 4)), 'd4')  # 以D4单元格为左上角,写入一片二维数据
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。