Bose网络刮擦教程
#教程 #python #webscraping #webscrapingtools

Featured

在本教程中,您将了解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

我们将刮擦引号。

Dashboard

在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

您看到它开始刮擦引号。

Result

此外,还将生成/任务/1/目录。

Web刮擦通常会充满错误,例如错误的选择器或无法加载的页面。与RAW Selenium进行调试时,您可能必须筛选日志以识别问题。幸运的是,Bose使您可以通过存储有关每次运行的信息进行调试变得简单。

如果您观察任务/1/目录,您会注意到它包含三个文件,这些文件如下:

task_info.json

它包含有关任务运行的信息,例如任务运行的持续时间,任务的IP详细信息,用户代理,window_size和用于执行任务的配置文件。

task info

final.png

这是关闭驾驶员之前捕获的屏幕截图。

final

page.html

这是驾驶员关闭之前捕获的HTML源。如果您的选择器未能选择元素,则非常有用。

Page

error.log

以防您的任务因异常而崩溃,我们还存储了错误。log包含该任务崩溃的错误。这是在调试中非常有效的。

error 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关闭浏览器。当您尝试在异常时在浏览器中调试代码时,此功能非常方便。

error prompt

浏览器配置

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的扩展版本,它添加了一些很棒的方法来帮助您进行刮擦。