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+matplotlib实现填充螺旋实例
Jan 15 Python
scrapy爬虫完整实例
Jan 25 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
Python 日志logging模块用法简单示例
Oct 18 Python
使用python实现画AR模型时序图
Nov 20 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
Python 捕获代码中所有异常的方法
Aug 03 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简单防盗链验证实现方法
2016/07/09 PHP
php实现简易计算器
2020/08/28 PHP
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
Python中实现对list做减法操作介绍
2015/01/09 Python
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
用pycharm开发django项目示例代码
2018/10/24 Python
详解Python:面向对象编程
2019/04/10 Python
django2笔记之路由path语法的实现
2019/07/17 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
python 两种方法删除空文件夹
2020/09/29 Python
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
《鱼游到了纸上》教学反思
2014/02/20 职场文书
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
场地使用证明模板
2014/10/25 职场文书
介绍信范文大全
2015/05/07 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
毕业典礼致辞
2015/07/29 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
基于tensorflow权重文件的解读
2021/05/26 Python
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