Mac+VSCode环境下Python每日自动爬取JSON链接并邮件推送求助
解决Mac上每日自动爬取JSON并邮件发送的问题
一、实现邮件发送功能
既然你已经写好爬取代码,那直接在Python脚本里集成邮件发送模块就行。用Python内置的smtplib和email库就能搞定,给你个具体的示例:
import smtplib from email.mime.text import MIMEText from email.header import Header import json # 你已有的爬取函数,返回JSON数据 def crawl_json(): # 替换成你的实际爬取逻辑 json_data = {"今日数据": "爬取到的内容", "更新时间": "2024-XX-XX"} return json_data def send_email(content): # 配置邮箱信息 sender = "你的发件邮箱@xxx.com" receiver = "你的收件邮箱@xxx.com" # 对应邮箱的SMTP服务器,比如QQ邮箱是smtp.qq.com,Gmail是smtp.gmail.com smtp_server = "smtp.xxx.com" # 邮箱密码/应用密码(Gmail需要开启两步验证后生成应用密码) password = "你的邮箱密码或应用密码" # 构造邮件内容 msg = MIMEText(content, 'plain', 'utf-8') msg['From'] = Header("JSON爬取通知", 'utf-8') msg['To'] = Header("自己", 'utf-8') msg['Subject'] = Header("每日JSON爬取内容", 'utf-8') try: # 连接SMTP服务器并发送邮件 server = smtplib.SMTP_SSL(smtp_server, 465) # SSL端口一般为465 server.login(sender, password) server.sendmail(sender, receiver, msg.as_string()) print("邮件发送成功") except Exception as e: print(f"邮件发送失败: {e}") finally: server.quit() if __name__ == "__main__": # 爬取JSON并格式化 raw_data = crawl_json() formatted_content = json.dumps(raw_data, indent=4, ensure_ascii=False) # 发送邮件 send_email(formatted_content)
注意事项:
- 不同邮箱的SMTP配置不同,比如163邮箱用
smtp.163.com,端口465;QQ邮箱需要在设置里开启SMTP服务。 - Gmail用户必须开启两步验证,然后生成应用密码代替登录密码,否则会被谷歌拦截。
- 先单独运行这段代码,确保邮件能正常发送再进行下一步。
二、Mac上实现每日自动执行
Mac系统更推荐用launchd做定时任务,比crontab稳定,不会因为用户会话切换导致任务失效。
步骤1:创建plist配置文件
在~/Library/LaunchAgents/目录下新建一个后缀为.plist的文件,比如com.yourname.jsoncrawler.plist(用反向域名格式命名,保证唯一性)。
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <!-- 任务唯一标识 --> <key>Label</key> <string>com.yourname.jsoncrawler</string> <!-- 执行命令:Python路径 + 脚本绝对路径 --> <key>ProgramArguments</key> <array> <!-- 替换成你的Python路径,终端输入which python3可查看 --> <string>/usr/local/bin/python3</string> <!-- 替换成你的爬取脚本绝对路径,比如/Users/xxx/Documents/json_crawler.py --> <string>/Users/yourname/path/to/your/json_crawler.py</string> </array> <!-- 定时规则:每天早上8点执行 --> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>8</integer> <key>Minute</key> <integer>0</integer> </dict> <!-- 日志路径,方便排查问题 --> <key>StandardOutPath</key> <string>/Users/yourname/Documents/json_crawler_logs/out.log</string> <key>StandardErrorPath</key> <string>/Users/yourname/Documents/json_crawler_logs/error.log</string> <!-- 不需要持续保持任务活跃 --> <key>KeepAlive</key> <false/> <!-- 以当前用户身份运行 --> <key>UserName</key> <string>yourname</string> </dict> </plist>
配置说明:
- 务必用绝对路径!Python路径和脚本路径都不能用相对路径,否则任务找不到文件。
- 提前创建日志文件夹
/Users/yourname/Documents/json_crawler_logs/,否则会报错。 - 可以修改
StartCalendarInterval里的时间,比如改成每天20点整执行。
步骤2:加载并启动定时任务
打开终端执行以下命令:
# 加载plist配置文件 launchctl load ~/Library/LaunchAgents/com.yourname.jsoncrawler.plist # 启动任务 launchctl start com.yourname.jsoncrawler
如果需要停止或移除任务:
# 停止任务 launchctl stop com.yourname.jsoncrawler # 移除任务(不再自动执行) launchctl unload ~/Library/LaunchAgents/com.yourname.jsoncrawler.plist
测试定时任务
可以临时把StartCalendarInterval改成当前时间的下一分钟(比如现在10:30,就设Hour=10,Minute=31),然后加载任务,等待时间到了查看日志和邮箱,确认任务是否正常执行。
三、常见问题排查
- 邮件发送失败:检查SMTP服务器、端口、密码是否正确,邮箱是否开启SMTP服务,Gmail用户是否用了应用密码。
- 定时任务不执行:用
plutil -lint ~/Library/LaunchAgents/com.yourname.jsoncrawler.plist验证plist语法是否正确,确认Python和脚本路径是绝对路径,日志文件夹是否存在,权限是否足够。 - 依赖库找不到:如果脚本用到第三方库,确保Python解释器是你安装库的那个(终端输入
pip3 list查看库是否在该环境下)。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

