使用 Python 和 Selenium 抓取动态网页
介绍
在过去的几年中,网站的前端设计方法和技术得到了长足的发展,React、Angular、Vue 等框架变得极为流行。这些框架使前端网站开发人员能够高效工作,并为网站及其提供的网页带来诸多好处,使其对网站用户来说更加实用、更具吸引力。动态生成的网页可以提供更快的用户体验;网页本身的元素是动态创建和修改的。这与更传统的基于服务器的页面生成方法形成对比,在这种方法中,页面上的数据和元素设置一次,需要往返 Web 服务器才能获取下一部分数据以提供给用户。当我们抓取网站时,最容易做的是更传统、更简单、基于服务器的网站。这些是最可预测和最一致的。
虽然动态网站对最终用户和开发人员大有裨益,但当我们想要从中抓取数据时,它们可能会带来问题。例如,考虑一个动态网页:许多功能都是响应用户操作和浏览器上下文中 JavaScript 代码的执行而发生的。自动生成的数据,或“按需”显示的数据,以及由于用户与页面交互而“自动生成的”数据可能难以在低级别以编程方式复制——毕竟,浏览器是一种相当复杂的软件!
由于这种级别的动态交互和界面自动化,使用简单的 http 代理来处理这些网站的动态特性非常困难,我们需要采用不同的方法。从动态网站抓取数据的最简单解决方案是使用自动化 Web 浏览器(例如 selenium),它由 Python 等编程语言控制。在本指南中,我们将探讨如何设置和使用 Selenium 和 Python 来抓取动态网站的示例,以及一些使用更传统的抓取方法无法轻易实现的功能。
要求
对于本指南,我们将使用“Selenium”库来获取和解析数据。
先决条件:
一般来说,一旦正确安装了 Python 3,您就可以使用“PIP”实用程序下载 Selenium:
pip install -U selenium
您还需要为 Selenium 包安装驱动程序,Chrome 非常适合此用途。使用 chromedriver-install pip 包装器安装它。
pip install chromedriver-install
如果未安装Pip,你可以在此处下载并安装
对于简单的网页抓取,像Microsoft Visual Code(免费使用和下载)这样的交互式编辑器是一个不错的选择,它适用于 Windows、Linux 和 Mac。
开始使用 Selenium
运行 pip installs 后,我们可以开始编写一些代码。初始代码块之一检查 Chromedriver 是否已安装,如果没有,则下载所需的所有内容。我喜欢指定 chrome 操作的文件夹,因此我将下载和安装文件夹作为安装库的参数传递。
import chromedriver_install as cdi
path = cdi.install(file_directory='c:\\data\\chromedriver\\', verbose=True, chmod=True, overwrite=False, version=None)
print('Installed chromedriver to path: %s' % path)
然后调用代码主体——这将创建 Chromedriver 实例,将起点指向我安装它的文件夹。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome("c:\\data\\chromedriver\\chromedriver.exe")
一旦执行此行,Chrome 的一个版本就会出现在桌面上 - 我们可以隐藏它,但对于我们的初始测试目的来说,最好看看发生了什么。我们通过调用“get”方法指示驱动程序打开网页,并使用我们要访问的页面的参数。
driver.get("http://www.python.org")
Selenium 的强大之处在于它允许 chrome-driver 执行繁重的工作,同时充当虚拟用户,与网页交互并根据需要发送命令。为了说明这一点,让我们通过在搜索框中添加一些文本来在 Python 网站上运行搜索。我们首先查找名为“q”的元素 - 这是用于将搜索发送到网站的“输入框”。我们清除它,然后发送键盘字符串“pycon”
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
然后,我们可以通过向输入框发送“按键”来虚拟地点击“输入/返回” - 网页提交,并向我们显示搜索结果。
elem.send_keys(Keys.RETURN)
我们已经了解了 Selenium 的启动和运行有多么简单,接下来我们将了解如何使用导航命令浏览网页乃至整个网站。作为人类,当我们想要在网页上执行任务时,我们会确定想要以视觉方式执行的操作,例如拖放、滚动、单击按钮等。然后,我们会相应地移动鼠标并单击或使用键盘。对于 Selenium 来说,事情还没有那么简单(目前还没有!),所以我们需要给它一些帮助。为了浏览网页,我们需要告诉 Selenium 要与页面上的哪些对象进行交互。我们通过使用 XPath 识别页面元素,然后调用适合于我们希望执行的任务的函数来实现这一点。
在我们的第一个示例(搜索框)中,我们执行以下操作:
- 要求驱动程序找到名为“q”的浏览器元素。
- 给出指令,向所标识的元素发送一系列字符。
- 给出发送‘RETURN’键命令的指令。
这相当于我们人类点击搜索框,输入搜索词,然后按键盘上的 RETURN 或 ENTER 键。
因此,Selenium 中的导航模式是:
- 确定您希望与之交互的元素。
- 根据需要进行交互(设置一些文本、提取一个值、发送击键等)。
可以使用 xPath“driver.find_element_by_xpath”或更高级的方法(例如“find_element_by_id”)来定位元素。
<input type="text" name="searchbox" id="someUniqueId" />
element = driver.find_element_by_id("someUniqueId")
element = driver.find_element_by_name("searchbox")
element = driver.find_element_by_xpath("//input[@id='someUniqueId']")
发送交互指令,例如设置文本、选择单选框以及点击键盘上的“RETURN”键,可以通过使用“sendkeys”方法实现:
element.send_keys("Set some text")
除了发送文本之外,我们还可以单独或组合发送击键和文本。
element.send_keys(Keys.RETURN)
element.send_keys("Set text", Keys.ARROW_DOWN)
使用表单
在 Selenium 中使用表单非常简单,它将我们所学到的知识与一些附加功能相结合。填写网页上的表单通常涉及设置文本框的值,可能从下拉框或单选控件中选择选项,然后单击提交按钮。我们已经了解了如何识别文本字段并将其发送到数据。定位和选择选项控件需要我们:
- 找到控件。
- 迭代其选项。
- 将我们想要选择的选项设置为“选定”的值。
在下面的例子中,我们在选择控件中搜索值“Ms”,当我们找到它时,我们单击它来选择它:
element = driver.find_element_by_xpath("//select[@name='Salutation']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
if option.get_attribute("value") == "Ms":
option.click()
使用表单的最后一部分是了解如何将表单中的数据发送回服务器。这可以通过找到提交按钮并发送单击事件,或选择表单中的任意控件并针对该控件调用“提交”来实现:
driver.find_element_by_id("SubmitButton").click()
someElement = driver.find_element_by_name("searchbox")
someElement.submit()
微笑!…截屏
使用 Selenium 的一个好处是,您可以截取浏览器渲染内容的屏幕截图。这对于调试问题以及记录网页被抓取时的样子非常有用。
截屏再简单不过了。我们调用“save_screenshot”方法并传入位置和文件名来保存图像。
driver.save_screenshot('WebsiteScreenShot.png')
结论
使用 Selenium 进行网页抓取可以成为您非常有用的工具,尤其是在处理动态网页时。本指南只是触及了皮毛 - 要了解更多信息,请访问Selenium 网站。
如果您想了解有关网络抓取的更多信息,请考虑 Pluralsight 提供的以下课程:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~