我心中的王者:Python-第22章 Selenium网络爬虫的王者

我心中的王者:Python-第22章 Selenium网络爬虫的王者

在21-2-5小节笔者有介绍有些网页服务器会阻挡网络爬虫读取网页内容,我们可以使用headers的定义将爬虫程序伪装成浏览器,这样我们克服了读取网页内容的障碍。

Selenium功能可以控制浏览器,所以当使用Selenium当爬虫工具时,网络服务器会认为来读取数据的是浏览器,所以不会有被阻挡无法读取网页HTML原始文件的问题。当然Selenium功能不仅如此,可以使用它单击链接,填写登录信息,甚至订票系统、抢购系统等。

22-1 顺利使用Selenium工具前的安装工作

如果想要在Windows系统内顺利使用Selenium执行工作,必须安装下列3项工具以及一个设定。

① Selenium工具。

②浏览器,使用Selenium市面上最常见是安装Firefox,也可以是Chrome或IE,本书将以Firefox为主要说明。另外,也会说明安装Chrome方式。

③ 驱动程序,这是指Selenium驱动浏览器的程序,其实这部分信息很重要,但是目前极少文件有说明,因此常造成读者学习上的障碍。因为依照一般说明,结果是错误信息。

22-1-1 安装Selenium

这个部分相对单纯,可以使用下列方式安装Selenium:

 pip install selenium

未来程序的导入稍微不一样,如下所示:

 from selenium import webdriver

22-1-2 安装浏览器

这部分也相对单纯,可以至https://www.mozilla.org网页下载Firefox:

22-1-3 错误的实例

目前许多文件书写安装完上述2项后,就可以使用Selenium设计网络爬虫程序了,下列是普遍书写的第一个Selenium程序。

程序实例ch22_1.py:建立Firefox浏览器对象,然后列出这个对象的数据类型,有关程序的细节说明,笔者将在22-2节解说。

# ch22_1.py
from selenium import webdriver

browser = webdriver.Firefox()
print(type(browser))

执行结果 注意,以下是Windows操作系统的执行结果。
在这里插入图片描述

据说上述程序在Linux系统上可正常执行。

不过以上是笔者使用Windows操作系统的结果,错误原因是指geckodriver的驱动程序不在PATH路径内,所以产生错误。

22-1-4 驱动程序的安装

驱动程序的安装分成下列步骤:

①安装驱动程序与解压缩。

②将驱动程序放在PATH路径内。

③将驱动程序路径放在Python程序内。

22-1-4-1以Firefox为实例
在这里插入图片描述

目前绝大部分的用户皆是使用Python + Selenium驱动Firefox浏览器,这时需要的驱动程序是geckodriver.exe,这个程序可以至github.com下载。

窗口往下拉可以看到不同版本与适用不同的操作系统信息。
在这里插入图片描述

v是版本信息,右边是适用操作系统的说明,由上述Windows操作系统信息可知,所下载的文件是压缩文件zip,因此压缩后需解压缩,读者可以自行依环境选择。

笔者将上述解压缩之后的geckodriver.exe放在D:/geckodriver内,未来只要将这个文件路径配合参数设定放在webdriver.Firefox( )内,就可以正确执行了。

22-1-4-2以Chrome为实例

如果要使用Python + Selenium驱动Chrome浏览器,这时需要的驱动程序是chromedriver.exe,这个程序可以至下列网址下载。

这个文件下载后不用解压缩,笔者将上述解压缩之后的chromedriver.exe放在D:/gekodriver内,未来只要将这个文件路径配合参数设定放在webdriver.Chrome( )内,就可以正确执行了。

22-2 获得webdriver的对象类型

使用Selenium的第一步是获得webdriver对象。

22-2-1 以Firefox浏览器为实例

程序实例ch22_2.py:列出webdriver对象类型。

from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

# 指定 geckodriver 的路径
driverPath = 'D:\\geckodriver\\geckodriver.exe'

# 指定 Firefox 浏览器的路径(如果需要)
firefox_binary_path = 'C:\\Program Files\\Mozilla Firefox\\firefox.exe'  # 根据你的实际路径修改

