首页 > 编程问答 >自动数据抓取、GitHub 提交、通知和部署的最佳实践

自动数据抓取、GitHub 提交、通知和部署的最佳实践

时间:2024-07-29 16:20:33浏览次数:12  
标签:python git web-scraping automation notifications

我正在计划一个项目来自动执行以下任务:

从网站上抓取数据。 检查数据是否是新的或更新的。 将新数据推送到 GitHub 存储库。 检测到新数据时发送电子邮件通知或其他类型的通知(例如 Slack、FCM)。 将更新的数据部署到 Web 应用程序或其他应用程序。 鉴于可用的工具和库范围广泛,我正在寻找有关每项任务的最佳选项的建议。具体来说:

数据抓取:哪些是实现高效可靠的网络抓取的最佳库或工具? 数据比较:哪些方法或库最适合将抓取的数据与现有数据进行比较以确定它是新的还是更新的? GitHub 集成:哪些工具或脚本最适合自动执行将更新推送到 GitHub 存储库的过程? 通知:检测到新数据时发送电子邮件或其他类型通知(例如 Slack)的最有效方法是什么? 部署:将更新数据自动部署到 Web 应用程序或其他应用程序的最佳实践和工具是什么? 我熟悉 Python 脚本编写,但如果其他语言或工具具有显着优势,我愿意使用它们。

任何建议、最佳实践或特定工具的经验将不胜感激。提前感谢您的帮助!

我尝试使用 Python 和 BeautifulSoup 和 Scrapy 等库来进行数据抓取,但我不确定这些是否是最有效和最可靠的选择。为了比较数据,我考虑使用简单的文件比较方法,但这对于较大的数据集似乎效率低下。我还研究过使用 GitHub Actions 进行自动化,但发现设置整个工作流程具有挑战性。

我希望找到一个能够有效集成所有这些步骤的简化解决方案,但我对各种可用的工具和方法感到不知所措。我希望从那些成功实施类似工作流程的人那里获得有关最佳工具和实践的建议。

任何建议、最佳实践或特定工具的经验将不胜感激。预先感谢您的帮助!


以下是有关如何自动执行数据抓取、GitHub 提交、通知和部署工作流的一些最佳做法和工具建议:

数据抓取

  • 库:

    • Python: 你的选择(Beautiful Soup 和 Scrapy)很棒。其他选择包括 requests-html (结合了 requests 和 lxml 的解析功能)和 Selenium Playwright (用于需要 JavaScript 渲染的动态网站)。
    • Node.js: Cheerio (用于服务器端 JQuery 解析)、 Puppeteer Playwright
  • 高效和可靠的抓取提示:

    • 尊重 robots.txt: 在抓取之前,请检查网站的 robots.txt 文件 ( /robots.txt ) 以识别允许的抓取区域。
    • 限制请求速率: 不要用过多的请求轰炸网站。在请求之间使用延迟以避免被阻止。
    • 使用标头轮换: 轮换你的用户代理和引荐来源网址以降低被检测为机器人的可能性。
    • 处理错误: 为网络错误、超时和数据格式问题实施错误处理。

数据比较

  • 方法:

    • 哈希: 对于较大的数据集,计算整个数据集的哈希(例如 MD5 或 SHA256)是一种高效的方法。如果哈希值发生变化,则数据已更改。
    • 增量更新: 仅抓取并处理新的或更新的数据点。查找网站上提供的任何时间戳或 ID 并仅获取比上次抓取更新的内容。
    • 数据库比较: 将你的数据存储在数据库中并使用数据库查询来识别更改。
  • 库:

    • Python: hashlib (用于哈希)、数据库特定库(如 psycopg2 用于 PostgreSQL)。

GitHub 集成

  • 工具:

    • GitHub Actions: 这是自动执行 GitHub 存储库工作流(包括提交、推送和部署)的强大工具。你可以设置工作流来响应事件(如推送或计划事件)。
    • 脚本: 编写 Python 脚本或 bash 脚本来自动执行 Git 命令。
  • 提示:

    • 创建专用分支: 为你的抓取数据创建一个单独的分支,以将更改与你的主要代码库分开。
    • 使用有意义的提交消息: 使用描述性提交消息来记录对数据所做的更改。

通知

  • 服务:

    • 电子邮件: 大多数编程语言都有内置的电子邮件库。
    • Slack: 使用 Slack Webhooks 将消息发送到 Slack 频道。
    • FCM: 为移动通知使用 Firebase Cloud Messaging。
  • 提示:

    • 仅在必要时发送通知: 避免发送过多的通知。仅在新数据或错误时发送通知。
    • 使通知具有可操作性: 包含指向相关数据或日志的链接。

部署

  • 选项:

    • 静态网站: 如果你有静态网站,只需将数据推送到 GitHub 并将其部署到 Netlify、Vercel 或 GitHub Pages。
    • Web 应用程序: 使用平台即服务 (PaaS) 解决方案(如 Heroku、AWS Elastic Beanstalk 或 Google App Engine)。它们会自动执行部署过程。
    • 自定义脚本: 编写脚本来自动执行服务器上的部署步骤。
  • 最佳做法:

    • 持续集成/持续交付 (CI/CD): 尽可能实现 CI/CD 管道以自动化测试和部署。
    • 环境: 使用不同的环境(例如登台和生产)来测试更改,然后再将其发布到实时环境中。

示例工作流(使用 Python、GitHub Actions 和 Slack)

  1. 设置 GitHub 存储库: 创建一个包含你的代码、数据和 GitHub Actions 工作流文件的新存储库。

  2. 数据抓取和比较脚本( scrape_and_compare.py ):

