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

如何利用 DrissionPage 进行高效的网页数据抓取?

DrissionPage 简介#

https://github.com/g1879/DrissionPage
DrissionPage 是一个用 Python 写的网页自动化工具,它把 Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式(就像用 Selenium 那样)和无浏览器模式(类似用 requests)之间自由切换。有了这个功能,不管是处理需要 JavaScript 渲染的动态网页内容,还是抓取简单的静态页面数据,DrissionPage 都能轻松搞定。

主要页面对象#

DrissionPage 提供了三种主要的页面对象,每种对象都有适合自己的使用场景:

  • ChromiumPage:主要用来直接操作浏览器,适合那些需要和网页进行交互的情况,比如点击按钮、输入文本、运行 JavaScript 脚本等。不过它的性能会受到浏览器的限制,运行速度可能没那么快,占用的内存也可能比较多。

  • WebPage:是个综合性的页面对象,它既能控制浏览器,又能收发数据包。它有两种模式:

    • d 模式:用来操作浏览器,功能很强大,但运行速度慢;
    • s 模式:主要处理数据包,速度快,适合数据包比较简单的情况。
  • SessionPage:是个轻量级的页面对象,专门用来发送和接收数据包,不需要和网页进行交互。它处理大规模数据爬取的效率很高,是这方面的理想选择。

功能特点#

无缝切换模式#

DrissionPage 让开发者可以在 Selenium 的浏览器驱动和 Requests 的会话之间随意切换。要是需要渲染网页,就用 Selenium;要是想快速抓取数据,就用 Requests。比如说,碰到一个既有动态内容又有静态内容的网页,就可以先用 SessionPage 快速拿到静态数据,再切换到 ChromiumPage 或者 WebPage 的 d 模式去处理动态内容。

简化的接口#

DrissionPage 提供了统一的接口,把网页自动化和数据抓取的流程简化了。开发者不用再分别去学 Selenium 和 Requests 这两个库复杂的 API 了,能节省很多学习和开发的时间。就拿定位网页元素来说,DrissionPage 提供了和 Selenium 类似的 ele()eles() 方法,支持好几种选择器类型(像 CSS 选择器、XPath),用起来特别方便。

灵活定制#

它支持用户自己设置请求头、代理、超时时间这些东西,让网页抓取变得更灵活。在抓取数据的时候,有时候会碰到网站的反爬机制,这时候设置一下自定义请求头和代理,就能顺利绕过这些限制。

内置常用功能#

DrissionPage 里面有很多常用的功能,比如等待元素加载、自动重试等。处理动态网页的时候,网页元素加载可能需要点时间,DrissionPage 的等待元素加载功能就能保证在元素加载好之后再进行操作,避免因为元素没加载完而出错。

多标签页操作#

它可以同时操作浏览器里的多个标签页,就算标签页不是当前激活的状态,也不用切换就能操作。在需要同时处理多个网页的时候,这个功能就特别实用,能大大提高工作效率。

抓包功能升级 - Listen 功能#

在 DrissionPage 4.0 版本里,抓包功能有了很大的提升,每个页面对象都内置了监听器,能力变强了,API 也更合理了。这对开发者调试和采集数据有很大帮助。

示例代码#

下面这个例子可以直接运行看看效果,它还会记录时间,能让你了解 Listen 功能怎么用:

from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint

page = ChromiumPage()
page.listen.start('api/getkeydata')  # 指定要监听的目标,然后启动监听
pinner = Pinner(True, False)
page.get('http://www.hao123.com/')  # 打开这个网站
packet = page.listen.wait()  # 等着拿到数据包
pprint(packet.response.body)  # 把数据包里的内容打印出来
pinner.pin('用时', True)

运行这段代码后,会把监听得到的数据包内容和整个过程花的时间都输出出来,方便开发者分析性能和调试。

页面访问逻辑优化#

在 3.x 版本里,页面连接有两个主要问题:浏览器页面对象 get() 方法的 timeout 参数只对页面加载阶段有用,对连接阶段没用;加载策略 none 模式在实际中没什么用。这两个问题在 4.0 版本都解决了,而且用户可以自己控制什么时候终止连接。

使用场景#

网页自动化测试#

利用 Selenium 的功能,模拟用户在网页上的操作,进行自动化测试。可以对网页的各种功能,像登录、注册、提交表单等进行测试,保证网页稳定可靠。

数据抓取#

用 Requests 来获取静态页面的数据,碰到复杂页面就切换到浏览器模式。这样能快速高效地抓取各种网站的数据,像新闻、商品信息、社交网络数据等。

爬虫开发#

结合它灵活的模式切换和强大的元素定位功能,DrissionPage 很适合开发各种类型的爬虫。可以根据网站的特点选择合适的模式,提高爬虫的效率和稳定性。

使用示例#

操控浏览器#

用 ChromiumPage 对象可以轻松实现浏览器的自动化操作,比如登录、填写表单等。

from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get('https://gitee.com/login')  # 打开登录页面
# 找到账号输入框
user_login = page.ele('#user_login')
user_login.input('您的账号')  # 输入账号
# 找到密码输入框
user_password = page.ele('#user_password')
user_password.input('您的密码')  # 输入密码
# 找到登录按钮并点击
login_button = page.ele('@value=登 录')
login_button.click()

爬取数据#

用 SessionPage 对象可以高效地爬取数据,不用和网页进行复杂的交互。

from DrissionPage import SessionPage

page = SessionPage()
for i in range(1, 4):  # 循环访问三页
    page.get(f'https://gitee.com/explore/all?page={i}')  # 打开每一页
    # 找到所有项目链接元素
    links = page.eles('.title.project-namespace-path')
    for link in links:  # 遍历每个链接元素
        print(link.text, link.link)  # 打印链接的文本和地址

页面分析#

用 WebPage 对象可以在浏览器模式和数据包模式之间灵活切换,适应不同的分析需求。

from DrissionPage import WebPage

page = WebPage()
page.get('https://gitee.com/explore/all')  # 打开页面
page.change_mode()  # 切换模式
# 找到项目列表元素
items = page.ele('.ui.relaxed.divided.items.explore-repo__list').eles('.item')
for item in items:  # 遍历每个项目
    print(item('t:h3').text)  # 打印项目标题
    print(item('.project-desc.mb-1').text)  # 打印项目描述

总结#

DrissionPage 是个功能强大、使用方便的 Python 开源包,它为网页自动化和数据抓取提供了高效又灵活的解决方案。通过整合 Selenium 和 Requests 的功能,提供了无缝切换模式和简单的接口,让开发者能更专注于业务逻辑。不管是新手开发者还是有经验的专业人士,DrissionPage 都值得一试,能让我们更轻松地完成各种网页自动化任务。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。