# 创建 Firefox 的选项对象
options = Options()
options.binary_location = firefox_binary_path

# 创建 Service 对象,并设置日志输出
service = Service(executable_path=driverPath, log_output=None)  # 可以设置为一个文件路径来保存日志

# 启动 Firefox 浏览器
browser = webdriver.Firefox(service=service, options=options)

# 打印浏览器对象的类型
print(type(browser))

执行结果

<class 'selenium.webdriver.firefox.webdriver.WebDriver'>

这个程序在执行时,屏幕将出现D:\geckodriver\geckodriver.exe窗口,读者可以不用理会。接着会启动Firefox窗口,因为我们没有设定找寻任何网页,所以窗口是空白。不过,在Python Shell窗口可以看到程序的执行结果。

上述程序的重点是第5行,笔者将参数“executable_path=driverPath”当作参数设在webdriver.Firefox( )内,dirverPath主要是设定驱动程序的位置,在第4行设定。最后程序打印出了变量browser的对象类型。

22-2-2 以Chrome浏览器为实例

程序实例ch22_3.py:列出webdriver对象类型。

from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

# 指定 geckodriver 的路径
driverPath = 'D:\\geckodriver\\geckodriver.exe'  # 确保路径和驱动器名称正确

# 创建 Firefox 的选项对象
options = Options()

# 指定 Firefox 的二进制路径(如果非默认路径)
options.binary_location = 'C:\\Program Files\\Mozilla Firefox\\firefox.exe'  # 替换为实际的 Firefox 安装路径

# 创建 Service 对象
service = Service(executable_path=driverPath, log_output='geckodriver.log')

# 启动 Firefox 浏览器
browser = webdriver.Firefox(service=service, options=options)

# 打印浏览器对象的类型
print(type(browser))

执行结果

<class 'selenium.webdriver.firefox.webdriver.WebDriver'>

这个程序在执行时,屏幕将出现D:\geckodriver\chromedriver.exe(这是笔者放置chromedriver.exe的文件路径)窗口,读者可以不必理会。接着会启动Chrome窗口,因为我们没有设定找寻任何网页,所以窗口是空白。不过,在Python Shell窗口可以看到程序的执行结果。

上述程序的重点是第5行,笔者将参数“driverPath”当作参数设在webdriver.Chrome( )内,dirverPath主要是设定驱动程序的文件路径,在第4行设定。最后程序打印出了变量browser的对象类型。

22-3 提取网页

获得browser对象后,可以使用get( )让浏览器连上网页。

程序实例ch22_4.py:让浏览器连上网页与打印页标题。

from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

# 指定 geckodriver 的路径
driverPath = r'D:\geckodriver\geckodriver.exe'  # 使用原始字符串避免路径问题

# 创建 Firefox 的选项对象
options = Options()

# 如果 Firefox 的安装路径不在默认位置,指定二进制路径
options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'  # 替换为实际的 Firefox 安装路径

# 创建 Service 对象
service = Service(executable_path=driverPath)

# 启动 Firefox 浏览器
browser = webdriver.Firefox(service=service, options=options)

# 打开指定的 URL
url = 'http://aaa.24ht.com.tw'
browser.get(url)  # 网页下载至浏览器

执行结果
在这里插入图片描述

由于上述程序没有输出任何数据,所以Python Shell窗口没有任何结果,另外,由webbrowser对象启动的Firefox窗口将可以看到所加载的网页。

22-4 寻找HTML文件的元素

使用Selenium建立browser对象时,可以使用下列方法获得HTML文件的元素(WebElement),在下列方法中find_element_*可以找到第一个符合的元素,find_elements_*则可以找到所有相符的元素同时用列表传回。

find_element_by_id(id):传回第一个相符id的元素。

find_elements_by_id(id):传回所有相符的id的元素,以列表方式传回。

find_element_by_class_name(name):传回第一个相符Class的元素。

find_elements_by_class_name(name):传回所有相符的Class的元素,以列表方式传回。

find_element_by_name(name):传回第一个相符name属性的元素。

find_elements_by_name(name):传回所有相符的name属性的元素,以列表方式传回。

find_element_by_css_selector(selector):传回第一个相符CSS selector的元素。

