在本教程中,您将了解BOSE框架,该框架为使用Selenium进行Web刮擦提供了一种更简单且结构化的方式。想想它的瑞士军刀以进行网络刮擦
使用硒来刮擦网站时,通常涉及很多样板工作,例如:
- 下载适合硒的铬驱动器
- 通过指定驱动程序路径来创建驱动程序,这可能在Windows上具有挑战性
- 指定机器人保护站点无法检测到的正确的chromeoptions 无法检测到硒
- 将配置文件和用户代理传递给硒
- 在发生错误的情况下调试。
BOSE框架解决了所有这些问题,并为所有开发人员结束了这些烦恼。它是用于网络刮刀的Django。
在一路上,我还将分享Bose框架的一些重要功能。因此,让我们开始。
入门
首先,让我们通过克隆入门模板下载Bose启动项目:
git clone https://github.com/omkarcloud/bose-starter my-bose-project
然后,更改为my-bose-project
目录,安装依赖项并启动项目:
cd my-bose-project
python -m pip install -r requirements.txt
python main.py
每当我们使用硒时,我们都需要下载Chrome的正确硒版。
过去,您必须访问Chrome网站才能下载正确的驱动程序,但值得庆幸的是,当您第一次运行该项目时,Bose会自动下载build/
目录中的正确驱动程序。
刮擦引号.toscrape.com
我们将刮擦引号。
在src/scraper.py中写下以下代码:
from selenium.webdriver.common.by import By
from bose import BaseTask, Wait, Output
class Task(BaseTask):
def run(self, driver):
driver.get("https://quotes.toscrape.com/")
els = driver.get_elements_or_none_by_selector('div.quote', Wait.SHORT)
items = []
for el in els:
text = driver.get_element_text(el.find_element(By.CSS_SELECTOR, "span.text"))
author = driver.get_element_text(el.find_element(By.CSS_SELECTOR, "small.author"))
item = {
"text" : text,
"author" : author,
}
items.append(item)
Output.write_finished(items)
此代码定义了从底座类继承的Python类任务。所有刮擦任务都必须从底板上继承才能执行刮擦。
现在,在任务的运行方法中,我们将驱动程序对象视为一个参数,这是bossdriver的实例。
BossDriver扩展了Selenium Webdriver,以添加功能强大的Utlolity方法用于刮擦。例如,get_elements_or_none_by_selector
在这里找到了使用Selector div.Quote的所有元素,并等待最多4秒(WAIT.SHORT)找到它们。硒中同一件事本来是详细的。
然后,该方法初始化了一个空列表项,并在ELS列表上迭代,其中包含带有类名称的DIV元素。对于每个元素,它使用find_element和get_element_text方法提取报价和作者名称的文本。
最后,它将字典项目附加到包含报价文本和作者名称的项目列表。
然后,我们使用BOSE的输出对象,该对象旨在简化读取,JSON的撰写,CSV文件在Selenium中易于使用。现在使用输出对象,我们在IT输出/完成中写入。
现在,要运行项目,执行命令:
python main.py
您看到它开始刮擦引号。
此外,还将生成/任务/1/目录。
Web刮擦通常会充满错误,例如错误的选择器或无法加载的页面。与RAW Selenium进行调试时,您可能必须筛选日志以识别问题。幸运的是,Bose使您可以通过存储有关每次运行的信息进行调试变得简单。
如果您观察任务/1/目录,您会注意到它包含三个文件,这些文件如下:
task_info.json
它包含有关任务运行的信息,例如任务运行的持续时间,任务的IP详细信息,用户代理,window_size和用于执行任务的配置文件。
final.png
这是关闭驾驶员之前捕获的屏幕截图。
page.html
这是驾驶员关闭之前捕获的HTML源。如果您的选择器未能选择元素,则非常有用。
error.log
以防您的任务因异常而崩溃,我们还存储了错误。log包含该任务崩溃的错误。这是在调试中非常有效的。
异常处理
在Bose中,当刮擦任务中发生异常时,浏览器将保持打开状态,而不是立即关闭。这对于调试目的很有用,因为它允许您在异常时查看实时浏览器状态。
例如,如果我们将scraper.py中的代码替换为以下代码,该代码选择了一个非易位选择器,从而导致异常并运行它:
from selenium.webdriver.common.by import By
from bose import BaseTask, Wait, Output
class Task(BaseTask):
def run(self, driver):
driver.get("https://quotes.toscrape.com/")
els = driver.get_elements_or_none_by_selector('div.some-not-exisiting-selector', Wait.SHORT)
items = []
for el in els:
text = driver.get_element_text(el.find_element(By.CSS_SELECTOR, "span.text"))
author = driver.get_element_text(el.find_element(By.CSS_SELECTOR, "small.author"))
item = {
"text" : text,
"author" : author,
}
items.append(item)
Output.write_finished(items)
您会注意到浏览器不会关闭,BOSE会提示您按Enter关闭浏览器。当您尝试在异常时在浏览器中调试代码时,此功能非常方便。
浏览器配置
Bose使得使用不同选项的硒驱动器配置很容易,例如
- 要使用哪个配置文件
- 要使用哪种用户代理
- 使用哪个窗口大小
您可以使用BrowserConfig类轻松配置这些选项。例如,您可以如何配置驱动程序以使用Chrome 106用户代理,窗口大小1280x720和配置文件1:
from selenium.webdriver.common.by import By
from bose import BaseTask, BrowserConfig, UserAgent,WindowSize
class Task(BaseTask):
browser_config = BrowserConfig(user_agent=UserAgent.user_agent_106, window_size=WindowSize.window_size_1280_720, profile=1)
def run(self, driver):
driver.get("https://quotes.toscrape.com/")
在此示例中,我们使用Task
类的browser_config
属性设置BrowserConfig
。
使用未发现的驱动程序
Bose还支持undetected_driver
库,该库提供了一个强大的驱动程序,可以通过Cloudflare等反机器人服务来逃避检测。尽管启动时间较慢,但可检测到的要少得多。要使用它,请将use_undetected_driver
选项传递给BrowserConfig
,例如:
from selenium.webdriver.common.by import By
from bose import BaseTask, BrowserConfig, UserAgent,WindowSize
class Task(BaseTask):
browser_config = BrowserConfig(use_undetected_driver=True, user_agent=UserAgent.user_agent_106, window_size=WindowSize.window_size_1280_720, profile=1,)
输出数据中的数据
Bose提供了很好的支持,可以使用Output
类轻松输出CSV,Excel或JSON。要使用它,请调用要保存的文件类型的write
方法。
所有数据都将保存在output/
文件夹中:
from bose import Output
data = [
{
"text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d",
"author": "Albert Einstein"
},
{
"text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d",
"author": "J.K. Rowling"
}
]
Output.write_json(data, "data.json")
Output.write_csv(data, "data.csv")
Output.write_xlsx(data, "data.xlsx")
使用localstorage
就像现代浏览器如何具有本地存储模块一样,Bose也将相同的概念纳入其框架中。
您可以从浏览器运行中将localstorage对象导入持久数据,这在刮擦大量数据时非常有用。
数据存储在您项目的根目录中的名为local_storage.json
的文件中。您可以使用它:
from bose import LocalStorage
LocalStorage.set_item("pages", 5)
print(LocalStorage.get_item("pages"))
结论
总而言之,Bose是一个很好的框架,可简化硒和网络刮擦的无聊部分。我们鼓励您在Boss Driver上阅读Bossdriver的参考,这是Selenium的扩展版本,它添加了一些很棒的方法来帮助您进行刮擦。