import requests
from bs4 import BeautifulSoup
import hashlib
import os

def get_data():
    # 从网站获取数据
    url = 'https://example.com'  # 替换为你的目标网站
    response = requests.get(url)
    response.raise_for_status()  # 检查 HTTP 错误
    soup = BeautifulSoup(response.content, 'html.parser')
    # ... 从这里提取你的数据 ...
    return extracted_data

def calculate_hash(data):
    # 计算数据的哈希值
    encoded_data = str(data).encode()
    return hashlib.md5(encoded_data).hexdigest()

def save_data(data):
    # 将数据保存到文件
    with open('data.json', 'w') as f:
        json.dump(data, f)

def main():
    new_data = get_data()
    new_hash = calculate_hash(new_data)

    # 检查数据是否已更改
    if os.path.exists('data.json'):
        with open('data.json', 'r') as f:
            old_data = json.load(f)
            old_hash = calculate_hash(old_data)

        if old_hash == new_hash:
            print("数据没有变化。跳过更新。")
            return

    # 保存新数据
    save_data(new_data)

    # 提交到 GitHub 并发送 Slack 通知
    # ...

if __name__ == "__main__":
    main()
  1. GitHub Actions 工作流文件( .github/workflows/main.yml ):
name: 数据抓取

on:
  schedule:
    - cron: '0 * * * *'  # 每天运行

jobs:
  scrape:
    runs-on: ubuntu-latest
    steps:
      - name: 检出代码
        uses: actions/checkout@v3

      - name: 设置 Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'

      - name: 安装依赖项
        run: |
          pip install -r requirements.txt

      - name: 运行抓取脚本
        run: python scrape_and_compare.py

      - name: 提交更改(如果存在)
        run: |
          git config --global user.name 'GitHub Actions Bot'
          git config --global user.email '[email protected]'
          git add .
          git commit -m '更新数据' || echo "没有更改需要提交"
          git push origin main

      - name: 发送 Slack 通知
        if: success() && steps.commit.outputs.exit_code == 0
        uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

  1. 设置环境变量: 在你的 GitHub 存储库设置中,创建 SLACK_WEBHOOK_URL 的秘密,其中包含你的 Slack webhook URL。

本指南提供了更深入的见解,可以帮助你构建稳健且可扩展的数据抓取和自动化管道。 如果在实现过程中需要帮助或有关于特定工具或方面的更详细问题,请告诉我!

标签:python,git,web-scraping,automation,notifications
From: 78806032

相关文章

  • Cmake配置Qt程序调用python库的配置方法
    在网上找了一些配置方法,最简单直接的是在cmake中加入如下语句:set(PYTHON_EXECUTABLE/Python/Python311/python.exe)include_directories("/PythonPython311/include")link_directories("/PythonPython311/libs")link_libraries(python3.lib)link_libraries(python311.lib)直......
  • VSCode 的 Python 扩展中更详细的属性提示
    假设我有一个对象args由parser.parse_args()返回,并且它应该具有像args.port=6001、args.seed=1234这样的属性。当我在VSCode中按args.时,port和seed不会显示在建议的属性列表中,因为这些属性可能会......
  • 编写用于关键字检测和按钮发送的 Python Telegram 机器人
    我需要帮助用Python为我的Telegram机器人编写代码。我有一个config.py文件,其中包含两个关键字列表:keywords和button_phrases。keywords-负责在单击时显示子按钮的按钮。Button_phrases-负责单击时打开链接的按钮。我需要机器人检查用户输入的文本并按以下顺......
  • Python monorepo 打包,使用 Poetry
    我想将我的Python源代码组织到一个单一存储库中,具有以下基本结构:projectrootdir-libraryone-pyproject.toml-README-src/orgname/libraryone-__init__.py-somemodule.py-webapi-pyproject.toml-README-src/organa......
  • 常用Git 管理工具
    图形界面工具GitHubDesktopGitHub开发的一款跨平台的图形化Git工具,支持Windows、macOS和Linux。特点包括简洁的用户界面、易于创建和管理仓库、提交变更、分支管理等。SourceTreeAtlassian提供的一款免费的跨平台Git和Mercurial客户端。支持Windows和......
  • 如何使用Python AST给表达式a == b添加括号?
    请问,有谁知道如何使用PythonAST在代码中为a==b这样的表达式添加括号?我尝试过重写visit_Compare,但是ast.unparse中的delimit_if自动删除了我添加的括号,因为优先级a==b的值更高。你说的对,直接使用ast.unparse会因为优先级问题导致添加的括号被移除。为了解......
  • 使用 powershell 或 python 从网页列出公司名称
    我希望使用PowerShell或python仅列出URL中的公司名称:https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29下面是我的python脚本用于获取网页的结构:importrequestsfrombs4importBeautifulSoup#URLo......
  • T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!
    自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉及Docker、Qt、Python等组件特性。秉持......
  • 使用 Python 中的多处理防止共享内存中的数据损坏?
    我目前正在开发一个多处理Python程序,其中每个进程将其索引作为连续的4字节整数写入共享内存。并且有一个读取器可以在没有任何锁的情况下读取其他进程的索引。因为我没有使用任何同步原语,所以我担心读取器进程可能会由于逐字节写入内存而读取损坏的数据(例如,一个索引的前2个......
  • Python如何统治AI世界?一文读懂它的优势与挑战
    一、Python语言介绍1.1Python语言概述Python是一种由GuidovanRossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性,使其成为了许多开发者的首选语言。Python的语法简洁直观,采用了缩进来定义代码块,这与其他使用花括号或关键词的编程语言不同。Python......