python实现的一个火车票转让信息采集器,python采集器
python实现的一个火车票转让信息采集器,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,你懂的。
就是抓取网页上的链接 用到了正则匹配
首先.Python不是脚本编程的软件.它应该是一门编程语言脚本?比脚本更强大、结构更健壮说Python是个平台.因为Python的原生程序需要在Python解释器的环境下运行的.所以.Python平台你可以理解成是Python程序运行的一个环境.最后.至于你说能做什么......这个问题太广义了Python 小到HELLO WORLD?(够小了吧)大到航天航空或者海洋资源探测的应用或者用其编写科学计算模型..还有.可以写GUI如.GTK\QT\WXPYTHON等等的GUI接口你可以快速高效的写出直观的GUI程序还有网络应用.如WEB的Django\zope\等Socket\MAIL等网络应用还有PyGame可以做游戏开发...还有其他的3D模块可以实现3D程序....还有一些平时的应用.如文件、目录、数据库应用等操作还有..............还有PYTHON语言的扩展或嵌入实现..如在JAVA中的扩展\C的扩展等等.这样就可以共享更多的库.....你说你看了几天PYTHON却不知道能做什么?(=.=...)应该说.你想到了PYTHON都能做到了...比如.先做一个简单的天气预报采集器..那就去看PYTHON的正则和HTML处理的部分就可以做出来了还有.如果你有其他编程语言的经历.不妨用Python试试你以前用其他语言写过的程序..这样.你就可以知道Python的简洁性、健壮性等等.呵呵.最后.祝你学习或者使用Python愉快接下来你会慢慢体验Python过程中的乐趣咯..追问:
相关内容
- python实现的登录和操作开心网脚本分享,python实现脚本
- Django中实现一个高性能计数器(Counter)实例,djangocounte
- 使用Python获取Linux系统的各种信息,python获取linux系统
- Python语言的12个基础知识点小结,python小结
- Python采集腾讯新闻实例,python采集腾讯
- Python读取图片EXIF信息类库介绍和使用实例,
- Python操作SQLite简明教程,pythonsqlite
- 让python同时兼容python2和python3的8个技巧分享,python2py
- Python实现的二维码生成小软件,python实现
- python使用正则搜索字符串或文件中的浮点数代码实例,
评论关闭