隆重推出 Bose Framework:🚀 你的瑞士军刀,化身忍者刮刀 ✨
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
💡 什么是 Bose Framework?
Bose Framework 是一个专为 Selenium 开发者打造的框架,它汇集了经验丰富的机器人开发者的最佳实践,旨在帮助开发者创建难以检测、代码量少且易于调试的机器人。🤖
它能帮助您轻松抓取或自动化目标网站,让您拥有经验丰富的机器人开发者的强大能力,从而节省您大量的开发时间。👨🏻💻
🏆 顶级特色
Bose 是一个功能强大的框架,它实现了以下特性,可帮助您更快地创建机器人,从而节省您宝贵的开发时间。✨
- 使用 Bose 实现低样板代码:使用 Bare Selenium 启动浏览器需要编写大量代码:
from selenium import webdriver
driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.example.com')
driver.quit()
使用 Bose,您只需几行代码即可启动浏览器,无需担心指定路径:
from bose import *
class Task(BaseTask):
def run(self, driver):
driver.get('https://www.example.com')
- 只需一行代码即可配置配置文件、窗口大小和用户代理
在纯 Selenium 中,如果要配置配置文件、用户代理或窗口大小等选项,则需要编写大量代码,如下所示:
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
driver_path = 'path/to/chromedriver.exe'
options = Options()
profile_path = '1'
options.add_argument(f'--user-data-dir={profile_path}')
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.37")'
options.add_argument(f'--user-agent={user_agent}')
window_width = 1200
window_height = 720
options.add_argument(f'--window-size={window_width},{window_height}')
driver = webdriver.Chrome(executable_path=driver_path, options=options)
使用 Bose,您只需一行代码即可通过预定义变量进行设置。例如:
class Task(BaseTask):
browser_config = BrowserConfig(user_agent=UserAgent.user_agent_106, window_size=WindowSize.window_size_1280_720, profile=1)
- 每个机器人开发者都想要的异常处理功能
Bose 还解决了 Selenium 的一个常见问题——当出现异常时,浏览器会崩溃并自动关闭。这种行为对于机器人开发者来说并不理想,而且会使调试变得困难。
另一方面,Bose 会在发生异常时保持浏览器打开状态,从而更容易调试问题。
- 回忆过去
假设你的机器人正在运行,你去喝咖啡了,回来后发现机器人已经关闭了。
作为开发者,你可能很想知道浏览器关闭前截取的最后一张屏幕截图,或者想知道机器人完成任务花了多长时间。
嗯,每次你运行 Bose 程序时,它都会自动存储一些重要信息,例如
- 关闭前截取的屏幕截图
- 运行机器人所需的时间
- 发生的任何错误。
每次运行后,都会在文件夹中创建一个新文件夹tasks,其中包含以下三个文件:
task_info.json
它包含有关任务运行的信息,例如
- 任务运行持续时间
- 任务的 IP 详细信息
- 用户代理
- 窗口大小
- 轮廓
final.png
这是驱动程序关闭前截取的屏幕截图。
page.html
这是驱动程序关闭前捕获的 HTML 源代码。如果您的选择器未能选中元素,了解这一点非常有用。
error.log
如果您的任务因异常而崩溃,我们还会存储 error.log 文件,其中包含导致任务崩溃的错误信息。这对于调试非常有帮助。
- Perimeterx 的设计初衷就是为了抵御 Cloudflare,默认情况下
价值数百万美元的公司借助 Cloudflare 和 PerimeterX 来保护其宝贵的数据。
现在,您可能想知道如何绕过 Cloudflare 和 PerimeterX 之类的系统。一位名叫Leon的优秀开发者创建了一款 名为ChromeDriver 的工具 ,它能够很好地支持绕过所有主流的机器人检测系统, 例如 Distil、Datadome、Cloudflare 等。
要使用它,只需将该use_undetected_driver选项传递给BrowserConfig代码中的 `get` 函数,如下所示:
from bose import BaseTask, BrowserConfig
class Task(BaseTask):
browser_config = BrowserConfig(use_undetected_driver=True)
- 使用一行代码以 CSV 或 JSON 格式输出数据。
以 CSV 或 JSON 格式输出数据需要大量的命令式代码,如下所示:
import csv
import json
def write_json(data, filename):
with open(filename, 'w') as fp:
json.dump(data, fp, indent=4)
def write_csv(data, filename):
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = data[0].keys() # get the fieldnames from the first dictionary
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader() # write the header row
writer.writerows(data) # write each row of data
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"
}
]
write_json(data, "data.json")
write_csv(data, "data.csv")
Bose 通过将这些复杂性封装在 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")
- 无论是在 Mac、Linux 还是 Windows 系统上,都能运行相同的代码。无需再更改驱动程序路径。
Bose 通过抽象化消除 Windows、Mac 和 Linux 等操作系统之间的差异,简化了跨平台开发。
启动浏览器时,不再需要为每个操作系统指定特定的驱动程序路径。
- 新增强大方法,加速机器人开发
Bose Task 方法中提供的驱动程序run是 Selenium 的扩展版本,它添加了许多强大的方法,使 Selenium 的使用更加便捷。Bose Framework 添加到 Selenium 驱动程序中的一些常用方法包括:
| 方法 | 描述 |
|---|---|
| get_by_current_page_referrer(link, wait=None) | 模拟用户通过点击链接进入页面的访问行为。这种方法能够创造更自然、更不易被察觉的浏览行为。 |
| js_click(element) | 允许您使用 JavaScript 点击元素,绕过弹出窗口或警告框中的任何拦截(ElementClickInterceptedException)。 |
| get_cookies_and_local_storage_dict() | 返回一个包含“cookies”和“local_storage”的字典 |
| add_cookies_and_local_storage_dict(self, site_data) | 向当前网站添加 cookie 和本地存储数据 |
| organic_get(link, wait=None) | 先访问谷歌,然后再访问“链接”,这样就更难被检测到。 |
| 本地存储 | 返回一个 LocalStorage 模块实例,以便以易于使用的方式与浏览器的本地存储进行交互。 |
| 保存屏幕截图(文件名=无) | 将当前网页的屏幕截图保存到 tasks/ 目录中的文件中。 |
| short_random_sleep() 和 long_random_sleep(): | 睡眠时间随机,介于 2 到 4 秒之间(短)或介于 6 到 9 秒之间(长)。 |
| get_element_or_* [例如:get_element_or_none、get_element_or_none_by_selector、get_element_by_id、get_element_or_none_by_text_contains] | 根据不同条件查找页面上的网页元素。如果网页元素存在,则返回该元素;否则返回 None。 |
| is_in_page(target, wait=None, raise_exception=False) | 检查浏览器是否位于指定的页面 |
简单来说,Bose 是一个优秀的框架,它简化了 Selenium 和网络爬虫中枯燥乏味的部分。
🚀 开始使用 Bose
现在,让我们来看看如何才能轻松拥有 Bose 的神奇体验。
首先克隆模板
git clone https://github.com/omkarcloud/bose-starter my-bose-project
然后切换到该目录,安装依赖项,打开 VS Code,然后启动项目:
cd my-bose-project
python -m pip install -r requirements.txt
code .
python main.py
首次运行需要一些时间,因为它需要下载 Chrome 驱动程序可执行文件,后续运行速度会很快。
启动后,它将从quotes.toscrape.com抓取数据,并将结果存储在 /output/finished.json 中。
✨ V2 版本即将推出的功能将极大地提升 🔋 机器人开发效率
- Kubernetes 集成,助您以 Google 的规模抓取数据 [优先级]
- 通过将用户配置文件存储在单个 JSON 文件中,并同时存储网站的 cookie 和本地存储空间,从而节省存储空间。[优先级]
- 提供临时电子邮件服务 [优先级]
- 购买数百个预先创建的 Google 和 Microsoft 帐户 [优先]
- 内置请求 IP 轮换 [优先级]
- 验证码破解功能已集成到 Bose 中 [优先级]
- 为印度、俄罗斯、欧洲、中国和美国等国家的用户生成姓名、电子邮件、用户名等。
📚 摘要
简而言之,Bose 让您能够轻松地自动化或抓取目标网站及其内容,就像用刀切黄油一样简单。
👋 你好,读者朋友,
您怎么看?您认为Bose Framework有价值吗?
请在评论区分享您的想法,我会回复每一条评论。
文章来源:https://dev.to/rajesh_singh_1989/meet-bose-framework-your-swiss-army-knife-as-a-ninja-scraper-42dn