find_elements_by_css_selector(selector):传回所有相符的CSS selector的元素,以列表方式传回。

find_element_by_partial_link_text(text):传回第一个内含有text的元素。

find_elements_by_ partial_link_text(text):传回所有内含相符text的元素,以列表方式传回。

find_element_by_link_text(text):传回第一个完全相同text的元素。

find_elements_by_link_text(text):传回所有完全相同text的元素,以列表方式传回。

if nd_element_by_tag_name(name):不区分大小写,传回第一个相符name的元素,例如,

是一样。

find_elements_by_tag_name(name):不区分大小写,传回所有相符的name的元素,以列表方式传回,例如,

是一样。

上述方法如果没有找到相符,会产生NoSuchElement异常,如果我们期待没找到时程序不要列出错误而结束,可以使用try … except执行例外处理。

找到HTML元素对象后,可以使用下列方式方法或属性获得HTML元素对象的内容。

tag_name:元素名称。

text:元素内容。

location:这是字典,内含有x和y键值,表示元素在页面上的坐标。

clear( ):可以删除在文字(text)字段或文字区域(textarea)字段的文字。

get_attribute(name):可以获得这个元素name属性的值。

is_displayed( ):如果元素可以看到传回True,否则传回False。

is_enabled( ):如果元素是可以立即使用则传回True,否则传回False。

is_selected( ):如果元素的复选框有勾选则传回True,否则传回False。

程序实例ch22_5.py:列出找不到元素,造成程序结束的实例。

# ch22_5.py
from selenium import webdriver

driverPath = 'D:\geckodriver\geckodriver.exe'
browser = webdriver.Firefox(executable_path=driverPath)
url = 'http://aaa.24ht.com.tw'
browser.get(url)                # 网页下载至浏览器

tag = browser.find_element_by_id('main')
print(tag.tag_name)

执行结果
在这里插入图片描述

可以用下列方式解决。

程序实例ch22_6.py:找不到符合条件的元素时,执行例外处理。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

# 指定 geckodriver 的路径
driverPath = r'D:\geckodriver\geckodriver.exe'

# 指定 Firefox 浏览器的路径(根据你的实际安装路径进行调整)
firefox_binary_path = r'C:\Program Files\Mozilla Firefox\firefox.exe'

# 创建 Firefox 的选项对象
options = Options()
options.binary_location = firefox_binary_path

# 创建 Service 对象
service = Service(executable_path=driverPath, log_output=None)

# 启动 Firefox 浏览器
browser = webdriver.Firefox(service=service, options=options)

# 打开指定的 URL
url = 'http://aaa.24ht.com.tw'
browser.get(url)  # 网页下载至浏览器

try:
    # 使用 By.ID 定位元素
    tag = browser.find_element(By.ID, 'main')
    print(tag.tag_name)
except Exception as e:
    print(f"没有找到相符的元素: {e}")

# 关闭浏览器
browser.quit()

执行结果

没有找到相符的元素:

程序实例ch22_7.py:以http://aaa.24ht.com.tw网站为例,抓取不同元素的应用。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

# 设置 geckodriver 的路径
driverPath = 'D:/geckodriver/geckodriver.exe'

# 创建 Service 对象
service = Service(executable_path=driverPath)

# 创建 Firefox 浏览器的选项对象
options = Options()
options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'  # 替换为你实际的 Firefox 安装路径

# 创建 Firefox 浏览器实例
browser = webdriver.Firefox(service=service, options=options)

# 打开网页
url = 'http://aaa.24ht.com.tw'
browser.get(url)

# 查找元素并打印信息
tag1 = browser.find_element(By.TAG_NAME, 'title')
print("标签名称 = %s, 内容是 = %s " % (tag1.tag_name, tag1.text))

tag2 = browser.find_element(By.ID, 'author')
print("\n标签名称 = %s, 内容是 = %s " % (tag2.tag_name, tag2.text))

# 查找多个元素,并打印信息
tags3 = browser.find_elements(By.ID, 'content')
for i, tag in enumerate(tags3):
    print(f"标签名称 = {tag.tag_name}, 内容是 = {tag.text}")

