通过Python程序来模拟一个统一平台预约参观北京,包含验证码识别、登陆、据医院、时间、有关主管部门号等查询。

此程序仅供学习使用,请勿用于其他用途。

1.验证码图片

def getCodePic():

	randNum = random.random()
url = "http://www.bjguahao.gov.cn/comm/code.php?id="+str(randNum)
resp = urllib2.urlopen(url)
tmp_pic="c:\\tmp.gif"
open(tmp_pic,"wb").write(resp.read())
return tmp_pic

将验证码图片保存为C:\tmp.gif

2.识别验证码

#识别 ”http://www.bjguahao.gov.cn/comm/logon.php“验证码

#验证码特征例如以下:

#1.验证码图片大小为38*15(宽*高)。

#2.验证码包为4个1-9的数字。

#3.数字大小为6*8(宽*高),数字区域据距图片(左上右下)的边距分别为(5,4,6,3)。每一个数字间隔1个像素;

#4.数字颜色为红色,有粉色干扰噪点。

#

#识别方法:

#1.因为验证码比較简单且固定,可先获取1-9每一个数字的样本;

#2.提取验证码中的每一个数字,与样本进行比对,获取详细的数字。

#1-9的数据样本
yzm_keys={
1:"001100011100101100001100001100001100001100111111",
2:"011110110011110011000011001110011000110000111111",
3:"011110110011000011011110000011000011110011011110",
4:"000011000111001111011011110011111111000011000011",
5:"111111110000111110110011000011000011110011011110",
6:"011110110011110000111110110011110011110011011110",
7:"111111000011000110000110001100001100011000011000",
8:"011110110011110011011110110011110011110011011110",
9:"011110110011110011110011011111000011110011011110",
}
#识别一个数字
def reg_one(im):
ss=""
for y in range(0,8):
for x in range(0,6):
v = im.getpixel((x,y))
if v==3:
ss+="1"
else:
ss+='0' for i in range(1,10):
if yzm_keys[i] == ss:
return i
print "reg failed."
#传入验证码图片,识别4位验证码
def reg_yzm(f):
im = Image.open(f) im1 = im.crop(( 5,4,11,12))
im2 = im.crop((12,4,18,12))
im3 = im.crop((19,4,25,12))
im4 = im.crop((26,4,32,12)) return "%d%d%d%d" %(reg_one(im1),reg_one(im2),reg_one(im3),reg_one(im4))

3.登陆系统

须要事先注冊。然后通过身份证。名字和验证码登陆。

这里须要考虑Cookies问题。在后面说明。

def login(code):
url = "http://www.bjguahao.gov.cn/comm/logon.php"
req = urllib2.Request(url,urllib.urlencode({"sfzhm":"0000000000000000","truename":"张三","yzm":code})) #身份证和名字须要按实际情况填写
resp = urllib2.urlopen(req) res = resp.read()
if len(res)==0:
print "login success."
else:
print "error:",res

4.查询指定日期、指定医院、指定科室的预约情况

下面代码查询指定日期,航空总医院的产科门诊和产科专家门诊的预约情况。返回值为html。

def query(riqi):

	hpid='166' #航空总医院
keid1='050142' #产科门诊
keid2='050143' #产科专家 url = "http://www.bjguahao.gov.cn/comm/ghao.php"
req1 = "%s? hpid=%s&keid=%s&date1=%s" %(url,hpid,keid1,riqi)
resp1 = urllib2.urlopen(req1) req2 = "%s? hpid=%s&keid=%s&date1=%s" %(url,hpid,keid2,riqi)
resp2 = urllib2.urlopen(req2) return resp1.read(),resp2.read()

5.输出查询结果

通过解析查询结果的HTML,输出信息。

def parse_print(html1,html2):
#print "%10s %4s %4s %16s %16s %16s %4s %4s %4s %4s %4s" %('日期','星期','时间','科室','医生','职称','费用','专长','可挂','剩余','状态')
seq1,seq2=parse_html.parse(html1)
if len(seq1) == 11 :
seq1.remove(seq1[7])
for i in seq1:
print i,
print ""
if len(seq2) == 11 :
seq2.remove(seq2[7])
for i in seq2:
print i,
print "" seq1,seq2=parse_html.parse(html2)
if len(seq1) == 11 :
seq1.remove(seq1[7])
for i in seq1:
print i,
print ""
if len(seq2) == 11 :
seq2.remove(seq2[7])
for i in seq2:
print i,
print ""

parse_html.py例如以下

#!/usr/bin/python
# -*- coding: utf-8 -*- def parse_struct(s):
stru=[]
while len(s)>3:
i1 = s.find("<td>")
i2 = s.find("</td>")
if i1<0 or i2<0:
break
t = s[i1+4:i2]
stru.append(t)
#print t
s = s[i2+5:] return stru def parse(ss):
tr_end_1 = ss.rfind("</tr>")
tr_beg_1 = ss.rfind("<tr>") tr_end_2 = ss.rfind("</tr>",0,tr_beg_1)
tr_beg_2 = ss.rfind("<tr>",0,tr_end_2) s1 = ss[tr_beg_2+5:tr_end_2]
s2 = ss[tr_beg_1+5:tr_end_1] seq1= parse_struct(s1)
seq2= parse_struct(s2)
#for i in seq1:
# print i return seq1,seq2 if __name__ == "__main__": parse(open("c:\\2014-04-23.html","rb").read())

6.预约挂号

这一部分还没写,原理基本差点儿相同,生成要预约人的url,进行请求。会向手机发送一个验证码。然后输入验证码。预约成功。

7.执行结果

