drissionpage知识整理与某数等反爬产品绕过实战
概述
DrissionPage是一个基于 Python 的网页自动化工具。既能控制浏览器,也能收发数据包,还能把两者合而为一。可兼顾浏览器自动化的便利性和 requests 的高效率。功能强大,语法简洁优雅,代码量少,对新手友好。
入门文档
drissionpage作者提供了详细的入门教程,这里就列出用法了,需要时直接到官方文档查询即可。
官方文档还提供了几个大佬录制的视频教程,方便食用
主页面对象
主页面对象有 3 种,它们通常是程序的入口:
- ChromiumPage:单纯用于操作浏览器的页面对象
- WebPage:整合浏览器控制和收发数据包于一体的页面对象
- SessionPage:单纯用于收发数据包的页面对象
我的理解是:
WebPage其实整合了ChromiumPage和SessionPage两个页面对象
而ChromiumPage跟selenium、playwright应用上差不多,可操控浏览器
SessionPage是一个使用使用Session(requests 库)对象的页面,是一个使用使用Session(requests 库)对象的页面,它使用 POM 模式封装了网络连接和 html 解析功能,收发数据包效果跟requests相同,不过它提供了丰富的功能。
采集案例
某书搜索列表页
刚遇到问题,就是某书的搜索列表页是没有滚动条的,一般情况下只能鼠标滚轮滚动
大家估计都会使用下面这种方式来实现翻页
wp = WebPage()
wp.get('url')
wp.listen.start('web/v1/search/notes')
ac = Actions(wp)
packet = wp.listen.wait()
ac.scroll(delta_y=1500)
但是这种方式循环滚动两次后,会发现一直卡在第三次循环,这是啥原因呢
这是因为此时的scroll
是对driver对象
进行操作的,那它只会滚动到浏览器界面的最大值,不会再重置后继续滚动了,也就导致了程序一直处于wp.listen.wait()
这一步。
这时其实可以使用执行JavaScript代码的方式实现屏幕滚动,下面代码既可以解决问题
wp.run_js('''
// 滚动函数
function scrollDown() {
window.scrollBy(0, 2000); // 向下滚动2000像素
}
// 设置定时器,每隔1秒调用一次滚动函数
setInterval(scrollDown, 1000);
''')
说到底scroll
方法操作的对象是元素。
某瓣小说封面
简单采集某瓣小说封面,更多案例可以看官方文档提供的。
import os.path
from DrissionPage import ChromiumPage, ChromiumOptions
from DrissionPage import SessionPage
def download():
dp = ChromiumOptions().set_paths(browser_path=r'C:\Program Files\Google\Chrome\Application\chrome.exe')
page = ChromiumPage(dp)
page.get('https://book.douban.com/tag/小说?start=0&type=T', retry=3, interval=2, timeout=15)
for _ in range(2):
for book in page.eles('x://li[@class="subject-item"]'):
book_name = book.ele('x://h2/a').attr('title')
img = book('x://img')
img.save(path='./img/', name=f"{
book_name}.png")
print(f"{
book_name}.png 保存成功!")
# 点击下一页
page('后页>').click()
page.wait.load_start()
page.close()
def headless_download():
""" 无头模拟实现 """
page = SessionPage()
if not os.path.exists('./img'):
os.mkdir(