Python爬虫使用DrissionPage库爬取网页信息(第35节)


从互联网的普及到人工智能的崛起,网络数据如同隐藏在深处的宝藏,谁能精准挖掘并善加利用,谁就能在激烈的市场竞争中占据优势。网络爬虫技术已成为众多行业进行数据采集与分析的关键工具。Python作为一门强大的编程语言,凭借其简洁易用的语法和丰富的运用库,成为了构建网络爬虫的首选编程语言。

Python爬虫常用的库包括requests、Selenium、DrissionPage、BeautifulSoup、Scrapy、PyQuery等。这些库分别用于发送HTTP请求、解析HTML和XML文档、构建高效的爬虫系统、模拟浏览器行为以及操作DOM元素。其中,DrissionPage库以其独特的“驱动浏览器功能结合HTTP请求”创新模式,将Selenium库的浏览器自动操控技术与Requests库的高效数据抓取功能深度整合,提供统一的API接口,操作简便,成为越来越多Python开发者的首选工具库。

一、DrissionPage库简介

DrissionPage库是一个强大的Python第三方库,集成了Selenium库和Requests库,是新一代网页自动化工具库,用于控制浏览器和获取网页数据,支持Chrome和Edge浏览器驱动。它不仅可以模拟用户操作,还能监听网络请求和响应,非常适合处理动态加载的数据。

DrissionPage库具有以下特点:

操作简便:Selenium库虽然功能强大,但代码复杂度较高,DrissionPage库则通过封装常用操作,提高了自动化脚本的开发效率,让用户可以在浏览器模式(Selenium)和无浏览器模式(requests)之间自由切换。

高效切换:在需要JavaScript处理的复杂网页中,使用浏览器模式;在无需浏览器渲染的简单页面中,使用无浏览器模式,从而提高爬虫效率。

灵活定制:支持开发者自定义请求头、代理、超时设置等,让网页抓取更加灵活。

网页自动化测试:通过Selenium的功能,模拟用户打开浏览器操作,进行自动化测试,自动化抓取动态渲染的网页内容。

复杂的数据抓取:使用requests库获取静态页面数据,处理复杂页面时,将程序切换到浏览器模式,可以应对不同类型的网页抓取需求。

二、DrissionPage环境要求

DrissionPage作为Python的第三方库,是一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持。然而,要充分发挥其强大而便捷的功能,正确搭建运行环境是第一步。在开始使用DrissionPage库前,请确保你的电脑系统满足以下基本条件:

操作系统:Windows/macOS/Linux(均支持)

Python版本:3.7及以上(推荐3.8+)

浏览器要求:必须安装基于Chromium内核的浏览器,包括Microsoft Edge浏览器或者Google Chrome谷歌浏览器。

三、基础环境搭建步骤

1、 安装DrissionPage库

确保你已经安装了DrissionPage库,如果还没有安装,可以通过pip安装,执行以下命令:

pip install DrissionPage

2、浏览器配置(关键步骤)

尝试启动浏览器

DrissionPage会自动控制浏览器,如果没有手动设置浏览器路径,默认状态下,DrissionPage会自动检测Chrome谷歌浏览器的路径,程序会自动在电脑系统内查找Chrome.exe可执行文件的路径,例如:

动手练一练:

from DrissionPage import ChromiumPage

# 创建/打开一个浏览器,默认Chrome浏览器
# 设置本地启动端口“9999”,如果不指定端口,则默认使用“9222”端口
page = ChromiumPage(9999)

# 访问网址
page.get('https://www.baidu.com')

执行以上代码,如果Chrome浏览器成功启动,并且成功访问了“https://www.baidu.com”网站,则说明DrissionPage可直接使用浏览器。

如果上面的步骤提示错误,则说明程序在电脑系统中未找到Chrome浏览器,则需手动配置Chrome浏览器路径,配置方法如下:

首先,打开谷歌Chrome浏览器,在浏览器地址栏内输入以下地址后按下Enter回车键,拿到可执行文件的路径。这里需要注意的是,不同的操作系统中Chrome浏览器默认的安装路径各不一样。在Windows中,大多数软件在安装时会默认选择将其安装在"Program Files"文件夹下(对于32位系统)或"Program Files (x86)"文件夹下(对于64位系统)。