8.Cookies设置

Cookies是啥?为啥须要Cookies?这里就不细说了,感兴趣的能够baidu之。这里就说怎么设置。

事实上也非常easy。Python的urllib2模块本身就支持设置Cookies的功能。

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [
#('Host','www.bjguahao.gov.cn'),
('User-Agent','Mozilla/5.0 (Windows NT 6.1; rv:27.0) Gecko/20100101 Firefox/27.0'),
#('Accept','image/png,image/*;q=0.8,*/*;q=0.5'),
#('Accept-Language','zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3'),
#('Accept-Encoding','gzip,deflate'),
('Referer','http://www.bjguahao.gov.cn/comm/index.html'),
#('Connection','keep-alive'),
#('Cookie','Hm_lvt_13e29334f151c8514bf6cf2533b9d9af=1395393461,1396936299,1397179537,1397461271; __c_review_45359=3; __c_last_45359=1397465208535; __c_visitor=1395393460566784; __c_sesslist_45359=drcwufogsr_cha%252Cdr9bf2510a_ch7%252Cch4; __c_today_45359=1; PHPSESSID=67003ba345132df2ef80474312c7b669; __c_pv_45359=21; __c_session_45359=1397461271515659; __c_session_at_45359=1397466158924; Hm_lpvt_13e29334f151c8514bf6cf2533b9d9af=1397465209')
]
urllib2.install_opener(opener)

注意Cookies要启动已组建方案。

Python编程预约参观北京行动纲要的更多相关文章

  1. 马斯克如何颠覆航天? 1/5385成本,c++和python编程!

    马斯克如何颠覆航天? 1/5385成本,c++和python编程! 5月31日,经历了重重困难,马斯克的SpaceX载人飞船成功发射,这是美国自2011年以来首次发射载人航天飞船,也是美国进入由商业主 ...

  2. Python黑帽编程2.1 Python编程哲学

    Python黑帽编程2.1  Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下P ...

  3. Linux运维人员如何学习python编程

    Linux运维人员如何学习python编程 从不会写代码,到自己独立能写代码解决问题 .这个问题很重要!盲目学习所谓的项目,最后 还是不会自己写代码解决问题.首先解决了独立能写代码解决问题,再通过项目 ...

  4. Python编程核心之makeTextFile.py和readTextFile.py

    引言: 最近大半年都在学习python编程,在双十一的时候购买了<Python编程核心>,看到makeTextFile.py和readTextFile.py两个例子有点错误,所以在这里给修 ...

  5. Python编程规范(PEP8)

    Python编程规范(PEP8) 代码布局 缩进 对于每一次缩进使用4个空格.使用括号.中括号.大括号进行垂直对齐,或者缩进对齐. 制表符还是空格? 永远不要将制表符与空格混合使用.Python最常用 ...

  6. Python 编程规范-----转载

    Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器,默认保存为 utf-8 格式. ...

  7. 学习Python编程的11个资源

    用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因 ...

  8. Emacs 配置 Python 编程环境

    python编程环境设置涉及到:自动完成.语法检查.虚拟环境. 为了不把系统搞乱,在python的虚拟环境中安装相关的插件. 一.安装python虚拟环境 virtualenvwrapper sudo ...

  9. Python编程规范及性能优化(转载)

    转载地址:http://codeweblog.com/python编程规范及性能优化/

随机推荐

  1. centos 安装 redis3.2.0 集群

    这里创建6个redis节点,其中三个为主节点,三个为从节点. redis和端口对应关系: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 从: 127.0.0 ...

  2. 24位和8位BMP图片保存纯C代码

    BMP图片大家都知道,可以通过查看BMP图片结构使用纯C就可以打开,编辑,处理,保存图片.非常方便使用. 具体BMP结构可以参考:wingdi.h头文件.今天主要在进行删减代码,需要把多余的代码删除, ...

  3. C语言中scanf/fscanf 的%[]和%n说明符的使用方法

    标准输入输出函数%[]和%n说明符的使用方法     scanf fscanf,均从第一个非空格的可显示字符开始读起!         标准输入输出函数scanf具有相对较多的转换说明符,它常常作为入 ...

  4. C#实现树的双亲表示法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVja3k1MTIyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  5. expdp时遇到ORA-31693&amp;ORA-02354&amp;ORA-01466

    expdp时遇到ORA-31693&ORA-02354&ORA-01466 对一个schema运行expdp导出,expdp命令: nohup expdp HQ_X1/HQ_X1 DU ...

  6. Exception in thread &quot;main&quot; java.lang.IllegalArgumentException

    1.错误叙述性说明 Exception in thread "main" java.lang.IllegalArgumentException: Cannot format giv ...

  7. Android最方便的数据库--LitePal

    郭最近看到神分析LitePal相框,我感觉很强烈,尝试了一下,真的好,我不知道,如果你不习惯学习,那么各不相同,我觉得很合适 看完之后,思想,对于我来说,,实体到set颂值,如果数据非常多,那么你可以 ...

  8. C#:根据银行卡卡号推断银行名称

    原文:C#:根据银行卡卡号推断银行名称 原文地址:android 根据银行卡卡号判断银行 原文是 java ,现在将它翻译成 C# ,并对代码重新编排整理,不足之处请多多包涵. 根据银行卡号判断所属银 ...

  9. GOJ1150(矩阵快速幂)

    sum Time Limit: 1000ms Problem Description: 给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和. Input: 测试数据有多组, ...

  10. SVN更改登录用户(转)

    一) 原地址:http://www.ixna.net/articles/2606 //证书缓存 $ svn list https://host.example.com/repos/project Er ...