Python编程预约参观北京行动纲要

Python编程预约参观北京行动纲要

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

通过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.执行结果

Python编程预约参观北京行动纲要

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要启动已组建方案。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116742.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 为何选择iText?java PDF开源库选择与iText发展历史

    为何选择iText?java PDF开源库选择与iText发展历史&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;转眼间,我写iText7系列已经有一年多了,还记得最开始的时候是因为兴趣才翻译iText,不过随着慢慢翻译文章才发现iText的强大之处,最近也是调研了整个javaPDF开源库的生态圈,我给大家详细讲一下javaPDF开源库的选择还有我选择iText的理由。1.源起PDF1.1PDF定义&amp;nbsp;&amp;nbsp;&amp;nbsp;

  • Windows文件服务器文件审计,文件监控软件,File_System_Auditor2.53安装教程[通俗易懂]

    Windows文件服务器文件审计,文件监控软件,File_System_Auditor2.53安装教程[通俗易懂]这里写目录标题一、事前准备二、安装过程2.1、安装.net2.02.2、安装File_System_Auditor2.2.1、下载[File_System_Auditor安装包](https://download.csdn.net/download/weixin_42523454/20592714),解压2.2.2、先安装FSASetup_Console_1.522.2.3、一直下一步,安装完成之后,导入注册表2.2.4、打开激活软件2.2.5、输入资料,获取授权书,2号处为成功2.2.6、卸载FSASe

  • Matlab mapminmax函数使用及原理[通俗易懂]

    Matlab mapminmax函数使用及原理[通俗易懂]几个要说明的函数接口:[Y,PS]=mapminmax(X)[Y,PS]=mapminmax(X,FP)Y=mapminmax(‘apply’,X,PS)X=mapminmax(‘reverse’,Y,PS)用实例来讲解,测试数据x1=[124],x2=[523];[y,ps]=mapminmax(x1)y=-1….

  • 联合索引在B+树上的存储结构及数据查找方式

    联合索引在B+树上的存储结构及数据查找方式能坚持别人不能坚持的,才能拥有别人未曾拥有的。关注编程大道公众号,让我们一同坚持心中所想,一起成长!!引言上一篇文章《MySQL索引那些事》主要讲了MySQL索引的底层原理,且对比了B+Tree作为索引底层数据结构相对于其他数据结构(二叉树、红黑树、B树)的优势,最后还通过图示的方式描述了索引的存储结构。但都是基于单值索引,由于文章篇幅原因也只是在文末略提了一下联合索引,并没有大篇幅的展…

  • C++中string append函数的使用与字符串拼接「建议收藏」

    C++中string append函数的使用与字符串拼接「建议收藏」常用的函数原型:basic_string&amp;amp;amp;append(constbasic_string&amp;amp;amp;str);basic_string&amp;amp;amp;append(constchar*str);basic_string&amp;amp;amp;append(constbasic_string&amp;amp;amp;str,size_typeindex,size

  • fpga编程语言VHDL_quartus模块

    fpga编程语言VHDL_quartus模块(72)FPGA模块调用(VHDL调用Verilog)1.1目录1)目录2)FPGA简介3)VerilogHDL简介4)FPGA模块调用(VHDL调用Verilog)5)结语1.2FPGA简介FPGA(FieldProgrammableGateArray)是在PAL、GAL等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA设计不是简单的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号