⚙️ 加速浏览器数据采集
本节演示一个能够大幅加快浏览器页面数据采集的黑科技。
✅️️ 示例
我们找一个比较大的页面来演示,比如网页首页:https://www.163.com
我们数一下这个网页内的<a>
元素数量:
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://www.163.com')
print(len(page('t:body').eles('t:a')))
输出:
嗯,数量不少,可以看出效果。
假如现在我们的任务是打印所有链接的文本,常规做法是遍历所有元素,然后打印。
这里引入本库作者写的一个计时工具,可以标记一段代码运行时间。您也可以用其它方法计时。
from DrissionPage import ChromiumPage
from TimePinner import Pinner # 导入计时工具
pinner = Pinner() # 创建计时器对象
page = ChromiumPage()
page.get('https://www.163.com')
pinner.pin() # 标记开始记录
# 获取所有链接对象并遍历
links = page('t:body').eles('t:a')
for lnk in links:
print(lnk.text)
pinner.pin('用时') # 记录并打印时间
输出:
用时 4 秒。
现在,我们稍微修改一个小小的地方。
把page('t:body').eles('t:a')
改成page('t:body').s_eles('t:a')
,然后再执行一次。
from DrissionPage import ChromiumPage
from TimePinner import Pinner # 导入计时工具
pinner = Pinner() # 创建计时器对象
page = ChromiumPage()
page.get('https://www.163.com')
pinner.pin() # 标记开始记录
# 获取所有链接对象并遍历
links = page('t:body').s_eles('t:a')
for lnk in links:
print(lnk.text)
pinner.pin('用时') # 记录并打印时间
输出:
神奇不?原来 4 秒的采集时间现在只需 0.28 秒。
✅️️ 解读
s_eles()
与eles()
的区别在于前者会把整个页面或动态元素转变成一个静态元素,再在其中获取下级元素或信息。因为静态元素是纯文本的,没有各种属性、交互等消耗资源的部分,所以运行速度非常快。
作者曾经采集过一个非常复杂的页面,动态元素用时 30 秒,转静态元素就只要 0.X 秒,加速效果非常明显。
我们可以获取页面中内容容器(示例中的<body>
),把它转换成静态元素,再在其中获取信息。
当然,静态元素没有交互功能,它只是副本,也不会影响原来的动态元素。