用 Cron 搭建自动化网页数据抓取系统
你是否厌倦了手动下载和处理每日更新的网页数据?Cron 通过自动化定时任务,可以轻松解决这一问题。本文适合收藏备查,以表格、代码块、列表为主,极简说明。
环境准备
| 工具/库 | 版本 | 用途 |
|---|---|---|
| Python | 3.8+ | 编写抓取脚本 |
| cron | - | 定时任务调度 |
| BeautifulSoup | 4.9.3 | 解析 HTML 数据 |
| requests | 2.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
- 打开 Crontab 编辑器
crontab -e - 添加定时任务
0 2 * * * /usr/bin/python3 /path/to/your_script.py >> /path/to/logfile.log 2>&1- 任务解析:每天凌晨 2 点运行脚本,日志输出到指定文件
查看任务
crontab -l
日志管理
- 日志文件路径配置
LOG_FILE="/path/to/logfile.log" - 定期清理日志
0 0 * * * find /path/to/logs -type f -mtime +30 -exec rm {} \;- 任务解析:每月删除 30 天前的日志文件
错误处理
- 添加异常捕获
try: response = requests.get(url) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"Error fetching {url}: {e}") exit(1) - 邮件通知
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)
- 使用示例:
数据存储优化
- 使用数据库存储
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() - 数据压缩
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)
安全性和隐私
- 使用代理
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } response = requests.get(url, proxies=proxies) - 设置 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)
监控和调试
-
使用第三方监控工具
- Hey Cron 可以帮助你监控 Cron 任务,自动发送失败通知,提供详细的日志和历史记录。
- 配置示例:
0 2 * * * /usr/bin/python3 /path/to/your_script.py >> /path/to/logfile.log 2>&1- Hey Cron 会自动监控并记录任务的运行状态
-
调试本地脚本
- 使用
python -m pdb your_script.py进行调试
- 使用
高级技巧
-
动态配置 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']) -
负载均衡
- 使用多台服务器分担负载,避免单一服务器压力过大
结论
通过本文的实战案例,你已经掌握了如何使用 Cron 定时抓取网页数据。结合 Hey Cron 的监控功能,可以进一步提升系统的稳定性和可靠性。下次再遇到需要定时抓取数据的场景,直接参考本文即可。