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


Posted in Python onJuly 09, 2014

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

#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,你懂的。

Python 相关文章推荐
python爬取网站数据保存使用的方法
Nov 20 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
python绘制直线的方法
Jun 30 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
Django基础知识 URL路由系统详解
Jul 18 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
深入浅析python的第三方库pandas
Feb 13 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 #Python
Python中__init__和__new__的区别详解
Jul 09 #Python
Python中使用logging模块代替print(logging简明指南)
Jul 09 #Python
Python中的魔法方法深入理解
Jul 09 #Python
gearman的安装启动及python API使用实例
Jul 08 #Python
python实现跨文件全局变量的方法
Jul 07 #Python
Python中的并发编程实例
Jul 07 #Python
You might like
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
Yii实现简单分页的方法
2016/04/29 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
javascript jQuery插件练习
2008/12/24 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
Vue文件配置全局变量的实例
2018/09/06 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
高中生自我鉴定范文
2013/10/30 职场文书
单位成立周年感言
2014/01/26 职场文书
端午节活动策划方案
2014/03/09 职场文书
保险专业求职信
2014/07/07 职场文书
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
python turtle绘图命令及案例
2021/11/23 Python
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