动手练一练:

chrome://version/

如下图所示:

Python爬虫使用DrissionPage库爬取网页信息

接着,复制以上路径“C:\Program Files (x86)\Chromebrowser\Chrome.exe”,再通过运行以下Python代码,配置DrissionPage库中默认的浏览器路径:

动手练一练:

from DrissionPage import ChromiumOptions

# 创建配置对象并设置浏览器路径
co = ChromiumOptions()
co.set_browser_path(r'C:\Program Files (x86)\Chromebrowser\Chrome.exe')  # Windows示例路径
co.save()  # 保存配置

执行以上代码,输出:

配置已保存到文件: E:\Pyhint\condition\Python38\lib\site-packages\DrissionPage\_configs\configs.ini
以后程序可自动从文件加载配置

如果Python解释器输出以上信息,则表示配置成功,成功后该配置会持久化记录到默认配置文件中,之后程序会使用该配置启动程序。

更改浏览器配置

如果电脑系统中没有安装Chrome浏览器,可以设置Edge浏览器为启动浏览器。配置方法与Chrome浏览器类似,首先,在Edge浏览器地址栏内输入以下地址,拿到可执行文件的路径 。

动手练一练:

edge://version/

Python爬虫使用DrissionPage库爬取网页信息

接着,复制以上路径“C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe”,再通过运行以下Python代码,配置Edge浏览器为默认的浏览器:

动手练一练:

from DrissionPage import ChromiumOptions

