Selenium是一个综合项目,提供了用于浏览器自动化的工具和库,支持包括Python在内的多种编程语言。简单来说,Selenium让你可以在没有UI的情况下运行浏览器,并测试网页应用。
Selenium的无头浏览器也广泛用于网页抓取,因为它们比有头浏览器速度更快且资源占用更少。在Python中无头运行Selenium还提供了更多的优化空间和更好的编程控制。
运行Selenium的准备工作
在使用Selenium运行无头浏览器之前,你需要先安装Python和一个集成开发环境(IDE)。你可以从Python的官方网站下载Python。
市面上有很多IDE,各具特色,但对于Python浏览器模拟来说,PyCharm Community Edition是一个不错的起点。它是一个免费的IDE,完全适用于所有Python编程。
安装完Python和PyCharm后,打开PyCharm并创建一个新项目。
接下来,你需要安装Selenium库。你可以在PyCharm中打开终端,然后输入:
pip install selenium
PyCharm会自动下载、解压并安装Selenium库。这个库只会对当前项目可用。虽然你可以永久安装它们,但对于小项目来说,这并不是必需的。
最后,你可能需要找到一个无头浏览器驱动。无头Selenium通过使用现有的浏览器驱动程序运行。当前版本应该附带了所有主流浏览器的驱动程序。
以Headful模式运行Selenium
我将首先在headful模式下测试Selenium,以确保一切正常运行。
首先从Selenium导入webdriver:
from selenium import webdriver
然后,我们将定义一个接受URL参数的函数:
def open_browser(URL: str): browser = webdriver.Chrome() browser.get(URL) browser.quit() open_browser('https://www.amazon.com/')
我们的第一行代码定义了函数及其参数(URL)。虽然添加“: str”不是必须的,但它限制了输入只能是字符串,从而减少了人为错误的可能性。如果你打算使用其他数据格式,请确保将其移除。
“browser”创建了一个值为“webdriver.Chrome()”的对象,这实际上创建了一个webdriver对象,我们稍后将用它来执行某些操作。
然后,“browser.get(URL)”使用浏览器对象的方法“get”来访问指定的URL。在页面完全加载后,浏览器会因为“browser.quit()”而自动退出。
最后,我们在括号和引号之间传入我们想要的URL,调用函数“open_browser”。
点击右上角的绿色箭头来执行代码。如果一切正常,浏览器会自动打开并访问亚马逊的主页。
如果在执行代码时遇到缺少webdriver的错误,你需要手动下载webdriver。由于我将使用Chrome的webdriver,你可以从测试库下载它。确保下载与你的操作系统相适应的‘chromedriver’。
切换到Selenium Headless (无头)模式
在前面的示例中,浏览器打开并访问了带有完整GUI的主页。出于测试和web抓取的目的,大多数人选择不带头地运行Selenium。
我们必须添加另一个导入,它将允许我们调整Selenium chromedriver headless选项。
from selenium import webdriver from selenium.webdriver import ChromeOptions
现在必须向函数中添加三行新代码:
def open_browser(URL: str): options = ChromeOptions() options.add_argument("--headless=new") browser = webdriver.Chrome(options=options) browser.get(URL) browser.quit() open_browser('https://www.amazon.com/')
‘Options’创建了一个对象,用来存储Chrome无头浏览器的选项。然后我们会使用‘.add_argument’方法添加一个字符串,告诉浏览器以无头模式运行。
最后,我们需要调整‘browser’对象,以包含我们的Chrome无头Selenium命令。
现在,我们可以再次点击相同的绿色箭头来执行代码。
请注意,由于我们运行的是无头浏览器,界面上‘什么都不会发生’。Python还提供了一些选项,使Selenium的无头模式更加出色。
运行一个URL列表
在几乎所有情况下,您都将使用Selenium来运行更大的url列表,而不是单个url列表。我们可以通过改变函数来实现:
def open_browser(URL): options = ChromeOptions() options.add_argument("--headless=new") browser = webdriver.Chrome(options=options) for i in URL: browser.get(i) browser.quit()
我们的函数现在将接受序列对象(列表,元组,字典等),因为我们已经使用了“for”循环。在调用该函数时,我们必须输入其中一个对象,然后浏览器将依次访问每个URL。
我们还需要添加一个字典对象:
list_of_urls = ['https://www.amazon.com/', 'https://www.amazon.com/Best-Sellers-Amazon-Devices-Accessories/zgbs/amazon-devices/'] open_browser(list_of_urls)
字典中的每个对象都用逗号分隔,你可以添加任意多个对象。然而,当前函数不接受不在序列对象中的单个字符串。
在执行代码之前,建议将‘.add_argument’方法注释掉(在代码行的左侧使用#号)。否则,Python的Selenium无头模式将会激活,你将无法看到是否一切如预期运行。
以下是完整的代码块:
from selenium import webdriver from selenium.webdriver import ChromeOptions def open_browser(URL): options = ChromeOptions() options.add_argument("--headless=new") browser = webdriver.Chrome(options=options) for i in URL: browser.get(i) browser.quit() list_of_urls = ['https://www.amazon.com/', 'https://www.amazon.com/Best-Sellers-Amazon-Devices-Accessories/zgbs/amazon-devices/'] open_browser(list_of_urls)
结 论
你只需要几行代码就可以运行Selenium无头浏览器。然而,Python为你提供了更多的选项,在自动化过程中,你将不仅仅是以无头模式打开一个浏览器。