用 Cron 搭建自动化网页数据抓取系统

0 阅读1分钟

用 Cron 搭建自动化网页数据抓取系统

你是否厌倦了手动下载和处理每日更新的网页数据?Cron 通过自动化定时任务,可以轻松解决这一问题。本文适合收藏备查,以表格、代码块、列表为主,极简说明。

环境准备

工具/库版本用途
Python3.8+编写抓取脚本
cron-定时任务调度
BeautifulSoup4.9.3解析 HTML 数据
requests2.25.1发送 HTTP 请求

安装依赖

pip install beautifulsoup4 requests

创建抓取脚本

import requests
from bs4 import BeautifulSoup
import json
import os
from datetime import datetime

# 发送 HTTP 请求
url = 'https://example.com/data-page'
response = requests.get(url)
response.raise_for_status()  # 检查请求是否成功

# 解析 HTML 内容
soup = BeautifulSoup(response.text, 'html.parser')
data_element = soup.find('div', {'id': 'data-container'})  # 找到包含数据的元素

# 提取数据
data = []
for item in data_element.find_all('p'):
    data.append(item.text.strip())

# 保存数据
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
filename = f'data_{timestamp}.json'
with open(filename, 'w') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

# 输出日志
print(f'Data saved to {filename}')
  • 关键点:requests.get 发送请求,BeautifulSoup 解析 HTML,json.dump 保存数据

配置 Cron

  1. 打开 Crontab 编辑器
    crontab -e
    
  2. 添加定时任务
    0 2 * * * /usr/bin/python3 /path/to/your_script.py >> /path/to/logfile.log 2>&1
    
    • 任务解析:每天凌晨 2 点运行脚本,日志输出到指定文件

查看任务

crontab -l

日志管理

  1. 日志文件路径配置
    LOG_FILE="/path/to/logfile.log"
    
  2. 定期清理日志
    0 0 * * * find /path/to/logs -type f -mtime +30 -exec rm {} \;
    
    • 任务解析:每月删除 30 天前的日志文件

错误处理

  1. 添加异常捕获
    try:
        response = requests.get(url)
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"Error fetching {url}: {e}")
        exit(1)
    
  2. 邮件通知
    import smtplib
    from email.mime.text import MIMEText
    
    def send_email(subject, body):
        msg = MIMEText(body)
        msg['Subject'] = subject
        msg['From'] = 'your_email@example.com'
        msg['To'] = 'recipient_email@example.com'
    
        with smtplib.SMTP('smtp.example.com', 587) as server:
            server.starttls()
            server.login('your_email@example.com', 'your_password')
            server.sendmail('your_email@example.com', 'recipient_email@example.com', msg.as_string())
    
    • 使用示例:
      try:
          # 抓取和处理数据
      except Exception as e:
          send_email('Data Fetch Error', str(e))
          exit(1)
      

数据存储优化

  1. 使用数据库存储
    import sqlite3
    
    conn = sqlite3.connect('/path/to/your_database.db')
    cursor = conn.cursor()
    
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS data (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        timestamp DATETIME,
        content TEXT
    )
    ''')
    
    timestamp = datetime.now()
    for item in data:
        cursor.execute('''
        INSERT INTO data (timestamp, content) VALUES (?, ?)
        ''', (timestamp, item))
    
    conn.commit()
    conn.close()
    
  2. 数据压缩
    import gzip
    
    with gzip.open(f'{filename}.gz', 'wt', encoding='utf-8') as gz_file:
        json.dump(data, gz_file, ensure_ascii=False, indent=4)
    os.remove(filename)
    

安全性和隐私

  1. 使用代理
    proxies = {
        'http': 'http://10.10.1.10:3128',
        'https': 'http://10.10.1.10:1080',
    }
    response = requests.get(url, proxies=proxies)
    
  2. 设置 User-Agent
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    

监控和调试

  1. 使用第三方监控工具

    • Hey Cron 可以帮助你监控 Cron 任务,自动发送失败通知,提供详细的日志和历史记录。
    • 配置示例:
      0 2 * * * /usr/bin/python3 /path/to/your_script.py >> /path/to/logfile.log 2>&1
      
      • Hey Cron 会自动监控并记录任务的运行状态
  2. 调试本地脚本

    • 使用 python -m pdb your_script.py 进行调试

高级技巧

  1. 动态配置 Cron

    import subprocess
    
    cron_job = '0 2 * * * /usr/bin/python3 /path/to/your_script.py >> /path/to/logfile.log 2>&1\n'
    with open('/path/to/crontab', 'w') as f:
        f.write(cron_job)
    
    subprocess.run(['crontab', '/path/to/crontab'])
    
  2. 负载均衡

    • 使用多台服务器分担负载,避免单一服务器压力过大

结论

通过本文的实战案例,你已经掌握了如何使用 Cron 定时抓取网页数据。结合 Hey Cron 的监控功能,可以进一步提升系统的稳定性和可靠性。下次再遇到需要定时抓取数据的场景,直接参考本文即可。