1. 什么是无头浏览器
无头浏览器(Headless Browser)是指没有图形界面的浏览器,通常用于自动化测试和 Web 数据采集等场景。相比于传统的带 GUI 的浏览器,无头浏览器可以更加高效地运行程序,并且不需要图形界面的支持,因此更加轻量级。
Python 中常用的无头浏览器有 Chrome Headless 和 Firefox Headless,它们都可以通过 Python 脚本控制网页自动化访问、截图、数据采集等操作。
2. Python 实现无头浏览器采集应用的基本功能
2.1 安装必要的库
Python 实现无头浏览器采集需要用到 selenium、webdriver_manager 和无头浏览器(如 Chrome 或 Firefox)。其中,selenium 可以用于模拟用户在浏览器中的行为,webdriver_manager 可以帮助自动下载并安装浏览器驱动。
以下是安装 selenium 和 webdriver_manager 的命令:
pip install selenium
pip install webdriver_manager
2.2 使用 Chrome Headless 进行页面访问
Chrome Headless 是比较常用的无头浏览器,可以通过以下命令来启动它:
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
driver = Chrome(options=options)
# 使用 driver 访问网页
driver.get('https://www.baidu.com')
在上面的代码中,首先创建了一个选项对象(Options),并将其 headless 属性设置为 True,这样就可以开启 Chrome Headless 模式。然后使用选项对象创建了 Chrome 浏览器对象(driver),并使用访问指定的网页。
2.3 使用 Firefox Headless 进行页面访问
Firefox Headless 也是一个常用的无头浏览器,使用方法与 Chrome Headless 类似,只需要将代码中的 Chrome 改成 Firefox 就可以了。以下是使用 Firefox Headless 访问网页的示例代码:
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
options = Options()
options.headless = True
driver = Firefox(options=options)
# 使用 driver 访问网页
driver.get('https://www.baidu.com')
2.4 获取网页源代码
浏览器对象(如 Chrome 或 Firefox)可以获取网页元素、截图等功能,但有时候我们需要获取整个网页的源代码,可以使用以下代码:
page_source = driver.page_source
该代码会返回当前网页的源代码。
2.5 查找网页元素
可以使用 Xpath 或 CSS Selector 语法在网页中查找指定的元素。以下是使用 Xpath 语法来查找一个元素的例子:
from selenium.webdriver.common.by import By
# 查找 ID 为 "kw" 的元素
element = driver.find_element(By.XPATH, '//*[@id="kw"]')
代码中使用了 find_element 方法来查找符合条件的元素,其中 By.XPATH 是指使用 Xpath 语法查找元素,而 '//*[@id="kw"]' 是 Xpath 表示 ID 为 "kw" 的元素。
3. 示例代码
下面是一个使用 Chrome Headless 进行页面访问和数据采集的示例代码,它可以从百度搜索页面中获取搜索框、搜索按钮等元素,并使用这些元素进行搜索和获取搜索结果:
# -*- coding: utf-8 -*-
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def search(keyword):
options = Options()
options.headless = True
driver = Chrome(options=options)
driver.get('https://www.baidu.com')
wait = WebDriverWait(driver, 10)
# 等待搜索框出现并输入关键字
input_elem = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="kw"]')))
input_elem.send_keys(keyword)
# 等待搜索按钮出现并点击
search_elem = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="su"]')))
search_elem.click()
# 等待搜索结果出现并获取结果
result_elems = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="result"]')))
for i, result_elem in enumerate(result_elems):
print('Result {}:\n{}'.format(i + 1, result_elem.text.strip()))
# 关闭浏览器并退出
driver.quit()
if __name__ == '__main__':
search('Python')
上面的代码首先启动了 Chrome Headless 模式,然后访问了百度搜索页面,并等待搜索框和搜索按钮加载完成。接着输入关键字、点击搜索按钮,并等待搜索结果出现。最后输出搜索结果,并关闭浏览器。
在代码中,我们使用了 WebDriverWait 类等待元素加载完成,这可以避免程序在元素没有完全出现时就进行下一步操作。另外,代码中还使用了 Keys.RETURN 来模拟键盘点击操作,该操作相当于按下 Enter 键。
4. 总结
无头浏览器是 Python 数据采集的重要工具之一,可以模拟用户在浏览器中的操作,从而快速、高效地获取目标网站的数据。Python 中常用的无头浏览器有 Chrome Headless 和 Firefox Headless,它们都可以通过 Selenium 等库来进行控制。本文介绍了使用 Chrome Headless 进行页面访问和数据采集的基本操作,希望能帮助读者更好地使用无头浏览器采集网页数据。