tags4 = browser.find_elements(By.TAG_NAME, 'p')
for i, tag in enumerate(tags4):
    print(f"标签名称 = {tag.tag_name}, 内容是 = {tag.text}")

tags5 = browser.find_elements(By.TAG_NAME, 'img')
for i, tag in enumerate(tags5):
    print(f"标签名称 = {tag.tag_name}, 内容是 = {tag.get_attribute('src')}")

# 关闭浏览器
browser.quit()

执行结果

标签名称 = title, 内容是 =  

标签名称 = h1, 内容是 = 洪錦魁
标签名称 = h1, 内容是 = 一個人的極境旅行 - 南極大陸北極海
标签名称 = h1, 内容是 = HTML5+CSS3王者歸來
标签名称 = p, 内容是 = 2015/2016年洪錦魁一個人到南極
标签名称 = p, 内容是 = 本書講解網頁設計使用HTML5+CSS3
标签名称 = img, 内容是 = http://104.155.193.235/temp/hung.jpg
标签名称 = img, 内容是 = http://104.155.193.235/temp/travel.jpg
标签名称 = img, 内容是 = http://104.155.193.235/temp/html5.jpg
标签名称 = img, 内容是 = http://104.155.193.235/bitnami/images/close.png
标签名称 = img, 内容是 = http://104.155.193.235/bitnami/images/corner-logo.png

22-5 用Python控制点选超链接

使用22-4节传回WebElement元素时,可以使用click( )方法,如果执行此方法相当于我们再点选这个传回的元素。如果传回的元素是超链接的文字,这样可以产生按此超链接的结果。

