在 Python 中使用 PhantomJS
这篇 Python 文章将研究 PhantomJS 以及我们如何将它与用于 Python 编程的 Selenium Web 自动化模块一起使用。 我们还将研究为什么它比其他可用的自动化 Web 驱动程序更有用。
Selenium 和 PhantomJS 很有用,并且从抓取的角度来看提供了独特的优势。 此外,还应遵循一些实用的编码示例,以更好地理解整个概念。
安装 PhantomJS
PhantomJS 是一款无头浏览器,可与 Selenium 网络自动化模块配合使用。 与 Firefox Driver 和 Chrome Driver 相比,浏览器在整个过程中保持完全隐藏。
它的行为与其他浏览器完全一样。 您可以将 web driver 切换为 Chrome Driver 或 Firefox Driver 来设计程序,一旦运行,您可以将其切换为 PhantomJS。
由于 PhantomJS 消除了 GUI 的使用,因此在为测试用例执行一些测试运行时它运行得更快。
在使用 PhantomJS 之前,我们首先需要安装它。 对于 macOS 中的安装,我们运行以下命令。
示例代码:
brew install phantomjs
我们需要从网站下载它来安装它在 Windows 或 Linux 上。 在这里能找到它。
使用 PhantomJS 解决的问题场景
让我们在这里讨论一个示例问题,然后尝试使用 PhantomJS 和 Selenium 解决它。
我们知道,在现代计算时代,现在大多数网站都使用 JavaScript 在其网站上动态加载内容。
让我们考虑一个加载 ATP Singles USA Tennis Results 2015 的站点。加载该站点后,我们可以看到显示了分数和比赛详细信息。
我们可以看到以适当的动态方式加载的内容,这一切都归功于 JavaScript。 现在,让我们禁用 JavaScript,看看会发生什么。
我们可以看到,在我们的浏览器中禁用 JavaScript 后,内容未加载。
如果我们想使用 Python 从该网站下载所有游戏怎么办? JavaScript 未呈现,页面主体未完成; 因此,向站点发送请求并解析 HTML 的传统方法将行不通。
并行使用 PhantomJS 和 Selenium
在开始处理我们的代码之前,我们必须先设置环境。 为此,我们将键入以下代码:
mkdir scraping_phantomjs && cd scraping_phantomjs
virtualenv venv
source venv/bin/activate
pip install selenium beautifulsoup4
由于现在已完成所需的安装和导入,我们继续下一步并制作一个 Python 文件,该文件应该保存我们将在代码执行结束时获得的数据。
示例代码:
touch scraper.py
创建文件后,让我们开始编写脚本以获取上述网站上第一个匹配项的 HTML。
示例代码:
import platform
from bs4 import BeautifulSoup
from selenium import webdriver
#Extensions may vary from OS to OS that is why we're considering multiple types
if platform.system() == 'Windows':
PHANTOMJS_PATH = './phantomjs.exe'
else:
PHANTOMJS_PATH = './phantomjs'
# We are using pseudo browser PhantomJS here but can change it to Firefox as
#per our needs
browser = webdriver.PhantomJS(PHANTOMJS_PATH)
browser.get('http://www.scoreboard.com/en/tennis/atp-singles/us-open-2015/results/')
#Now we need to parse our HTML
soup = BeautifulSoup(browser.page_source, "html.parser")
#Find all the games listed
games = soup.find_all('tr', {'class': 'stage-finished'})
# and print out the html for the first game
#You can print the next game by changing 0 to 1 in games[]
print(games[0].prettify())
我们必须给出 PhantomJS 的位置,这个脚本才能运行。 确保从上面的链接中获取适合您操作系统的 PhantomJS 版本。
之后,将其解压缩以显示 bin 文件夹中的 phantomjs 文件。 该文件应与 scraper.py 脚本位于同一文件夹中。
让我们尝试运行我们的脚本,看看我们是否获得了所需的输出。 要运行脚本,请键入以下命令。
示例代码:
python scraper.py
输出将为我们提供第一个匹配项的 HTML。 它看起来像这样:
<tr class="The odd no-border-bottom stage-finished" id="g_2_2DtOK9O8">
<td class="cell_ib icons left ">
</td>
<td class="cell_ad time ">
14.09. 02:20
</td>
<td class="cell_ab team-home bold ">
<span class="padl">
Djokovic N. (Srb)
</span>
</td>
<td class="cell_ac team-away ">
<span class="padl">
Federer R. (Sui)
</span>
</td>
<td class="cell_sa score bold ">
3 : 1
</td>
<td class="cell_ia icons ">
<span class="icons">
</span>
</td>
</tr>
正如我们所看到的,获取动态加载的内容比仅仅向服务器发送请求相对容易且更有效。
本文简要总结了如何使用 PhantomJS 和 Selenium 从动态网站获取内容。 它还解释了为什么上述过程比传统方法更快、更有效。
相关文章
Python 查询 DynamoDB
发布时间:2023/06/02 浏览次数:127 分类:Python
-
本文将讨论如何使用 python 查询 Amazon DynamoDB。 我们还将讨论 Boto3 是什么以及它为什么需要查询 DynamoDB。
创建 Python 脚本以在 Linux 中打开新终端并运行命令
发布时间:2023/06/02 浏览次数:54 分类:Python
-
Linux 操作系统以其程序员广泛使用的多功能终端而闻名。创建在 Linux 中打开新终端并运行命令的 Python 脚本
Python Crc32 介绍
发布时间:2023/06/02 浏览次数:182 分类:Python
-
本篇文章将介绍使用 Python 中的 binascii 或 zlib 库计算数据的 crc32。Python CRC32 。CRC32 是数据的校验和,也称为循环冗余校验,用于检查数据的数字传输中存在的错误。
在 Python 中使用 Luhn 算法验证数字
发布时间:2023/06/02 浏览次数:164 分类:Python
-
这篇文章解释了用 Python 编写 Luhn 算法并根据算法验证数字。在 Python 中使用 Luhn 算法验证数字 Luhn 算法验证器有助于检查合法数字并将其与不正确或拼写错误的输入分开。
Python - 匹配多行文本块的正则表达式
发布时间:2023/06/02 浏览次数:192 分类:Python
-
本文讨论了在多行字符串中搜索特定模式的方法。 该解决方案折衷了已知和未知模式的几种方法,并解释了匹配模式的工作原理。编写正则表达式以匹配多行字符串的原因
在 Python 中使用正则表达式捕获组
发布时间:2023/06/02 浏览次数:78 分类:Python
-
本篇文章介绍了如何借助 Python 中的正则表达式捕获组。 我们还将了解这些群体以及我们如何捕获它们。 让我们开始吧。在 Python 中使用正则表达式捕获组
Python 正则表达式转义
发布时间:2023/06/02 浏览次数:64 分类:Python
-
这篇文章是关于 Python 正则表达式转义的。 此外,我们将介绍 Python 正则表达式转义以及如何通过适当的示例代码使用它,以及 Python 正则表达式的多种用途。
在 Python 中使用 Re 模块的正则表达式通配符
发布时间:2023/06/02 浏览次数:51 分类:Python
-
通配符在正则表达式中用作表示或交换一个或多个字符的符号。 这些主要用于简化搜索条件。本文详细解释了如何在 Python 中使用带有通配符的 re.sub() 来匹配字符串与正则表达式。使用 re.sub
在 Python 中为对象添加属性
发布时间:2023/06/02 浏览次数:88 分类:Python
-
我们将介绍如何在 Python 中为对象添加属性。 我们还将通过示例介绍如何在 Python 中更改对象的属性。在 Python 中为对象添加属性 在 Python 中,我们时常使用对象,因为 Python 是一种面向对象的语