欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實(shí)現(xiàn)的一個(gè)火車(chē)票轉(zhuǎn)讓信息采集器

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

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

#coding: utf-8
'''
春運(yùn)查詢火車(chē)票轉(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):
  """
  開(kāi)始抓取
  """
  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):
  """
  獲得車(chē)次信息
  """
  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(?!時(shí)刻表)" % 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]有票來(lái)啦!?。?!" % 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():
  """
  切換時(shí)區(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)文章

  • python self,cls,decorator的理解

    python self,cls,decorator的理解

    在python里面,self, cls 不是關(guān)鍵字,完全可以使用自己寫(xiě)的任意變量代替實(shí)現(xiàn)一樣的效果
    2009-07-07
  • python私有屬性和方法實(shí)例分析

    python私有屬性和方法實(shí)例分析

    這篇文章主要介紹了python私有屬性和方法的用法,實(shí)例分析了python私有屬性和方法的原理及具體使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 如何更改Pycharm配置文件的存放路徑

    如何更改Pycharm配置文件的存放路徑

    Pycharm配置文件默認(rèn)是放在C盤(pán)的,修改存放位置,這樣系統(tǒng)重裝的時(shí)候就不會(huì)不見(jiàn)了,下面這篇文章主要給大家介紹了關(guān)于如何更改Pycharm配置文件的存放路徑的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Django框架多表查詢實(shí)例分析

    Django框架多表查詢實(shí)例分析

    這篇文章主要介紹了Django框架多表查詢,結(jié)合實(shí)例形式分析了Django框架實(shí)現(xiàn)多表查詢的外鍵、關(guān)聯(lián)、前向查詢、反向查詢等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • python中文本字符處理的簡(jiǎn)單方法記錄

    python中文本字符處理的簡(jiǎn)單方法記錄

    這篇文章主要給大家介紹了關(guān)于python中文本字符處理的簡(jiǎn)單方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python 多線程超詳細(xì)到位總結(jié)

    Python 多線程超詳細(xì)到位總結(jié)

    線程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流。與分隔的進(jìn)程相比,進(jìn)程中線程之間的隔離程度要小,它們共享內(nèi)存、文件句柄和其他進(jìn)程應(yīng)有的狀態(tài)。線程的劃分尺度小于進(jìn)程,使多線程程序的并發(fā)性高。進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而提升程序運(yùn)行效率
    2021-11-11
  • 100?個(gè)?Python?小例子(練習(xí)題四)

    100?個(gè)?Python?小例子(練習(xí)題四)

    這篇文章主要給大家分享100?個(gè)?Python?小例子,前文分享了一二三,本文的四十最后一篇了,這篇就把100道python小練習(xí)全分享完了,感興趣的小伙伴也可以去練習(xí)前幾期內(nèi)容,洗碗給這幾篇文章給你的學(xué)習(xí)帶來(lái)幫助
    2022-01-01
  • Python小波變換去噪的原理解析

    Python小波變換去噪的原理解析

    這篇文章主要介紹了Python小波變換去噪,對(duì)于去噪效果好壞的評(píng)價(jià),常用信號(hào)的信噪比(SNR)與估計(jì)信號(hào)同原始信號(hào)的均方根誤差(RMSE)來(lái)判斷,需要的朋友可以參考下
    2021-12-12
  • Python中處理無(wú)效數(shù)據(jù)的詳細(xì)教程

    Python中處理無(wú)效數(shù)據(jù)的詳細(xì)教程

    無(wú)效數(shù)據(jù)是指不符合數(shù)據(jù)收集目的或數(shù)據(jù)收集標(biāo)準(zhǔn)的數(shù)據(jù),這些數(shù)據(jù)可能來(lái)自于不準(zhǔn)確的測(cè)量、缺失值、錯(cuò)誤標(biāo)注、虛假的數(shù)據(jù)源或其他問(wèn)題,本文就將帶大家學(xué)習(xí)Python中如何處理無(wú)效數(shù)據(jù),感興趣的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)
    2023-06-06
  • 解決csv.writer寫(xiě)入文件有多余的空行問(wèn)題

    解決csv.writer寫(xiě)入文件有多余的空行問(wèn)題

    今天小編就為大家分享一篇解決csv.writer寫(xiě)入文件有多余的空行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論