想知道如何用Python做一个自动监控商品价格,并在降价时给你发邮件提醒的小工具吗? 这篇文章就带你一步步实现!
1. 准备工作
首先,你需要安装一些必要的Python库:
- requests: 用于发送HTTP请求,获取网页内容。
- beautifulsoup4: 用于解析HTML网页,提取数据。
- smtplib: 用于发送邮件。
你可以使用pip安装这些库:
pip install requests beautifulsoup4
如果你还没有安装Python,请先安装Python 3.x。
2. 分析目标网站
选择一个你想要监控价格的电商网站,例如:https://www.example.com/product/123 (请替换成你实际要监控的商品页面)。
使用浏览器的开发者工具(通常按F12键打开)来分析网页的HTML结构,找到包含商品价格信息的HTML标签。 例如,价格可能在一个<span>
标签中,其class属性为price
:
<span class="price">$19.99</span>
你需要找到这个唯一的、稳定的HTML标签,以便程序能够准确地提取价格。
3. 编写爬虫代码
下面是一个简单的Python爬虫代码示例,用于获取商品价格:
import requests
from bs4 import BeautifulSoup
# 目标商品页面URL
url = 'https://www.example.com/product/123' # 替换成你要监控的商品URL
# 发送HTTP请求
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 找到价格标签
price_tag = soup.find('span', class_='price') # 替换成你实际的价格标签
# 提取价格
if price_tag:
price = price_tag.text.strip()
print(f'当前价格:{price}')
else:
print('未找到价格信息')
代码解释:
- 导入库: 导入
requests
和BeautifulSoup
库。 - 定义URL: 将目标商品页面的URL存储在
url
变量中。 - 发送请求: 使用
requests.get()
方法发送HTTP请求,获取网页内容。 - 解析HTML: 使用
BeautifulSoup
解析HTML内容。 - 查找价格标签: 使用
soup.find()
方法找到包含价格信息的HTML标签。你需要根据实际情况修改'span'
和class_='price'
,使其与目标网站的HTML结构匹配。 - 提取价格: 从价格标签中提取价格文本,并使用
strip()
方法去除首尾空格。 - 打印价格: 打印提取到的价格。
4. 设置价格监控
接下来,你需要设置一个价格监控机制,定期检查商品价格,并在价格低于某个阈值时发送邮件通知。
import time
# 设置目标价格
target_price = 15.00
while True:
# ... (之前的爬虫代码)
if price_tag:
try:
# 将价格转换为浮点数
price = float(price_tag.text.strip().replace('$', '')) # 根据实际情况修改货币符号
# 检查价格是否低于目标价格
if price < target_price:
print('价格低于目标价格!')
# TODO: 发送邮件通知
else:
print('价格未低于目标价格。')
except ValueError:
print('无法将价格转换为数字。')
else:
print('未找到价格信息')
# 每隔一段时间检查一次价格 (例如,每小时一次)
time.sleep(3600) # 单位:秒
代码解释:
- 设置目标价格: 将目标价格存储在
target_price
变量中。 - 循环检查: 使用
while True
创建一个无限循环,定期检查商品价格。 - 价格转换: 将提取到的价格文本转换为浮点数,以便进行比较。 注意要先移除货币符号,例如
$
。 - 价格比较: 检查价格是否低于目标价格。如果是,则打印一条消息,并调用发送邮件通知的函数(尚未实现)。
- 暂停: 使用
time.sleep()
方法暂停一段时间,然后再进行下一次检查。 这里设置为3600秒(1小时)。
5. 发送邮件通知
最后,你需要编写一个函数来发送邮件通知。你需要一个SMTP服务器的账号和密码。 你可以使用你常用的邮箱,例如QQ邮箱、163邮箱等。 这里以QQ邮箱为例:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 发送邮件
def send_email(subject, message):
# 你的邮箱账号和密码
sender = 'your_email@qq.com' # 替换成你的邮箱
password = 'your_password' # 替换成你的邮箱授权码(注意不是邮箱密码)
# 收件人邮箱
receiver = 'recipient_email@example.com' # 替换成收件人邮箱
# 邮件内容
msg = MIMEText(message, 'plain', 'utf-8')
msg['From'] = Header(sender, 'utf-8')
msg['To'] = Header(receiver, 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
try:
# 连接SMTP服务器
smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465) # QQ邮箱SMTP服务器地址和端口
smtp_obj.login(sender, password)
smtp_obj.sendmail(sender, [receiver], msg.as_string())
print('邮件发送成功')
except smtplib.SMTPException as e:
print(f'邮件发送失败: {e}')
finally:
smtp_obj.quit()
代码解释:
- 导入库: 导入
smtplib
和email
库。 - 设置邮箱信息: 将你的邮箱账号、密码(注意:QQ邮箱需要使用授权码,而不是邮箱密码)、收件人邮箱、邮件主题和内容存储在相应的变量中。
- 连接SMTP服务器: 使用
smtplib.SMTP_SSL()
方法连接到SMTP服务器。 QQ邮箱的SMTP服务器地址是smtp.qq.com
,端口是465。 - 登录邮箱: 使用
smtp_obj.login()
方法登录邮箱。 - 发送邮件: 使用
smtp_obj.sendmail()
方法发送邮件。 - 关闭连接: 使用
smtp_obj.quit()
方法关闭连接。
重要提示:
- QQ邮箱授权码: 登录QQ邮箱,进入“设置”->“账户”,开启“POP3/SMTP服务”,然后按照提示获取授权码。 这个授权码将代替你的邮箱密码,用于登录SMTP服务器。
- 其他邮箱: 如果你使用其他邮箱,例如163邮箱,你需要找到相应的SMTP服务器地址和端口,并按照其要求进行配置。
现在,将send_email()
函数添加到价格监控循环中:
if price < target_price:
print('价格低于目标价格!')
send_email('商品价格已降至目标价格以下!', f'商品 {url} 的价格已降至 {price},低于你的目标价格 {target_price}。')
else:
print('价格未低于目标价格。')
6. 完整代码
下面是完整的代码:
import requests
from bs4 import BeautifulSoup
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 目标商品页面URL
url = 'https://www.example.com/product/123' # 替换成你要监控的商品URL
# 设置目标价格
target_price = 15.00
# 发送邮件
def send_email(subject, message):
# 你的邮箱账号和密码
sender = 'your_email@qq.com' # 替换成你的邮箱
password = 'your_password' # 替换成你的邮箱授权码(注意不是邮箱密码)
# 收件人邮箱
receiver = 'recipient_email@example.com' # 替换成收件人邮箱
# 邮件内容
msg = MIMEText(message, 'plain', 'utf-8')
msg['From'] = Header(sender, 'utf-8')
msg['To'] = Header(receiver, 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
try:
# 连接SMTP服务器
smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465) # QQ邮箱SMTP服务器地址和端口
smtp_obj.login(sender, password)
smtp_obj.sendmail(sender, [receiver], msg.as_string())
print('邮件发送成功')
except smtplib.SMTPException as e:
print(f'邮件发送失败: {e}')
finally:
smtp_obj.quit()
while True:
# 发送HTTP请求
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 找到价格标签
price_tag = soup.find('span', class_='price') # 替换成你实际的价格标签
if price_tag:
try:
# 将价格转换为浮点数
price = float(price_tag.text.strip().replace('$', '')) # 根据实际情况修改货币符号
# 检查价格是否低于目标价格
if price < target_price:
print('价格低于目标价格!')
send_email('商品价格已降至目标价格以下!', f'商品 {url} 的价格已降至 {price},低于你的目标价格 {target_price}。')
else:
print('价格未低于目标价格。')
except ValueError:
print('无法将价格转换为数字。')
else:
print('未找到价格信息')
# 每隔一段时间检查一次价格 (例如,每小时一次)
time.sleep(3600) # 单位:秒
7. 运行代码
将代码保存为price_monitor.py
,并在命令行中运行:
python price_monitor.py
请确保你已经替换了代码中的以下信息:
url
: 目标商品页面的URLprice_tag
: 包含价格信息的HTML标签target_price
: 目标价格sender
: 你的邮箱账号password
: 你的邮箱授权码receiver
: 收件人邮箱
8. 总结
通过这篇文章,你学习了如何使用Python编写一个简单的商品价格监控工具。 你可以根据自己的需求修改代码,例如:
- 监控多个商品的价格。
- 将价格数据存储到数据库中。
- 使用更高级的爬虫技术,例如Selenium,来处理动态网页。
- 使用其他的通知方式,例如短信通知。
希望这篇文章对你有所帮助!