计算机系统应用教程网站

网站首页 > 技术文章 正文

使用 Docker 自动化您的网页抓取

btikc 2024-09-03 11:22:58 技术文章 9 ℃ 0 评论

利用预构建的 Python Selenium 示例Docker 容器中设置自动化的、定时的抓取任务,轻松实现定时抓取,满足您的需求。

从单页应用框架(如 React、Vue.js 或 Angular)抓取数据可能非常棘手,尤其是在没有用户界面的情况下。这类应用程序很多使用与鼠标相关的交互或基于 JavaScript 计算状态。因此,Selenium 是从单页应用抓取数据的最佳选择。

完成抓取逻辑后,您通常需要按计划运行它,并将数据发送到数据库或其他服务。

这是一个 Docker 容器,包含了使用 Selenium 抓取器的完整示例,带有完整的用户界面。

使用示例

Docker 容器是“selenium grid standalone firefox”的一个分支。它使用一个完整集成的 VNC 服务器,可以帮助您“查看”抓取器当前正在执行的操作。

GitHub - therealthoren/python-selenium-scraper-template: Watch your python scraper with selenium in a docker container - GitHub[1]

首先,您克隆这个模板仓库。

然后输入所有您抓取逻辑所在目标仓库的详细信息。

在创建完您的仓库后,从您的仓库进行 git 克隆。

构建和运行 Docker

模板项目生成了一个名为“python-selenium-scraper-template”的 Docker 容器。如果您想修改,请更改文件 build.shrun.sh

您可以通过调用以下 shell 脚本来构建 Docker 容器。

chmod +x build.sh
sh build.sh

然后您可以通过运行以下命令来运行您的 Docker 容器:

chmod +x run.sh
sh run.sh

就是这样。现在您的抓取器会自动运行。

修改计划定时器

默认情况下,抓取器每 15 分钟调用一次。这仅用于测试目的,您可以通过修改相应的 Dockerfile 并重新构建它来更改此调度器。

dockerfile
...


RUN (crontab -l ; echo "*/15 * * * * /opt/scheduler.sh >> /var/log/cron/cron-scheduled.log 2>&1") | crontab


....

查看抓取器的运行状态

如果您想查看抓取器当前的运行情况,可以打开浏览器并访问地址:http://localhost:4444/ui/

保存抓取的数据 —— 包含 Python 示例

通常,您会希望将抓取的数据保存到数据库或发送到 API。在 app/scraper.py中有一个关于如何保存数据的示例。

如果您想将数据保存到 webhook 端点,可以使用 WebhookNotification。如果您想使用其他通知方式或自定义的通知方式,请在文件 app/notifier.py 中进行更改。

# 如果您想使用 Webhooks 作为通知,请使用以下代码行
# TODO: 将 Webhook URL 改为您的 URL 或实现您自己的接收数据的通知逻辑
####
# logic = LogicController(notification=WebhookNotification("http://your-scraped-data-receiver-url.com/endpoint"
#                                                         , only_finished=True))
####


# 通常您会使用 EmptyNotification,它只会将数据打印到控制台,您需要自己保存抓取的数据
logic = LogicController(notification=EmptyNotification())

这是来自 app/scraper.py 的示例抓取器的示例。

def runScraper(driver: WebDriver, logic: INotification):
    # driver 是 selenium webdriver
    # logic 默认是 "Empty Notification" - 它什么都不做
    yourScrapedData = []


    #### 在此处编写您的代码 ####
    driver.get("https://www.google.de/")


    sleep(1)


    # 找到 button>div[contains(text(), '')]
    button = driver.find_elements(By.XPATH, "//div//button//div[contains(text(), 'All')]")
    if button is not None and len(button) > 0:
        button[0].click()


    sleep(2)


    # 实现抓取逻辑
    textareas = driver.find_elements(By.XPATH, "//textarea")
    if textareas is not None and len(textareas) > 0:
        textareas[0].send_keys("Hello World")
        sleep(1)
        textareas[0].send_keys(Keys.ENTER)


    sleep(2)


    # 点击第一个链接
    links = driver.find_elements(By.XPATH, "//span//h3")
    if links is not None and len(links) > 0:
        logic.message("Clicking on the first link: "+links[0].text)
        links[0].click()


    logic.message("Title: " + driver.title)
    #### 在此处编写您的代码 ####


    sleep(2)


    return yourScrapedData

快乐抓取!

感谢阅读.

更多信息

本文由笔者翻译整理自:https://medium.com/@thoren.lederer/automate-your-web-scraping-with-docker-schedule-python-selenium-scripts-on-cron-and-watch-the-a15511701a75,如对您有帮助,请帮忙点赞、转发、关注。谢谢!

References

[1] GitHub - therealthoren/python-selenium-scraper-template: Watch your python scraper with selenium in a docker container - GitHub: https://github.com/therealthoren/python-selenium-scraper-template

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表