1.DrissionPage的安装
| 1
 |  pip3 install DrissionPage
 | 
 
如果无法安装,可以试下国内镜像
| 1
 | pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --upgrade  DrissionPage
 | 
 
2.DrissionPage
2.1.简介
DrissionPage(http://drissionpage.cn)是一个基于 python 的网页自动化工具。
它既能控制浏览器,也能收发数据包,还能把两者合而为一。
可兼顾浏览器自动化的便利性和 requests 的高效率。
它功能强大,内置无数人性化设计和便捷功能。
它的语法简洁而优雅,代码量少,对新手友好。
2.2.版本及支持情况
- 最新版本:4.0.4.24
- 支持系统:Windows、Linux、Mac
- python 版本:3.6 及以上
- 支持应用:Chromium 内核浏览器(如 Chrome、Edge),electron 应用
3.使用示例
一般情况下,如果针对多个不同页面进行处理,定义个页面处理模板BaseDrissionPage
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 | import csv
import os
from DrissionPage import ChromiumPage, ChromiumOptions
class BaseDrissionPage(object):
    
    def __init__(self):
        self.file_name = None
        self.url = None
        self.page = None
    def set_city_page_info(self, file_name, url):
        self.file_name = file_name
        self.url = url
        self.__load_csv()
        self.__load_city_page()
    def __load_city_page(self):
        if not self.url:
            return
        co = ChromiumOptions().auto_port()
        self.page = ChromiumPage(co)
        self.page.get(self.url)
        self.page.wait.load_complete()
        self.parse_page()
        self.page.close()
    def parse_page(self):
        # 解析页面
        pass
 | 
 
其子类负责处理页面及数据存取即可
3.1.ChromiumPage配置
co = ChromiumOptions().auto_port()确保新启浏览器窗口,并分配端口,可以正常访问。
若无该配置,是在同一个浏览器窗口中
3.2. 为什么self.page.get(self.url)之后,
要添加要self.page.wait.load_complete()
确保页面加载完成,页面内的元素是存在的;不然,可能出现页面元素缺失造成元素定位失败。
3.3.页面关闭
self.page.close()关闭浏览器标签页面或窗口,回收资源
如果是点击某个页面新元素,触发打开新页面,例如:
| 1
2
3
4
5
 |     link_element.click()
    self.page.wait.load_complete()
    # 确保页面是打开了,不然,不做处理。
    if self.page.tabs_count > 1:
        city_names = self.get_city_names_from_new_page(name)
 | 
 
get_city_names_from_new_page的实现
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 |  def get_city_names_from_new_page(self, name):
        new_page = self.page.get_tab(self.page.latest_tab)
        info_element = new_page.ele('·城市:')
        if info_element is None:
            print(f'info_element NONE')
            return None
        city_names = None
        if info_element:
            info_text = info_element.text
            ...
            
        new_page.close()
        return city_names
 | 
 
确保打开新页面和关闭是配对的。
4.页面处理
官方文档写的很细致,全面,下面只介绍些常用的,感兴趣的可以了解下;
4.1.页面交互
4.2.元素查找
| 1
2
3
 | 
# page内查找id属性为city_id的元素
ele = page.ele('#city_id')  
 | 
 
| 1
2
3
 | 
# page内查找class属性city_id的元素
ele = page.ele('#city_id')
 | 
 
| 1
2
3
4
5
 | # 定位div元素
ele2 = ele1.ele('tag:div')
# 定位class属性为city_id的p元素
ele2 = ele1.ele('tag:p@class=city_id')
 | 
 
如果查找的元素是数组,由ele更换为eles
| 1
2
3
4
5
 | # 获取 ele1 的第二层父元素
ele2 = ele1.parent(2)
# 获取 ele1 父元素中 id 为 id1 的元素
ele2 = ele1.parent('#id1')
 | 
 
5.其它
以上可以满足多数页面处理需求,仅仅只做学习展示使用。
除了上面关于ChromiumPage的使用,单纯用于操作浏览器的页面对象,还有
像WebPage(整合浏览器控制和收发数据包于一体的页面对象) , SessionPage(单纯用于收发数据包的页面对象)可以了解下
         
        
        
  
    文章作者
    梵梵爸
  
  
    上次更新
    
      2024-06-07
      
    
  
  
  
    许可协议
    原创文章,如需转载请注明文章作者和出处。谢谢