搞爬虫的不会没听过拽神这个项目吧

引言
之前一直玩整站采集,采集所有ebay,amazon,taobao,tiktok,dy,xhs,搞大数据采集的优点鄙视链,鄙视这种操控系列的。然而后面发现反而是这种小需求采集,业务需求特别大,不用破解不用大规模工程化,开发也简单。 下面这个工具是我常用工具之一,配合指纹浏览器很爽,直接放弃selenium
DrissionPage 简介
DrissionPage 是一个用 Python 写的网页自动化工具,它把 Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式(就像用 Selenium 那样)和无浏览器模式(类似用 requests)之间自由切换。有了这个功能,不管是处理需要 JavaScript 渲染的动态网页内容,还是抓取简单的静态页面数据,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 也更合理了。这对开发者调试和采集数据有很大帮助。
旧 API 变化
在旧版本(3.2)里,抓包功能主要靠 FlowViewer 和 wait.data_packets()
来实现,但存在漏抓数据、信息不全、API 设计不合理等问题。在 4.0 版本中,对旧的 API 做了很多调整:
- 不再使用 FlowViewer,以后也不会再升级它了。
- 删除了
wait.stop_listening()
方法。 - 删除了
wait.data_packets()
方法。 DrissionPage.common
路径下的 FlowViewer
也被删掉了。
新 API
- 每个标签页对象(包括
ChromiumFrame
)都多了一个 listen
属性,有监听功能。 - 可以用
listen.start()
和 listen.stop()
来启动和停止监听。 - 用
listen.steps()
能同步获取监听结果。 - 增加了
listen.wait_silent()
来等待所有请求完成(包括不在目标范围内的请求)。 - 监听结果的结构也优化了,请求和响应的数据分开存放。
示例
下面这个例子可以直接运行看看效果,它还会记录时间,能让你了解 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 版本都解决了,而且用户可以自己控制什么时候终止连接。另外,还对连接逻辑做了优化,避免出现卡死的情况。
API 变化
- 页面对象的
page_load_strategy
属性改名叫 load_mode
了。 set.load_strategy
改成 set.load_mode
了。
行为变化
get()
方法的 timeout
参数现在对整个过程都有用了。timeout
参数对不是
get()
方法触发的页面加载(像点击链接)也能起作用。SessionPage
和 WebPage
的 s 模式,如果收到空数据,会自动重试。SessionPage
的 get()
方法可以打开本地文件了。
新的 none
加载模式
在旧版本里,none
加载策略是页面连接成功就马上停止加载,实际用处不大。在新版本里,这个模式改成:除非页面加载完成,否则程序不会主动停止加载(就算超时了也不会),同时连接状态不会阻碍程序运行,用户可以自己判断状态,主动停止加载。这样用户就有很大的自由,可以等关键数据包或者元素出现了,就主动停止页面加载,大大提高执行效率。
示例
还是用上面那个例子的代码,不过把加载模式设置成
none
,等拿到数据就主动停止加载。
from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint
page = ChromiumPage()
page.set.load_mode.none() # 设置加载模式为 none
page.listen.start('api/getkeydata') # 指定监听目标并启动监听
pinner = Pinner(True, False)
page.get('http://www.hao123.com/') # 访问网站
packet = page.listen.wait() # 等待数据包
page.stop_loading() # 主动停止加载
pprint(packet.response.body) # 打印数据包正文
pinner.pin('用时', True)
使用场景
网页自动化测试
利用 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 都值得一试,能让我们更轻松地完成各种网页自动化任务。
在实际使用的时候,我们可以根据具体需求选择合适的页面对象和模式,结合它丰富的功能和方便的操作方法,提高开发效率和代码质量。同时,也要注意遵守网站的爬虫规则,合理使用这个工具,别给网站造成不必要的麻烦。