今天给大家推荐一款基于 Python 的网页自动化工具:DrissionPage。这款工具既能控制浏览器,也能收发数据包,甚至能把两者合而为一,简单来说:集合了 WEB 浏览器自动化的便利性和 requests 的高效率优点。
对网页实现自动化,通常会有两类形式:
直接向服务器发送请求数据包,获取需要的数据,模拟数据流向操作。
控制浏览器跟网页进行交互,模拟用户界面操作。
前者轻量级,速度快,例如 requests 库。但 requests 面对需要登录的网站时,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,开发效率不高。
而后者直接使用浏览器,模拟用户行为,如 Selenium 库,可以很大程度上绕过这些坑,但浏览器运行效率不高。
因此,DrissionPag 设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
特点:
无 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单元格为左上角,写入一片二维数据