python实现的一个火车票转让信息采集器
作者:junjie 发布时间:2023-09-05 11:42:53
标签:python,火车票,采集器
好吧,我承认我是对晚上看到一张合适的票转让但打过电话去说已经被搞走了这件事情感到蛋疼。直接上文件吧。
#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,你懂的。


猜你喜欢
- 前言本文根据安前松的视频分享整理而来,视频回放地址如下:www.bilibili.com/video/BV1Hr…一、
- 一、函数介绍pytorch中两个张量的乘法可以分为两种:两个张量对应元素相乘,在PyTorch中可以通过torch.mul函数(或*运算符)
- 如何在庞大的数据中高效的检索自己需要的东西?本篇内容介绍了Python做出一个大数据搜索引擎的原理和方法,以及中间进行数据分析的原理也给大家
- 数据平台 Kaggle 近日发布了 2017 机器学习及数据科学调查报告,这也是 Kaggle 首次进行全行业调查。调查共收到超过 1600
- 实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样
- 前言福宝们,下午好啊。改版后的第4.5章阅读量有点少呀,不知道是不是拖更了一天的缘故。呜呜呜,以后一定要做个不拖更的好熊,所以今天继续爆肝第
- 自己前端开发中常用到的一些技巧及问题解决方法,会常更新,希望对前端路上的朋友有帮助。1、文章标题列表中日期居右显示的方法(提供了两种方法,使
- 一、卷积神经网络的概述卷积神经网络(ConvolutionalNeural Network,CNN)最初是为解决图像识别等问题设计的,CNN
- 开发的时候我都是使用XDebug在本地调试,但是最近加入一些项目中去,环境太复杂了,要在本地搭建一个开发环境真的太麻烦了,那么我们怎么使用x
- virtualenv介绍virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。virtualenv把
- 本文实例为大家分享了JavaScript实现简单计算器的具体代码,供大家参考,具体内容如下代码:<!DOCTYPE html>&
- NumPy广播(Broadcast),广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的
- 使用input和raw_input都可以读取控制台的输入,但是input和raw_input在处理数字时是有区别的当输入为纯数字时:inpu
- AjaxUpload.js文件的代码,供大家参考,具体内容如下/** * AJAX Upload ( http://valums.com/
- 前言一道题目是实现一个反转字符串的函数,具体如下:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给
- 初衷NumPy、Pandas、Matplotlib、SciPy 等可以说是最最最常用的 Python 库了。我们在使用 Python 库的时
- 编码和解码及\x和\u问题“字符在内存里的表示是unicode,如果要存盘或者发到网络就经过utf-8,然后对端收到依次
- PHP number_format() 函数实例格式化数字:<?php echo number_format("100000
- 举个例子:q=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]我想获取其中值等于7的那个值的下标,以便于用于其
- Spring @Enable 模块概览框架实现@Enable注解模块激活模块Spring Framework@EnableWebMvcWeb