最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)的一個火車票轉(zhuǎn)讓信息采集器

 更新時間:2014年07月09日 10:01:26   投稿:junjie  
這篇文章主要介紹了python實現(xiàn)的一個火車票轉(zhuǎn)讓信息采集器,采集信息來源是58同程或者趕集網(wǎng),需要的朋友可以參考下

好吧,我承認我是對晚上看到一張合適的票轉(zhuǎn)讓但打過電話去說已經(jīng)被搞走了這件事情感到蛋疼。直接上文件吧。

#coding: utf-8
'''
春運查詢火車票轉(zhuǎn)讓信息
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):
  """
  發(fā)送郵件
  """
  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():
  """
  切換時區(qū)
  """
  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,你懂的。

相關(guān)文章

  • python3對拉勾數(shù)據(jù)進行可視化分析的方法詳解

    python3對拉勾數(shù)據(jù)進行可視化分析的方法詳解

    這篇文章主要給大家介紹了關(guān)于python3對拉勾數(shù)據(jù)進行可視化分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python3具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • 通過?for?循環(huán)比較?Python?與?Ruby?的編程區(qū)別

    通過?for?循環(huán)比較?Python?與?Ruby?的編程區(qū)別

    這篇文章主要介紹了通過?for?循環(huán)比較?Python?與?Ruby?的編程區(qū)別,Ruby?與?Python?之間的差異在很大程度上可通過for循環(huán)看出本質(zhì),下文詳細介紹需要的小伙伴可以參考一下
    2022-05-05
  • Python實現(xiàn)自動計算特定格式的時間差

    Python實現(xiàn)自動計算特定格式的時間差

    這篇文章主要介紹了利用Python實現(xiàn)在輸入一個特定格式的時間后,自動獲取前進或者后退多少小時之后的時間。感興趣的朋友可以了解一下
    2021-12-12
  • 在Ubuntu上部署Flask應(yīng)用的流程步驟

    在Ubuntu上部署Flask應(yīng)用的流程步驟

    隨著云計算和容器化技術(shù)的普及,Linux 服務(wù)器已成為部署 Web 應(yīng)用程序的主流平臺之一,Python 作為一種簡單易用的編程語言,適用于開發(fā)各種應(yīng)用程序,本文將詳細介紹如何在 Ubuntu 服務(wù)器上部署 Python 應(yīng)用,需要的朋友可以參考下
    2025-01-01
  • 在Python中使用M2Crypto模塊實現(xiàn)AES加密的教程

    在Python中使用M2Crypto模塊實現(xiàn)AES加密的教程

    這篇文章主要介紹了在Python中使用M2Crypto模塊實現(xiàn)AES加密的教程,例子中的方法使用aes_128_ecb算法,需要的朋友可以參考下
    2015-04-04
  • 安裝Qbot并且用vscode進行配置的詳細步驟

    安裝Qbot并且用vscode進行配置的詳細步驟

    文章介紹了如何在Python 3.8環(huán)境下使用conda創(chuàng)建虛擬環(huán)境并安裝Qbot項目,本文分步驟結(jié)合圖文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-01-01
  • Python+AI實現(xiàn)給老照片上色

    Python+AI實現(xiàn)給老照片上色

    今天給大家分享一個有趣的AI項目——利用NoGAN的圖像增強技術(shù)給老照片著色,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-06-06
  • yolov5中train.py代碼注釋詳解與使用教程

    yolov5中train.py代碼注釋詳解與使用教程

    train.py里面加了很多額外的功能,使得整體看起來比較復雜,其實核心部分主要就是 讀取數(shù)據(jù)集,加載模型,訓練中損失的計算,下面這篇文章主要給大家介紹了關(guān)于yolov5中train.py代碼注釋詳解與使用的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • python消費kafka數(shù)據(jù)批量插入到es的方法

    python消費kafka數(shù)據(jù)批量插入到es的方法

    今天小編就為大家分享一篇python消費kafka數(shù)據(jù)批量插入到es的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python中的split、rsplit、splitlines用法說明

    python中的split、rsplit、splitlines用法說明

    這篇文章主要介紹了python中的split、rsplit、splitlines用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

绩溪县| 孟村| 华安县| 内黄县| 托里县| 临邑县| 泸水县| 上高县| 峨边| 彰武县| 泽普县| 黎城县| 韶关市| 临澧县| 宜宾市| 华宁县| 富宁县| 西乡县| 宁强县| 永德县| 泸水县| 阆中市| 屯昌县| 来凤县| 桂平市| 安乡县| 衢州市| 宜兴市| 明星| 德令哈市| 西青区| 永平县| 平安县| 娄底市| 讷河市| 芒康县| 垦利县| 嘉义市| 工布江达县| 安宁市| 文登市|