先将DP文档放这里:DP文档,然后我们来一起学习一下DrissionPage
导包
先下载DrissionPage:
python
# pip install DrissionPage
我们最常用的基本就这两个:
python
# 定位
from DrissionPage.common import By
# 开启浏览器
from DrissionPage import Chromium
浏览器初始化与网页访问
python
# 创建浏览器对象
webdriver = ChromiumPage()
# 访问百度
webdriver.get('https://www.baidu.com/')
元素定位
单元素定位:
python
# url - https://www.baidu.com/
# 定位元素(ele括号里需要传递元组)
textarea = webdriver.ele((By.XPATH, '//textarea[@id="chat-textarea"]')).input('索隆')
button = webdriver.ele((By.XPATH, '//button[@id="chat-submit-button"]')).click()
time.sleep(2)
多元素定位:
python
# url - https://movie.douban.com/top250
# 获取多标签
lis = webdriver.eles((By.XPATH, '//ol[@class="grid_view"]/li')) # 这里返回的是DrissionPage Element对象列表
for li in lis:
title = li.ele((By.XPATH, './div[@class="item"]/div[@class="info"]/div/a/span')).text # @xxx可以换为索引,索引是从1开始
url = li.ele((By.XPATH, './div[@class="item"]/div[2]/div/a')).attr('href')
print(title, url)
标签等待
代码如下:
python
# 标签等待(找不到元素会等待两秒后返回false) 一般翻页时有下一页那种可以作为判断条件
textarea = webdriver.wait.eles_loaded((By.XPATH, '//textarea[@id="False"]'), timeout=2)
print(textarea)
模拟登录
与selenium不同,不需要切换为iframe模式:
python
# 模拟登录豆瓣
from DrissionPage import ChromiumPage
from DrissionPage.common import By
import time
webdriver = ChromiumPage()
webdriver.get('https://www.douban.com/')
webdriver.ele((By.CLASS_NAME, 'account-tab-account')).click()
webdriver.ele((By.ID, 'username')).input('admin123')
webdriver.ele((By.ID, 'password')).input('admin123')
time.sleep(2)
# 根据文本(text中的文字)定位
webdriver.ele((By.LINK_TEXT, '登录豆瓣')).click()
time.sleep(1)
print('已登录,正在关闭自动化脚本...')
time.sleep(2)
webdriver.quit()
接口监听
这个是DrissionPage的撒手锏,当我们没有学js逆向时,可以用这个监听接口,直接拿到接口数据:
python
# gov采购网接口监听 http://www.ccgp-hunan.gov.cn/page/notice/more.jsp
from DrissionPage import ChromiumPage
from DrissionPage.common import By
webdriver = ChromiumPage()
# 开启监听(在加载网页之前就要设置)
webdriver.listen.start('mvc/getNoticeList4Web.do')
# 进入网页
webdriver.get('http://www.ccgp-hunan.gov.cn/page/notice/more.jsp')
# # 打印监听到的数据(一个接口)
# gen_data = webdriver.listen.steps() # 这里返回的是一个生成器
# for gen_res in gen_data:
# """print(gen_res) # 这里返回的是数据包"""
# # 从数据包中拿到返回值
# res = gen_res.response.body
# print(res)
# 打印多个接口数据
i = 0
for api_ in webdriver.listen.steps(count=10):
# webdriver.ele((By.LINK_TEXT, '下一页')).click()
# print('接口数据', api_.response.body)
if webdriver.wait.eles_loaded((By.LINK_TEXT, '下一页')):
webdriver.ele((By.LINK_TEXT, '下一页')).click()
print(f'正在爬取第{i+1}页\n内容为:', api_.response.body)
i += 1
else:
print(f'共爬取{i}页数据,当准备爬取第{i+1}页时返回{webdriver.wait.eles_loaded((By.LINK_TEXT, "下一页"))}, 爬虫结束...')
break
# 记得关闭浏览器
webdriver.quit()
这里就将webdriver.wait.eles_loaded((By.LINK_TEXT, '下一页'))作为了判断条件
动作链
动作链有很多,用的时候直接去[DP文档](https://www.drissionpage.cn/browser_control/intro/)中找即可,这里讲解一个动作链的用途------过验证码:
python
# 拖动验证码
from DrissionPage import ChromiumPage
from DrissionPage.common import By
url = 'https://www.ynjzjgcx.com/mohurd/data-query/enterprise?keyword=%E5%B0%8F%E7%B1%B3'
webdriver = ChromiumPage()
webdriver.get(url)
"""动作链"""
# 先叉掉点选验证码
webdriver.ele((By.XPATH, '//div[@class="mask"]/div/div/span[@class="verifybox-close"]')).click()
# 点击翻页
webdriver.ele((By.XPATH, '//ul[@class="el-pager"]/li[2]')).click()
button = webdriver.ele((By.XPATH, '//div[@class="verify-bar-area"]/div/div[@class="verify-move-block"]/i'))
# 按住按钮 # 向右移动300px,然后松手
webdriver.actions.hold(button).right(300).release()
webdriver.quit()
这里只是拖动,我们需要结合其他识别的库,比如ddddocr这种库来识别验证码然后计算距离然后过验证
SessionPage的使用
python
# SessionPage的使用(不用开启浏览器)
from DrissionPage import SessionPage
url = 'http://www.ccgp-hunan.gov.cn/mvc/getNoticeList4Web.do' # 这里应该写接口的url
data = {
'pType': '',
'prcmPrjName': '',
'prcmItemCode': '',
'prcmOrgName': '',
'startDate': '2025-01-01',
'endDate': '2025-12-04',
'prcmPlanNo': '',
'page': '16',
'pageSize': '18',
}
# 创建Session对象
session = SessionPage()
session.post(url, data=data) # 没有返回值
print(session.response.json()) # 不是json数据将.json改为.text查看原文数据
# 关闭session对象,释放资源
session.close()
小结
看完这些DP算基本了解了,到时候使用多去看文档即可,加油加油