使用 Selenium 进行网页抓取
介绍
上一篇指南《使用 BeautifulSoup 进行网页抓取》解释了网页抓取的基本原理:
- 了解 HTML 基础知识。
- 探索网页结构和开发者工具的使用方法。
- 发出 HTTP 请求并获取 HTML 响应。
- 使用beautifulsoup获取特定的结构化信息。
此过程适用于静态内容,可通过发出 HTTP 请求获取网页内容,但动态网站从数据源(数据库、文件等)加载数据或需要在网页上进行一些额外的操作事件来加载数据。
- 到达页面末尾时,向下滚动即可加载更多内容。
- 单击“下一步”按钮即可查看电子商务网站上下一页可用的优惠。
- 单击按钮可以查看要应用抓取的评论或用户个人资料的完整详细信息。
为了使这个过程自动化,我们的抓取脚本需要与浏览器交互来执行重复的任务,比如点击、滚动、悬停等,而 Selenium 是自动化 Web 浏览器交互的完美工具。
Selenium 是一个用于 Web 应用程序/网站的自动化测试框架,它还可以控制浏览器像人类一样浏览网站。Selenium 使用 Web 驱动程序包,可以控制浏览器并模仿面向用户的操作来触发所需事件。本指南将解释构建 Web 抓取程序的过程,该程序将从Google Shopping Insights抓取数据并下载文件。
Google Shopping Insights 在运行时加载数据,因此任何使用请求包提取数据的尝试都将得到空响应。
设置
- Selenium :要下载 selenium 包,请在终端中执行以下pip命令:
pip install selenium
- Selenium 驱动程序:Web 驱动程序使 Python 能够通过操作系统级交互来控制浏览器。Web 驱动程序使用浏览器对自动化过程的内置支持,因此,为了控制浏览器,必须安装 Web 驱动程序,并且应可通过操作系统的PATH变量访问(仅在手动安装的情况下才需要)。
从官方网站下载适用于 Chrome、Firefox 和 Edge 的驱动程序。Opera 驱动程序也可以从Github 上托管的Opera Chromium项目下载。
OS X El Capitan 和 macOS Sierra 上的 Safari 10 内置了对自动化驱动程序的支持。本指南包含与流行 Web 驱动程序交互的代码片段,但在本指南中,Safari 被用作默认浏览器。
其他浏览器如UC、Netscape等,无法用于自动化。Selenium-RC(远程控制)工具可以通过注入自己的JavaScript代码来控制浏览器,并可用于UI测试。
数据提取
让我们开始搜索产品并下载 CSV 文件,步骤如下:
- 导入依赖项并创建驱动程序实例:初始步骤是通过从selenium模块导入来为特定浏览器创建webdriver对象,如下所示:
from selenium import webdriver # Import module
from selenium.webdriver.common.keys import Keys # For keyboard keys
import time # Waiting function
URL = 'https://shopping.thinkwithgoogle.com' # Define URL
browser = webdriver.Safari() # Create driver object means open the browser
默认情况下,Safari 中的自动化控制是禁用的,需要为自动化环境启用它,否则会引发SessionNotCreatedException。因此,请在 Safari 偏好设置中的高级设置下启用“开发”选项。
然后打开“开发”选项并选择“允许远程自动化”。
- 应用等待和搜索:按照步骤应用搜索:
- 打开链接。
- 等待网站加载。
- 使用其“subjectInput”id查找搜索元素的id 。
还有一个隐藏的输入标签不是必需的。因此,使用find_elements获取符合搜索条件的所有元素的列表,并使用索引来访问它。
- 使用send_keys提供输入。
- 等待结果出现。
- 按下回车键并继续。
browser.get('https://shopping.thinkwithgoogle.com') # 1
time.sleep(2) # 2
search = browser.find_elements_by_id('subjectInput')[1] # 3
# find_elements will give us the list of all elements with id as subjectInput
search.send_keys('Google Pixel 3') # 4
time.sleep(2) # 5
search.send_keys(Keys.ENTER) # 6
要使用 Firefox 和 Chrome 浏览器,请使用其相应的方法创建浏览器实例:
# Firefox
firefoxBrowser = webdriver.Firefox(executable_path=FIREFOX_GOCKO_DRIVER_PATH) # Chrome
chromeBrowser = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH)
- 下载文件:为了下载文件,请使用si-button-data download-all类值找到下载所有数据 div标签。
time.sleep(2) # Wait for button to appear
browser.find_element_by_class_name('si-button-data download-all').click()
- 从元素中提取数据:要按位置下载兴趣数据,首先根据其类值找到ul列表标签,然后获取所有列表项的数据,如下所示:
data = browser.find_element_by_class_name('content content-breakpoint-gt-md')
dataList = data.find_elements_by_tag_name('li')
for item in dataList:
text = item.text
print(text)
定位 WebElement
Selenium 提供了多种功能来定位网页上的元素,例如:
- find_element_by_id:使用 id 查找元素。
- find_element_by_name:使用名称查找元素。
- find_element_by_xpath:使用 xpath 查找元素。
- find_element_by_link_text:使用链接的文本值来查找元素。
- find_element_by_partial_link_text:通过匹配超链接文本(锚标签)的某些部分来查找元素。
- find_element_by_tag_name:使用标签名称查找元素。
- find_element_by_class_name:使用类属性的值来查找元素。
- find_element_by_css_selector:使用 CSS 选择器为 id、class 查找元素。或者使用find_element和BY定位器,如下所示:
search = browser.find_element(By.ID,'subjectInput')[1]
使用函数的重载版本来查找搜索值的所有出现位置。只需使用elements而不是element即可:
searchList = browser.find_elements(By.ID,'subjectInput')[1]
XPath
XPath 是一种在DOM中查找对象的表达式路径语法。XPath 有自己的语法,可以通过绝对路径或使用相对路径在文档中的任何位置从根元素查找节点。下面通过示例解释 XPath 语法:
/:从根节点选择节点。/html/body/div[1 ]将找到第一个div。
//:从当前节点选择节点。//form[1 ]将找到第一个表单元素。
[@attributename='value']:使用该语法查找具有所需属性值的节点。
//input[@name='Email']将找到第一个名称为Email 的输入元素。
<html>
<body>
<div class = "content-login">
<form id="loginForm">
<div>
<input type="text" name="Email" value="Email Address:">
<input type="password" name="Password"value="Password:">
</div>
<button type="submit">Submit</button>
</form>
</div>
</body>
<html>
阅读有关XPath 的更多信息以组合多个属性或使用支持的函数。
无头浏览器
无头或隐形浏览器:在抓取过程中,浏览器窗口上的任何用户操作都可能中断流程并导致意外行为。因此,对于抓取应用程序,在创建应用程序(例如浏览器)时避免任何外部依赖至关重要。无头浏览器可以在不显示任何图形 UI 的情况下工作,这使得应用程序成为用户交互的单一来源并提供流畅的用户体验。
一些著名的无头浏览器是 PhantomJS 和 HTMLUnit。其他浏览器(如 Chrome 和 Firefox)也支持无头功能,可以使用set_headless参数启用:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~