建站程序的选择中国机械设计网
建站程序的选择,中国机械设计网,定制 网站开发 价格,建设银行网站不能登录自动化工具Drissonpage 保姆级教程(含xpath语法)
说明#xff1a;本指南仅供技术研究与学习使用#xff0c;请严格遵守相关法律法规#xff0c;仅将自动化技术应用于合法合规的场景#xff0c;如#xff1a;公开数据的采集与分析、企业内部系统的自动化测试、个人工作效率…自动化工具Drissonpage 保姆级教程(含xpath语法)说明本指南仅供技术研究与学习使用请严格遵守相关法律法规仅将自动化技术应用于合法合规的场景如公开数据的采集与分析、企业内部系统的自动化测试、个人工作效率提升工具等。严禁用于任何违法违规行为违者责任自负一、工具简介1. 什么是 DrissionPage官方网站https://www.drissionpage.cn/DrissionPage 是一个创新的 Python 网页自动化工具它巧妙地将两种主流技术融合在一起浏览器模式类似 Selenium可真实操作浏览器完美处理动态加载的网页HTTP请求模式类似 requests直接发送 HTTP 请求轻量高效核心优势你可以在同一脚本中根据需求智能切换这两种模式实现“该快的时候快该稳的时候稳”。且基于Chromium DevTools Protocol自研内核重写了Selenium的所有功能。2. 为什么选择 DrissionPage场景传统方案DrissionPage 方案静态网页数据采集requests 解析库使用请求模式速度极快动态交互操作Selenium 等浏览器驱动使用浏览器模式稳定可靠混合型任务需要编写两套代码一套代码无缝切换二、核心概念自动化技术对比工具优点缺点适用场景DrissionPage双模式融合API 简洁性能较好相对较新社区较小需要灵活切换模式的自动化任务Selenium功能强大社区活跃浏览器支持好执行速度慢资源占用高复杂交互、需要真实浏览器的场景Playwright现代化支持多浏览器自动等待学习曲线较陡现代 Web 应用测试Requests BeautifulSoup速度快资源占用低不支持 JavaScript静态页面爬虫┌─────────────────────────────────────────┐ │ 网页自动化技术对比 │ ├─────────────────────────────────────────┤ │ │ │1. 纯请求方式(requests 解析库)│ │ ✅ 优点速度快、资源占用少 │ │ ❌ 缺点无法执行JS、处理动态内容困难 │ │ │ │2. 浏览器驱动方式(Selenium等)│ │ ✅ 优点真实浏览器环境全能 │ │ ❌ 缺点速度慢、资源消耗大 │ │ │ │3. DrissionPage 融合方式 │ │ ✅ 两全其美按需切换灵活高效 │ │ │ └─────────────────────────────────────────┘三、快速上手1. 确认浏览器路径为了让Drissonpage操作本地浏览器我们需要找到本地浏览器执行文件地址。打开Chrome浏览器搜索框中输入chrome://version/复制下面可执行文件地址2. 编写代码新建Python项目并安装依赖通过pip安装Drissonpage依赖# 安装对应依赖pip install DrissionPage编写代码操作浏览器importtimefromDrissionPageimportChromiumPage,ChromiumOptions coChromiumOptions()# 填写本地浏览器路径co.set_browser_path(/Applications/Google Chrome.app/Contents/MacOS/Google Chrome)# 创建page对象pageChromiumPage(co)# 访问百度page.get(http://www.baidu.com)time.sleep(50)效果四、XPath 语法精要学习资源文档教学W3School 教程https://www.w3school.com.cn/xpath/index.asp菜鸟教程https://www.runoob.com/xpath/xpath-tutorial.html工具推荐Chrome浏览器可安装 SelectorsHub插件 可实时验证 XPath 是否正确其他浏览器也有类似插件1. 最常用语法##############基本定位##############//div# 所有div元素//div[classheader]# class为header的div//a[href/login]# href为/login的链接//button[text()提交]# 文本内容为提交的按钮##############灵活匹配##############//div[contains(class,nav)]# class包含nav的div//a[starts-with(href,https)]# href以https开头的链接//div[contains(text(),欢迎)]# 文本包含欢迎的div##############层级与顺序##############//div[idmain]//a# main元素下的所有a标签任何层级//div[idmain]/a# main元素的直接子a标签//ul/li[1]# 第一个li元素//ul/li[last()]# 最后一个li元素//tr[position()1]# 第二个及之后的tr##############文本匹配##############//a[text()立即购买]# 多条件组合//input[typetextandnameusername]# 获取属性值用于提取链接、图片等//a/href# 获取所有链接地址//img/src# 获取所有图片地址# 复杂文本匹配//div[starts-with(text(),订单编号)]# 以指定文本开头//span[contains(text(),优惠)]# 文本包含特定内容2. 调试技巧Chrome应用商店安装SelectorsHub插件安装完成后将其固定在搜索框tab打开任意网站后鼠标点击插件图标进入搜索框按下F12或者optioncommandI打开开发者工具选中需要定位的元素。比如我需要定位搜索框通过选择器定位到对应元素位置后查看对应html结构在id为chat-input-area的div元素下在SelectorsHub中输入对应xpath语法 //div[id“chat-input-area”]最后成功定位到对应元素。五、DrissionPage 核心用法1. 快速开始一个完整示例fromDrissionPageimportChromiumPageimporttime# 1. 创建浏览器页面对象pageChromiumPage()# 2. 访问网页浏览器模式page.get(https://www.baidu.com)# 3. 定位搜索框并输入多种定位方式# 方式一CSS选择器search_inputpage.ele(#kw)# 方式二XPathsearch_inputpage.ele(xpath://input[idkw])# 方式三文本匹配search_inputpage.ele(百度一下)# 搜索框输入内容search_input.input(ziyi 程序员 bilibili)# 4. 点击搜索按钮page.ele(xpath://button[idchat-submit-button]).click()# 5. 等待结果加载time.sleep(3)# 6. 打印搜索结果resultspage.eles(xpath://h3[contains(class, t)])fori,resultinenumerate(results[:5],1):titleresult.textprint(f结果{i}:{title})# 此处仅为演示效果休眠5stime.sleep(5)# 7. 关闭浏览器page.quit()效果2. 请求模式说明此处仅展示核心代码。代码中 page (ChromiumPage) 和 session (SessionPage) 是两个独立的对象。浏览器模式ChromiumPage是 Chromium 内核浏览器的页面它用 POM 方式封装了操控网页所需的属性和方法。使用它我们可与网页进行交互如调整窗口大小、滚动页面、操作弹出框等等。HTTP模式SessionPage是一个使用使用Sessionrequests 库对象的页面它使用 POM 模式封装了网络连接和 html 解析功能使收发数据包也可以像操作页面一样便利。使用它可以请求后端接口发起http请求。# 浏览器模式获取动态 tokenpage.get(https://m.weibo.cn)tokenpage.ele(meta[namecsrf]).attr(content)# 切换到 HTTP 模式批量抓取sessionSessionPage()forpage_numinrange(1,6):urlfhttps://m.weibo.cn/api/feed?token{token}page{page_num}session.get(url)print(session.json[data])3. 元素定位方法官方教程https://drissionpage.cn/dp40docs/get_elements/syntax# 查找单个元素elementpage.ele(选择器)# 支持多种选择器elementpage.ele(xpath://div[idcontent])elementpage(选择器)# 简化写法# 查找多个元素elementspage.eles(选择器)# 返回列表elementspage.eles(xpath://a[classlink])# 链式查找parentpage.ele(#container)childparent.ele(.item)# 在父元素内查找all_childrenparent.eles(tag:div)# 查找所有div子元素4. 常用交互操作# 输入文本element.input(要输入的文本)element.input(文本,clearTrue)# 先清空再输入# 点击操作element.click()# 左键单击element.click(by_jsTrue)# 使用JavaScript点击规避一些限制# 获取信息textelement.text# 获取元素文本htmlelement.html# 获取内部HTMLattr_valueelement.attr(href)# 获取属性值# 下拉框选择fromDrissionPageimportSelect selectSelect(element)# 包装为Select对象select.select(选项文本)# 按文本选择select.select(index0)# 按索引选择# 文件上传element.input(文件路径)# 对于文件输入框5. 等待与跳转## 智能等待推荐# 等待单个匹配选择器的元素在页面上变为可见状态显式等待元素出现最多10秒。# 比如等待页面出现button为登录按钮page.wait.ele_displayed(xpath://button[contains(text(), 登录)],timeout10)# 等待一组匹配选择器的元素加载完成存在于DOM中# 选择所有 class 属性值中包含 AnswerItem 这个单词的HTML元素page.wait.eles_loaded(.AnswerItem,timeout10)# 等待页面跳转完成page.wait.load_start()page.wait.load_complete()# 强制等待importtime time.sleep(2)# 页面导航page.get(https://example.com)# 跳转到新页面page.back()# 后退page.forward()# 前进page.refresh()# 刷新6. 登录态保持绝大部分网站都需要校验登录态因此保持登录态是很有必要的。# 浏览器模式登录page.get(https://passport.zhihu.com/login)page.ele(#username).input(userexample.com)page.ele(#password).input(your_password)page.ele(button[typesubmit]).click()# 同步 Cookie 到 HTTP 模式session.cookiespage.cookies# 使用共享登录态session.get(https://www.zhihu.com/notifications)7. 反爬绕过目前很多网站都做了反爬策略不过可以通过如下一些操作绕过一些检测。指纹伪装配置让爬虫看起来像是用户通过真实浏览器发送的请求coChromiumOptions()# 修改浏览器指纹co.set_user_agent(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)co.set_platform(Win32)co.set_resolution(1920,1080)# 禁用 WebRTC。WebRTC是一项允许浏览器进行实时音视频通信的技术禁用它可以绕过反爬## 核心原因是它能泄露你的真实IP地址让网站发现你使用了代理从而暴露爬虫身份。co.set_argument(--disable-webrtc)流量特征优化通过随机延迟点击、滚动等操作时间绕过机器检测让爬虫看起来更像真人# 随机化操作间隔importrandom page.set.click_options(interval(0.5,2))# 模拟人类滚动page.scroll.to_bottom(step300,duration1.5)设置代理IP通过配置代理IP降低同一IP请求频次### 模式一直接操作浏览器网页方式# 对于 ChromiumPage (浏览器模式) - 正确方式coChromiumOptions()co.set_proxy(http://127.0.0.1:1080)# 通过选项设置pageChromiumPage(co)### 模式二HTTP请求方式# 对于 SessionPage (请求模式)sessionSessionPage()session.proxies{http:http://127.0.0.1:1080,https:https://127.0.0.1:1080}# 支持http/https# 或使用 set.proxies() 方法session.set.proxies(http://127.0.0.1:1080)六、实战项目知乎热门问题数据获取需求说明目标采集知乎热榜前 20 问题字段标题、热度值难点动态加载、登录验证、反爬机制、数据提取、结果持久化代码示例fromDrissionPageimportChromiumPage,ChromiumOptionsimportpandasaspdimporttimeimportrandomdefget_zhihu_top20(): 获取知乎Top20榜单数据 功能涵盖反爬优化、登录态、数据提取、结果持久化 # 1. 基础配置与反爬coChromiumOptions()co.set_user_agent(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)# 后续可设置账号池、IP代理池等# 2. 创建浏览器对象pageChromiumPage(addr_or_optsco)page.get(https://www.zhihu.com)time.sleep(2)# 3. 处理登录简化版需手动干预后续可自动配置账号密码自动化登录# 检查当前是否是未登录状态ifpage.ele(xpath//div[idroot]/div/main/div[classSignFlowHomepage]):print(请手动完成登录...)print(1. 如需扫码请直接用手机知乎APP扫码)print(2. 如需密码登录请在页面输入账号密码)print(3. 登录成功后请回到程序按回车继续)input(完成后请按回车键...)# 暂停等待用户手动操作print(继续执行...)else:print(当前已登录无需登录。)# 4. 访问热榜并抓取数据page.get(https://www.zhihu.com/hot)# 等待页面元素加载page.wait.eles_loaded(.HotItem,timeout10)results[]# 等待并获取热榜条目itemspage.eles(css:.HotItem)foriteminitems[:20]:# 只取前20条try:titleitem.ele(.HotItem-title).text heatitem.ele(.HotItem-metrics HotItem-metrics--bottom).text results.append({标题:title,热度:heat})time.sleep(random.uniform(0.1,0.3))# 微小延迟避免请求过快exceptExceptionase:print(f处理条目时出错:{e})# 5. 保存结果ifresults:dfpd.DataFrame(results)df.to_excel(知乎热榜.xlsx,indexFalse)print(f成功获取{len(results)}条热榜数据已保存至 知乎热榜.xlsx)else:print(未获取到数据可能是选择器失效或页面未正确加载。)# 保持浏览器打开供检查生产环境可关闭# page.quit()if__name____main__:get_zhihu_top20()效果七、常见问题解决问题1元素找不到解决1.增加等待时间2.检查选择器是否正确3.使用更稳定的定位方式问题2点击无效解决1.尝试 click(by_jsTrue)2.先滚动到元素位置3.等待元素可点击问题3页面加载慢解决1.设置超时时间2.禁用图片加载3.使用请求模式获取数据问题4被网站检测反爬限制解决1.添加随机延迟2.使用代理IP、账号池3.模拟人类操作模式