Python实战:5分钟教你用Requests+BeautifulSoup写一个简易票务监控脚本

Python实战:5分钟教你用Requests+BeautifulSoup写一个简易票务监控脚本 Python实战5分钟教你用RequestsBeautifulSoup写一个简易票务监控脚本最近发现身边不少朋友都在为抢不到演唱会门票发愁。作为一个Python爱好者我一直在想能不能用技术手段解决这个问题。经过几次尝试我发现其实用Python的基础爬虫库Requests和BeautifulSoup就能快速搭建一个轻量级的票务监控脚本。这个脚本不需要复杂的逆向工程也不需要掌握多线程等高阶知识特别适合刚入门Python的朋友练手。1. 准备工作环境搭建与库安装在开始编写脚本之前我们需要确保开发环境已经准备就绪。Python环境建议使用3.6及以上版本这样可以避免一些兼容性问题。首先安装必要的库pip install requests beautifulsoup4Requests库是Python中最流行的HTTP客户端库它简化了发送HTTP请求的过程。BeautifulSoup则是一个HTML解析库能够帮助我们轻松地从网页中提取所需数据。提示如果你使用的是Anaconda环境也可以用conda install命令来安装这些库。这两个库的组合非常适合处理静态网页内容。对于大多数票务平台的基础信息页面来说这种组合已经足够应对。不过需要注意的是如果目标网站使用了大量JavaScript动态加载内容可能需要考虑Selenium这样的工具。2. 理解目标网站结构在编写爬虫脚本前我们需要先手动分析目标网站的结构。以某票务平台为例我们打开浏览器访问票务页面右键选择检查或查看页面源代码。关键是要找到以下几个信息票务信息的HTML结构票务状态的标识方式页面请求的URL通过分析我们发现票务信息通常包含在类似这样的HTML结构中div classticket-item span classticket-nameVIP座位/span span classticket-status可售/span span classticket-price¥1280/span /div了解这些结构后我们就能更有针对性地编写解析代码。3. 编写基础监控脚本现在我们可以开始编写核心监控代码了。脚本的主要功能是定期检查票务状态并在发现可售票时发出通知。import requests from bs4 import BeautifulSoup import time # 配置目标URL和检查间隔 TICKET_URL https://example.com/concert-tickets CHECK_INTERVAL 60 # 检查间隔(秒) def check_tickets(): try: # 发送GET请求获取页面内容 response requests.get(TICKET_URL) response.raise_for_status() # 检查请求是否成功 # 解析HTML内容 soup BeautifulSoup(response.text, html.parser) # 查找所有票务项 tickets soup.find_all(div, class_ticket-item) available_tickets [] for ticket in tickets: status ticket.find(span, class_ticket-status).text if 可售 in status: name ticket.find(span, class_ticket-name).text price ticket.find(span, class_ticket-price).text available_tickets.append(f{name} - {price}) return available_tickets except Exception as e: print(f检查票务时出错: {e}) return [] def main(): print(票务监控脚本已启动...) while True: available check_tickets() if available: print(\n发现可售票务:) for ticket in available: print(f - {ticket}) # 这里可以添加通知逻辑 else: print(., end, flushTrue) # 显示心跳 time.sleep(CHECK_INTERVAL) if __name__ __main__: main()这个基础版本已经可以实现定期检查票务状态的功能。当发现可售票时会在控制台打印相关信息。4. 添加实用功能增强脚本基础功能实现后我们可以考虑添加一些实用功能来提升脚本的实用性。4.1 添加邮件通知功能为了让脚本能在发现票务时主动通知我们可以集成邮件发送功能。这里使用Python内置的smtplib库import smtplib from email.mime.text import MIMEText def send_email(subject, body, to_email): # 配置发件邮箱信息 from_email your_emailexample.com password your_password # 创建邮件内容 msg MIMEText(body) msg[Subject] subject msg[From] from_email msg[To] to_email # 发送邮件 try: with smtplib.SMTP_SSL(smtp.example.com, 465) as server: server.login(from_email, password) server.send_message(msg) print(邮件通知已发送) except Exception as e: print(f发送邮件失败: {e})然后在main函数中当发现可售票时调用此函数if available: email_body 发现以下可售票务:\n \n.join(available) send_email(票务监控通知, email_body, your_emailexample.com)4.2 添加多场次监控功能很多时候我们可能想同时监控多场演出可以修改脚本支持多个URLCONCERT_URLS { 周杰伦演唱会: https://example.com/jay-chou, 五月天演唱会: https://example.com/mayday, Taylor Swift巡演: https://example.com/taylor-swift } def check_all_concerts(): results {} for name, url in CONCERT_URLS.items(): available check_tickets(url) if available: results[name] available return results4.3 添加日志记录功能为了更好地追踪脚本运行情况可以添加简单的日志记录import logging logging.basicConfig( filenameticket_monitor.log, levellogging.INFO, format%(asctime)s - %(message)s ) def log_available_tickets(event, tickets): logging.info(f{event}: {len(tickets)} tickets available) for ticket in tickets: logging.info(f - {ticket})5. 应对常见反爬机制在实际使用中很多票务网站会有反爬虫措施。这里介绍几种常见的应对方法5.1 添加请求头最简单的办法是添加常见的浏览器请求头headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept-Language: zh-CN,zh;q0.9 } response requests.get(url, headersheaders)5.2 使用会话保持有些网站需要保持会话状态session requests.Session() session.headers.update(headers) # 后续所有请求都使用同一个session response session.get(url)5.3 设置请求间隔过于频繁的请求可能导致IP被封合理的做法是import random # 在请求之间添加随机延迟 time.sleep(random.uniform(1, 3))6. 脚本优化与部署最后我们可以考虑一些优化措施让脚本更实用6.1 配置化将配置信息提取到单独的文件中# config.py CONFIG { check_interval: 60, concert_urls: { 周杰伦演唱会: https://example.com/jay-chou }, email: { from: your_emailexample.com, to: target_emailexample.com, smtp_server: smtp.example.com, password: your_password } }6.2 异常处理增强添加更完善的异常处理def safe_request(url, max_retries3): for attempt in range(max_retries): try: response session.get(url, timeout10) response.raise_for_status() return response except requests.exceptions.RequestException as e: print(f请求失败 (尝试 {attempt 1}/{max_retries}): {e}) if attempt max_retries - 1: time.sleep(5 * (attempt 1)) else: raise6.3 部署建议要让脚本长期运行可以考虑以下方式在树莓派等低功耗设备上运行使用云服务器设置为系统定时任务对于Windows系统可以创建批处理文件echo off python ticket_monitor.py pause对于Linux/Mac系统可以使用nohupnohup python3 ticket_monitor.py monitor.log 21 在实际使用这个脚本的过程中我发现最关键的其实是选择合适的检查频率。太频繁容易被封太慢又可能错过票务。经过多次测试1-2分钟的间隔通常是比较合适的。另外建议在非高峰时段先测试脚本的功能确保所有环节都能正常工作。