HOOOS

Python网络爬虫实战:商品价格监控与邮件通知

0 13 价格小灵通 Python爬虫价格监控邮件通知
Apple

想知道如何用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('未找到价格信息')

代码解释:

  1. 导入库: 导入requestsBeautifulSoup库。
  2. 定义URL: 将目标商品页面的URL存储在url变量中。
  3. 发送请求: 使用requests.get()方法发送HTTP请求,获取网页内容。
  4. 解析HTML: 使用BeautifulSoup解析HTML内容。
  5. 查找价格标签: 使用soup.find()方法找到包含价格信息的HTML标签。你需要根据实际情况修改'span'class_='price',使其与目标网站的HTML结构匹配。
  6. 提取价格: 从价格标签中提取价格文本,并使用strip()方法去除首尾空格。
  7. 打印价格: 打印提取到的价格。

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) # 单位:秒

代码解释:

  1. 设置目标价格: 将目标价格存储在target_price变量中。
  2. 循环检查: 使用while True创建一个无限循环,定期检查商品价格。
  3. 价格转换: 将提取到的价格文本转换为浮点数,以便进行比较。 注意要先移除货币符号,例如$
  4. 价格比较: 检查价格是否低于目标价格。如果是,则打印一条消息,并调用发送邮件通知的函数(尚未实现)。
  5. 暂停: 使用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()

代码解释:

  1. 导入库: 导入smtplibemail库。
  2. 设置邮箱信息: 将你的邮箱账号、密码(注意:QQ邮箱需要使用授权码,而不是邮箱密码)、收件人邮箱、邮件主题和内容存储在相应的变量中。
  3. 连接SMTP服务器: 使用smtplib.SMTP_SSL()方法连接到SMTP服务器。 QQ邮箱的SMTP服务器地址是smtp.qq.com,端口是465。
  4. 登录邮箱: 使用smtp_obj.login()方法登录邮箱。
  5. 发送邮件: 使用smtp_obj.sendmail()方法发送邮件。
  6. 关闭连接: 使用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: 目标商品页面的URL
  • price_tag: 包含价格信息的HTML标签
  • target_price: 目标价格
  • sender: 你的邮箱账号
  • password: 你的邮箱授权码
  • receiver: 收件人邮箱

8. 总结

通过这篇文章,你学习了如何使用Python编写一个简单的商品价格监控工具。 你可以根据自己的需求修改代码,例如:

  • 监控多个商品的价格。
  • 将价格数据存储到数据库中。
  • 使用更高级的爬虫技术,例如Selenium,来处理动态网页。
  • 使用其他的通知方式,例如短信通知。

希望这篇文章对你有所帮助!

点评评价

captcha
健康