python信息采集器_python实现的一个火车票转让信息采集器

这是一个Python脚本,用于自动查询和获取58同城和赶集网上发布的火车票转让信息,并通过邮件通知用户。脚本使用BeautifulSoup库解析网页内容,通过正则表达式过滤卧铺票信息,并定时通过SMTP发送邮件。脚本可配置车次、日期和收件人邮箱。将其加入cron任务,可实现定期检查和通知。
摘要由CSDN通过智能技术生成

好吧,我承认我是对晚上看到一张合适的票转让但打过电话去说已经被搞走了这件事情感到蛋疼。直接上文件吧。

#coding: utf-8

'''

春运查询火车票转让信息

Author: piglei2007@gmail.com

Date: 2011.01.25

'''

import re

import os

import time

import urlparse

import datetime

import traceback

import urllib2

import socket

socket.setdefaulttimeout(20)

BLANK_RE = re.compile(r"\s+")

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())

opener.addheaders = [

("User-agent", "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1) Gecko/20090704 Firefox/3.5"),

("Accept", "*/*"),

]

urllib2.install_opener(opener)

from BeautifulSoup import BeautifulSoup

SOURCE = {

"58": "http://bj.58.com/huochepiao/?Num=%(train)s&StartTime=%(date)s00",

"ganji": "http://bj.ganji.com/piao/cc_%(train)s/%(date)s/",

}

RECORD_FILE = "/tmp/ticket_records.txt"

def parse_record():

try:

return set([x.strip() for x in open(RECORD_FILE, "r").readlines()])

except IOError:

open(RECORD_FILE, "w")

return set()

def flush_record(records):

open(RECORD_FILE, "w").write("\n".join(records))

def main(config):

"""

开始抓取

"""

existed = parse_record()

to_email = []

for train in config["trains"]:

for date in config["dates"]:

for type, _url in SOURCE.items():

url = _url % dict(train=train, date=date)

content = urllib2.urlopen(url).read()

soup = BeautifulSoup(content)

result = parse_content(type, soup, train)

for url, text in result:

url = urlparse.urljoin(_url, url)

# 只要卧铺!

if url not in existed and u"卧" in text:

to_email.append([text, url])

existed.add(url)

if to_email:

content = "".join(

[x for x in [" | ".join(y) for y in to_email]]

).encode("utf-8")

simple_mail(config["people"], content)

flush_record(existed)

def parse_content(type, soup, train):

"""

获得车次信息

"""

result = []

if type == "58":

info_table = soup.find("table", id="infolist")

if info_table:

for x in info_table.findAll("tr", text=re.compile(ur"%s(?!时刻表)" % train, re.I)):

a = x.parent

_text = BLANK_RE.sub("", a.text)

result.append([a["href"], _text])

if type == "ganji":

for x in soup.findAll("dl", {"class": "list_piao"}):

a = x.dt.a

result.append([a["href"], a.text])

return result

EMAIL_HOST = 'smtp.sohu.com'

EMAIL_HOST_USER = 'yourname@sohu.com'

EMAIL_HOST_PASSWORD = 'yourpassword'

EMAIL_PORT = 25

def simple_mail(to, content):

"""

发送邮件

"""

import smtplib

from email.mime.text import MIMEText

msgRoot = MIMEText(content, 'html', 'UTF-8')

msgRoot['Subject'] = "[%s]有票来啦!!!!" % datetime.datetime.today().isoformat(" ")

msgRoot['From'] = EMAIL_HOST_USER

msgRoot['To'] = ", ".join(to)

s = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT)

s.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)

s.sendmail(EMAIL_HOST_USER, to, msgRoot.as_string())

s.close()

def switch_time_zone():

"""

切换时区

"""

os.environ["TZ"] = "Asia/Shanghai"

time.tzset()

switch_time_zone()

if __name__ == '__main__':

config = {

"trains": ("k471",),

"dates": ("20110129",),

"people": (

"youremail@sohu.com",

)

}

try:

main(config)

print "%s: ok" % datetime.datetime.today()

except Exception, e:

print traceback.format_exc()

然后放入cron,你懂的。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的家教平台系统。该系统旨在为家教和学生提供一个便捷、高效的在线交流和预约平台,涵盖了从用户注册登录、个人信息管理、课程发布与搜索、预约与取消预约、评价反馈等一系列功能。 在后台管理方面,系统提供了管理员对用户信息、课程信息、预约记录等进行管理的功能,确保平台的正常运行和数据的准确性。通过Spring框架的依赖注入和AOP特性,实现了业务逻辑的清晰分离和高效处理;SpringMVC则负责处理前端请求和响应,提供友好的用户界面;MyBatis作为ORM框架,简化了数据库操作,提高了数据访问的效率和安全性。 前端部分采用Vue.js框架,结合Vue Router进行页面路由管理,Axios进行HTTP请求,实现了前后端分离的开发模式。Vue.js的组件化开发和响应式数据绑定特性,使得前端页面更加动态和交互性强,提升了用户体验。 数据库设计采用了MySQL,存储了用户信息、课程信息、预约记录等核心数据。通过合理的数据库表结构和索引设计,保证了系统的高效运行和数据的一致性。 该项目不仅适合计算机相关专业的毕设学生参考和学习,也适合Java学习者进行项目实战练习。通过对该项目的深入理解和二次开发,可以实现更多个性化功能,进一步提升技术水平和实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值