程序实例ch22_8.py:进入上奇信息(http://www.grandtech.info)网页,经过5秒后(第12行),设计程序自动点选认证考试超链接。笔者设计程序暂停5秒,主要是让读者可以体会网页的变化。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
import time

# 设置 geckodriver 的路径
driverPath = 'D:/geckodriver/geckodriver.exe'

# 设置 Firefox 浏览器的路径(根据你的实际安装位置)
firefox_binary_path = 'C:/Program Files/Mozilla Firefox/firefox.exe'  # 根据你的实际安装路径修改

# 创建 Service 对象
service = Service(executable_path=driverPath, log_output='geckodriver.log')

# 创建 Firefox 浏览器的选项对象
options = Options()
options.binary_location = firefox_binary_path

# 创建 Firefox 浏览器实例
browser = webdriver.Firefox(service=service, options=options)

# 打开网页
url = 'http://www.grandtech.info'
browser.get(url)

# 查找链接并点击
eleLink = browser.find_element(By.LINK_TEXT, '認證考試')
print(type(eleLink))  # 打印 eleLink 数据类别
time.sleep(5)         # 暂停 5 秒
eleLink.click()       # 执行超链接至书级的证照类别

# 关闭浏览器
browser.quit()

执行结果

<class 'selenium.webdriver.firefox.webdriver.WebDriver'>

下列是经过5秒后,Python自行点选认证考试超链接的结果。
在这里插入图片描述

22-6 用Python填写窗体和送出

我们可以找寻元素type是“text”或是找寻元素,然后使用send_keys( )方法,就可以填写窗体。填写完成后可以使用submit( )方法,将窗体送出。

程序实例ch22_9.py:用Python填写窗体,所填写的窗体是搜寻笔者的著作,本程序会经过5秒自动送出,笔者在执行结果中打印出了填写窗体以及送出的结果。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
import time

# 设置 geckodriver 的路径
driverPath = 'D:/geckodriver/geckodriver.exe'

# 创建 Service 对象
service = Service(executable_path=driverPath)

# 创建 Firefox 浏览器的选项对象
options = Options()
# 指定 Firefox 浏览器的路径(根据实际情况修改路径)
options.binary_location = 'C:/Program Files/Mozilla Firefox/firefox.exe'

# 创建 Firefox 浏览器实例
browser = webdriver.Firefox(service=service, options=options)

# 打开网页
url = 'http://www.grandtech.info'
browser.get(url)

# 查找输入框并输入数据
txtBox = browser.find_element(By.ID, 'key')
txtBox.send_keys('洪錦魁')
time.sleep(5)  # 暂停 5 秒
txtBox.submit()  # 提交表单

# 关闭浏览器
browser.quit()

执行结果 左下窗体“洪锦魁”是自动填写,过5秒后可以得到右下图结果。
在这里插入图片描述

了解上述自动填写窗体和送出功能,未来热门的演唱会门票、过年抢破头的高铁票就让Python处理吧!

22-7 用Python处理使用网页的特殊按键

在欣赏网页时,有时候我们可能需要滚动网页或使用一些特殊键,这些特殊键无法用Python输入,不过Python有提供下列模块,可方便我们操作。

 selenium.webdriver.common.keys

使用这个模块前需在程序前方导入,语法如下:

 from selenium.webdriver.common,keys import Keys

经上述声明后未来可以用Keys调用相关属性,下列是常用属性内容。

ENTER/RETURN:相当于键盘的Enter和Return按键。

PAGE_DOWN/PAGE_UP/HOME/END:相当于键盘的PAGE_DOWN、PAGE_UP、HOME、END。

UP/DOWN/LEFT/RIGHT:相当于键盘的上、下、左、右箭头键。

上述使用方式是在前方加上“Keys.”,例如,Keys.HOME。

程序实例ch22_10.py:这个程序在执行时,首先显示最上方的网页内容,过3秒后会往下滚动一页,再过3秒会滚动到最下方。经过3秒可以往上滚动,再过3秒可以将网页滚动到最上方。程序第10行先搜寻‘body’,这是网页设计网页主体的开始标签,相当于在网页的最上方。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
import time

# 设置 geckodriver 的路径
driverPath = 'D:/geckodriver/geckodriver.exe'

# 创建 Service 对象,并指定日志输出(可选)
service = Service(executable_path=driverPath, log_output='geckodriver.log')

# 创建 Firefox 浏览器的选项对象,并指定 Firefox 浏览器的路径
options = Options()
options.binary_location = 'C:/Program Files/Mozilla Firefox/firefox.exe'  # 请根据实际路径调整

# 创建 Firefox 浏览器实例
browser = webdriver.Firefox(service=service, options=options)

# 打开网页
url = 'http://www.grandtech.info'
browser.get(url)

# 查找 body 元素并执行卷动操作
ele = browser.find_element(By.TAG_NAME, 'body')
time.sleep(3)
ele.send_keys(Keys.PAGE_DOWN)  # 网页卷动到下一页
time.sleep(3)
ele.send_keys(Keys.END)        # 网页卷动到最底端
time.sleep(3)
ele.send_keys(Keys.PAGE_UP)    # 网页卷动到上一页
time.sleep(3)
ele.send_keys(Keys.HOME)       # 网页卷动到最上端

# 关闭浏览器
browser.quit()

执行结果 每次间隔3秒,读者可以观察页面内容的滚动。

22-8 用Python处理浏览器运作

常见的运作有下列方法:

forward( ):往前一页。

back( ):往回一页。

refresh( ):更新网页。

quit( ):关闭网页,相当于关闭浏览器。

上述必须用Firefox浏览器对象启动,也就是我们本章的变量browser,例如,browser.refresh( )可更新网页,browser.quit( )可以关闭网页。

程序实例ch22_11.py:更新网页与关闭网页的应用。

from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
import time

driverPath = 'D:/geckodriver/geckodriver.exe'  # 你的 geckodriver 路径
firefoxPath = 'C:/Program Files/Mozilla Firefox/firefox.exe'  # 你的 Firefox 路径(请根据你的安装路径修改)

service = Service(executable_path=driverPath)
options = Options()
options.binary_location = firefoxPath  # 设置 Firefox 可执行文件的路径

# 创建 Firefox 浏览器实例
browser = webdriver.Firefox(service=service, options=options)

url = 'http://www.grandtech.info'
browser.get(url)                    # 网页下载至浏览器

time.sleep(3)
browser.refresh()                   # 更新网页
time.sleep(3)
browser.quit()                      # 关闭网页

执行结果 网页下载后3秒钟可以更新网页内容,再过3秒可以关闭浏览器。
在这里插入图片描述

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值