DrissionPage/docs/7_advance/4_accelerate_collecting.md
2023-02-03 00:03:36 +08:00

110 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

本节演示一个能够大幅加快浏览器页面数据采集的黑科技。
# ✔️ 示例
我们找一个比较大的页面来演示,比如网页首页:[https://www.163.com]([https://www.163.com](https://www.163.com))
我们数一下这个网页内的`<a>`元素数量:
```python
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://www.163.com')
print(len(page('t:body').eles('t:a')
```
**输出:**
```console
1613
```
嗯,数量不少,可以看出效果。
加入现在我们的任务是打印所有链接的文本,常规做法是遍历所有元素,然后打印。
这里引入一个计时工具,可以标记一段代码运行时间。您也可以用其它方法计时。
```python
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('用时') # 记录并打印时间
```
**输出:**
```console
0.0
网络大过年_网易政务_网易网
网易首页
...中间省略...
不良信息举报 Complaint Center
廉正举报
用时4.057772700001806
```
用时 4 秒。
现在,我们稍微修改一个小小的地方。
`page('t:body').eles('t:a')`改成`page('t:body').s_eles('t:a')`,然后再执行一次。
```python
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('用时') # 记录并打印时间
```
**输出:**
```console
0.0
网络大过年_网易政务_网易网
网易首页
...中间省略...
不良信息举报 Complaint Center
廉正举报
用时0.2797656000002462
```
神奇不?原来 4 秒的采集时间现在只需 0.28 秒。
---
# ✔️ 解读
`s_eles()``eles()`的区别在于前者会把整个页面转变成一个静态页面,再在其中获取静态元素,因为静态元素是纯文本的,没有各种属性、交互等等消耗资源的部分,所有运行速度非常快。
作者曾经采集过一个非常复杂的页面,动态元素用时 30 秒,转静态元素就只要 0.X 秒,加速效果非常明显。
我们可以获取页面中内容容器(示例中的`<body>`),把它转换成静态元素,再在其中获取信息。
当然,静态元素没有交互功能,但它只是副本,不会影响原来的动态元素。