# 创建配置对象并设置浏览器路径
co = ChromiumOptions()
co.set_browser_path(r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe')  # Windows示例路径
co.save()  # 保存配置

执行以上代码,输出:

配置已保存到文件: E:\Pyhint\condition\Python38\lib\site-packages\DrissionPage\_configs\configs.ini
以后程序可自动从文件加载配置

如果输出以上信息,则表示配置成功,成功后该配置会持久化记录到默认配置文件中,之后程序会使用该配置启动程序。

3、 控制浏览器

爬取网页标题

现在,我们编写简单的测试代码,控制浏览器获取网页标题。例如:

动手练一练:

from DrissionPage import ChromiumPage

# 设置本地启动端口“9999”,如果不指定端口,则默认使用“9222”端口
page = ChromiumPage(9999)

# 访问网址
page.get('https://www.baidu.com')

# 打印页面标题
print(page.title)  # 输出 “百度一下,你就知道”

执行以上代码,如果能自动打开浏览器访问“https://www.baidu.com”网站,并且Python解释器输出网站标题“百度一下,你就知道”,则说明爬取网站标题成功。此时,我们点击已打开的浏览器再按F12或者打开“开发者工具”,可以看到html页面代码中的网站标题代码如下:

<title>百度一下,你就知道</title>

以上就是百度网页html中的网站标题代码,如果不熟悉html代码,可以查看本教程的第23章《HTML基础学习 》

爬取网页中的部分内容

前面的例子中,我们通过简单的代码爬取网站标题,我们同样可以通过DrissionPage爬取网页中的部分内容。首先,我们先来观察一下百度首页的页面结构,打开百度后按F12或者打开“开发者工具”,可以看到html页面中的百度热搜都用到了title-content-title类,那我们就可以通过这个类名来获取所有百度热搜的内容。如下图所示:

Python爬虫使用DrissionPage库爬取网页信息

动手练一练:

from DrissionPage import ChromiumPage

# 设置本地启动端口“9999”,如果不指定端口,则默认使用“9222”端口
page = ChromiumPage(9999)

# 访问网址
page.get('https://www.baidu.com')

# 这里我们通过类名获取元素,返回一个list列表
lists = page.eles('.title-content-title')

# 遍历list列表中所有的元素并打印
for i in lists:  
    print(i.text)

执行以上代码,输出结果为:

波音客机坠毁致157人遇难 最新进展
李阳称董宇辉英语差发音怪
人民日报绝不容忍高市早苗越线挑衅
神舟二十号乘组将于今日返回
孙卫东奉示召见日本大使提严正交涉
海军四川舰开展首次航行试验
小孩哥小孩姐惊艳十五运会
1444.49中国探明首个千吨级金矿
中国的愤怒在升级

上面的例子中,我们通过class类名来获取指定元素,DrissionPage不但能通过类名获取内容,也可以能通过id名,标签名获取内容。下面我们通过本地电脑创建一个html文件来模拟一个打开的网页,首先,在电脑的任意文件夹里创建一个html文件,比如在E盘创建一个名为test.html的文件,再选择“记事本”打开方式编辑test.html文件,输入以下内容并保存:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>这是网页标题</title>
    </head>
    <body>
        <h1>这是页面的h1主标题</h1>
        <div class="myClass">第一行</div>
        <div class="myClass">第二行</div>
        <div class="myClass">第三行</div>
        <div class="myClass">第四个div</div>
        <div id="myId">Id内容</div>
        <div id="myId1">Id1内容</div>
        <div id="myId2">Id2内容</div>
        <p>这是第一个段落。</p>
        <p>这是第二个段落。</p>
    </body>
</html>

最后,我们通过浏览器运行以上HTML文件。鼠标右键点击test.html文件,选择打开方式为浏览器。效果如下图所示:

Python爬虫使用DrissionPage库爬取网页信息

现在我们通过代码爬取页面中的指定内容,例如:

动手练一练:

from DrissionPage import ChromiumPage

# 设置本地启动端口“9999”,如果不指定端口,则默认使用“9222”端口
page = ChromiumPage(9999)

# 打开网页或路径,注意路径前必须加“r”,否则路径中的“\t”会被转义成一个制表符(tab字符)
page.get(r'E:\test.html')

# 打印页面标题
print(page.title)  # 输出 “这是网页标题”

# 获取h1主标题内容
page_h1 = page.ele('tag:h1')
print(page_h1.text)  # 输出 “这是页面的h1主标题”

# 获取p元素的所有内容
page_p = page.eles('tag:p')
# 遍历page_p列表中所有的元素并打印
for i in page_p:  
    print(i.text)
# 输出 “这是第一个段落。”
# 输出 “这是第二个段落。”

# 获取id为myId的元素
div1 = page.ele('#myId')
print(div1.text)  # 输出 Id内容

# class属性定位
tag1 = page.ele('@class=myClass')  # 获取第一个class为myClass的元素
print(tag1.text)  # 输出 第一行

# 文本定位
tag2 = page.ele('@text()=第一行')  # 获取第一个文本为“第一行”的元素
print(tag2.text)  # 输出 第一行

# 当需要多个条件同时确定一个元素时,每个属性用'@@'开头。
tag3 = page.ele('@@class=myClass@@text()=第三行')  # 查找class为myClass且文本为“第三行”的元素
print(tag3.text)  # 输出 第三行

# 当需要以或关系条件查找元素时,每个属性用'@|'开头。
tag4 = page.eles('@|id=myId1@|id=myId2')  # 查找所有id为myId1或id为myId2的元素
print(tag4)

# 表示模糊匹配,匹配含有指定字符串的文本或属性。
tag5 = page.eles('@id:myId')  # 获取id属性包含'myId'的元素
print(tag5)

# 表示匹配开头,匹配开头为指定字符串的文本或属性。
tag6 = page.eles('@id^myId')  # 获取id属性以'myId'开头的元素
print(tag6)

# 表示匹配结尾,匹配结尾为指定字符串的文本或属性。
tag7 = page.ele('@id$Id2')  # 获取id属性以'Id2'结尾的元素
print(tag7)

执行以上代码,输出结果为:

这是网页标题
这是页面的h1主标题
这是第一个段落
这是第二个段落
Id内容
第一行
第一行
第三行
[<ChromiumElement div id='myId1'>, <ChromiumElement div id='myId2'>]
[<ChromiumElement div id='myId'>, <ChromiumElement div id='myId1'>, <ChromiumElement div id='myId2'>]
[<ChromiumElement div id='myId'>, <ChromiumElement div id='myId1'>, <ChromiumElement div id='myId2'>]
<ChromiumElement div id='myId2'>

上面的例子中,ele()方法是获取匹配到的第一个元素,eles()是获取匹配到的所有元素,返回一个list列表。get()方法用于跳转到一个网址。当连接出现失败时,程序会进行重试。该方法返回一个bool布尔类型,表示是否连接成功。