02-DrissionPage

先将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算基本了解了,到时候使用多去看文档即可,加油加油

相关推荐
Pyeako3 小时前
操作HTML网页(PyCharm版)
爬虫·python·html
傻啦嘿哟4 小时前
学术爬虫实战:构建知网论文关键词共现网络的技术指南
网络·爬虫
几分醉意.6 小时前
Bright Data AI Scraper Studio:用一句Prompt,自动生成企业级爬虫架构
人工智能·爬虫·prompt
sugar椰子皮17 小时前
【爬虫框架-3】闭包的用法
爬虫
齐齐大魔王1 天前
python爬虫学习进程(四)
爬虫·python·学习
毕设源码-钟学长1 天前
【开题答辩全过程】以 基于Python爬虫的二手房信息爬取及分析为例,包含答辩的问题和答案
开发语言·爬虫·python
Glommer1 天前
Akamai 逆向思路
javascript·爬虫·逆向
知识浅谈1 天前
传统爬虫太耗时?AI一键生成企业级爬虫架构
人工智能·爬虫
工业互联网专业1 天前
基于爬虫的个性化书籍推荐系统_flask+spider
爬虫·python·flask·毕业设计·源码·课程设计