python用电度数设计_用Python实现一个爬取XX大学电费通知的小脚本

内容简要

1分析网站

2简单爬取

3进阶自定义爬取

4保存进数据库

学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强化PY学习,我决定制作一个简单的爬虫。

首先我通过学校的微信公众号找到了一个十分隐蔽的查低电量提醒网站。它的界面是这样的:

688703-20160828152744667-1065487250.png

手机适应的页面当然在电脑上会有一些崩=。=,但是不要介意,我们要的是功能。下面是查询到的界面

688703-20160828153342239-1225742357.png

虽然看起来low而且经常不更新,但是它至少能用。于是我决定用它来制作低电量提醒查询脚本。审查元素,我们可以发现

ContractedBlock.gif

ExpandedBlockStart.gif

  宿舍区域

  楼号

  宿舍号

  截止时间

  剩余电量

  




完整表单信息

简化重要的部分,可以看出,这个表单有用的信息有如下代码:

ContractedBlock.gif

ExpandedBlockStart.gif

简化版HTML

提取完以后感觉难度就降低了不少。但是只用填前3个空就能查询到。我觉得后几个空可能会设定一些防止爬取的障碍,我使用审查元素中自带的查询network功能看了一下。在一个post方法中我找到了如下数据:

ContractedBlock.gif

ExpandedBlockStart.gif

------WebKitFormBoundaryOJwEBCeqt5bb9jEZ

Content-Disposition: form-data; name="kindId"

9

------WebKitFormBoundaryOJwEBCeqt5bb9jEZ

Content-Disposition: form-data; name="search.text0"北区------WebKitFormBoundaryOJwEBCeqt5bb9jEZ

Content-Disposition: form-data; name="search.text1"

3

------WebKitFormBoundaryOJwEBCeqt5bb9jEZ

Content-Disposition: form-data; name="search.text2"

537

------WebKitFormBoundaryOJwEBCeqt5bb9jEZ

Content-Disposition: form-data; name="search.text3"

------WebKitFormBoundaryOJwEBCeqt5bb9jEZ

Content-Disposition: form-data; name="search.text4"

------WebKitFormBoundaryOJwEBCeqt5bb9jEZ

Content-Disposition: form-data; name="search.text5"

------WebKitFormBoundaryOJwEBCeqt5bb9jEZ--

Post 数据

这跟我之前见到的post格式不同,上网查了一下,这是一种叫做multipart/form-data格式的post,它能把post信息以二进制形式发送过去,所以还能用来传送文件。做个小脚本还能学到这样的新知识。阅历+1.

根据它的基本信息。我写了如下的代码来post并抓取得到的网页全内容

ContractedBlock.gif

ExpandedBlockStart.gif

#-*- coding: utf-8 -*-

importurllib2importurllib

url='http://hqsz.ouc.edu.cn/houqin/store/findone.action'boundary='---------------------------12174501422663' #分隔符

data =[]

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="kindId"')

data.append('')

data.append('9')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text0"')

data.append('')

data.append('北区')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text1"')

data.append('')

data.append('3')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text2"')

data.append('')

data.append('537')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text3"')

data.append('')

data.append('')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text4"')

data.append('')

data.append('')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text5"')

data.append('')

data.append('')

data.append('--'+boundary+'--')

data.append('')

httpbody='\r\n'.join(data)printtype(httpbody)

content_type='multipart/form-data; boundary=%s' %boundaryprintcontent_type

req=urllib2.Request(url,httpbody)

req.add_header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")

req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0")

req.add_header("Referer","http://hqsz.ouc.edu.cn/houqin/store/findmessage.action?kindId=9")

req.add_header("Content-Type", content_type )

req.add_header("Accept-Language","zh-CN,en-US;q=0.7,en;q=0.3")

req.add_header("Accept-Encoding","gzip, deflate")

req.add_header("Connection","keep_alive")

response=urllib2.urlopen(req)

html=response.read()print html

抓取网页

这段代码分为2个部分,前半部分是表单生成。后半部分是模拟浏览器头,虽然这个网站并不会检测,但是为了学习还是要写这一部分强化记忆。对于表单生成这部分,我得到了如下的公式:对于multipart/form-data这样的信息一般可以用如下格式:

688703-20160828194238509-1028536704.png

这其中的data.append('')是必加的,图省事省略掉就错了。

这样的代码只能针对一个人的,不能由用户输入,这样感觉很不好,于是我选择加上用户输入。先把以上函数封装成一个函数Search_e(eara,house,room);

之后在py中调用这个函数就行了,代码如下:

ContractedBlock.gif

ExpandedBlockStart.gif

#-*- coding: utf-8 -*-#encoding: utf-8

importurllib2,reimporturllibdefSearch_e(eara,house,room):#post的目标地址

url='http://hqsz.ouc.edu.cn/houqin/store/findone.action'

#设置post的数据

boundary='---------------------------12174501422663' #分隔符

data =[]

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="kindId"')

data.append('')

data.append('9')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text0"')

data.append('')

data.append(eara)#查询房间所在区域

#data.append('北区')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text1"')

data.append('')#查询房间所在的楼号

data.append(house)

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text2"')

data.append('')#查询房间的房间号

data.append(room)

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text3"')

data.append('')

data.append('')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text4"')

data.append('')

data.append('')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text5"')

data.append('')

data.append('')

data.append('--'+boundary+'--')

data.append('')

httpbody='\r\n'.join(data)#以上部分就是查询信息的表单

content_type='multipart/form-data; boundary=%s' %boundary#print data #检验表单数据

req =urllib2.Request(url,httpbody)

req.add_header("Content-Type", content_type )

req.add_header("Accept-Language","zh-CN,en-US;q=0.7,en;q=0.3")

req.add_header("Accept-Encoding","gzip, deflate")#req.add_header("Connection","keep_alive")

response =urllib2.urlopen(req)

html=response.read()

unicodePage=html.decode("utf-8")

pattern=ur"([\s\S]*?)<\/strong>"result=re.findall(pattern,unicodePage,re.S)try:if(result[11]):print u"剩余电量",result[11],u"请及时交电费"

except:print u"电量充足"eara=raw_input("请输入区域(北区,东区,南区):")

eara=eara.decode('gbk').encode('utf-8') #将输入的Gbk字符转化为utf-8字符

house=raw_input("请输入楼号(例如1号楼:1):")

room=raw_input("请输入房间号(例如110房间:110):")

Search_e(eara,house,room)

用户自定义友好

光查询还不能满足我,我还想知道最近的用电情况,我决定把他们保存在数据库中进行分析。

于是我更换了如下代码,

ContractedBlock.gif

ExpandedBlockStart.gif

#-*- coding: utf-8 -*-#encoding:utf-8

importurllib2,reimporturllibimportMySQLdb as dbdefSearch_e(eara,house,room):#post的目标地址

url='http://hqsz.ouc.edu.cn/houqin/store/findone.action'

#设置post的数据

boundary='---------------------------12174501422663' #分隔符

data =[]

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="kindId"')

data.append('')

data.append('9')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text0"')

data.append('')#data.append(eara)

#查询房间所在区域

data.append('北区')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text1"')

data.append('')#查询房间所在的楼号

data.append(house)

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text2"')

data.append('')#查询房间的房间号

data.append(room)

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text3"')

data.append('')

data.append('')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text4"')

data.append('')

data.append('')

data.append('--'+boundary)

data.append('Content-Disposition: form-data; name="search.text5"')

data.append('')

data.append('')

data.append('--'+boundary+'--')

data.append('')

httpbody='\r\n'.join(data)#以上部分就是查询信息的表单

content_type='multipart/form-data; boundary=%s' %boundary#print data #检验表单数据

req =urllib2.Request(url,httpbody)

req.add_header("Content-Type", content_type )

req.add_header("Accept-Language","zh-CN,en-US;q=0.7,en;q=0.3")

req.add_header("Accept-Encoding","gzip, deflate")#req.add_header("Connection","keep_alive")

response =urllib2.urlopen(req)

html=response.read()

unicodePage=html.decode("utf-8")

pattern=ur"([\s\S]*?)<\/strong>"result=re.findall(pattern,unicodePage,re.S)try:return result[11]except:return '20.0'connection= db.connect(host='localhost',user='root',passwd='root',db='oucect',port=3306,init_command='set names utf8')

cursor=connection.cursor()

cursor.execute("select * from rooms");

result=cursor.fetchall()

cursor.close()

connection.close()printresultfor item inresult:

aera=item[3]

house= item[1]

room= item[2]

num=Search_e(aera,house,room)

connection= db.connect(host='localhost',user='root',passwd='root',db='oucect',port=3306,init_command='set names utf8')

cursor=connection.cursor()

cursor.execute("update rooms set ect ="+num+"where id="+str(item[0]));

connection.commit();

cursor.close();

connection.close();

保存数据库版本

现在这样就可以保存进数据库了,但是这个网站几乎是7-5天更新一次,我现在还不会计划任务爬取网页进行分析,我要学习的还有很多,现在一个用C#写出来的自动发邮件的小程序已经完成。我相信我就能够一点一点变成大神的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

钉钉如何调整组织架构_阿里调整组织架构:盒马升级为独立事业群,钉钉被划进阿里云丨钛快讯...

钛媒体6月18日消息&#xff0c;阿里巴巴集团CEO张勇通过全员信宣布了阿里新一轮面向未来的组织升级。他表示这次升级的主要目的是&#xff1a;充实创新业务的领导力量和组织保障&#xff1b;明确大文娱一号位&#xff0c;聚焦大文娱各业务的紧密融合&#xff1b;实现战略投资业…

服务器监控系统大概多少钱,服务器监控系统 报价

服务器监控系统 报价 内容精选换一换设置“云服务器名称”。名称可自定义&#xff0c;但需符合命名规则&#xff1a;只能由中文字符、英文字母、数字及“_”、“-”、“.”组成。如果同时购买多台弹性云服务器&#xff0c;系统会自动按序增加后缀。一次创建多台弹性云服务器时&…

过去式加ed的发音_【思语小课堂】时态二三事:规则动词过去式的发音规则

在一个简单句中&#xff0c;通常有主语&#xff0c;谓语&#xff0c;及宾语或表语等成分&#xff0c;例如&#xff1a;They watch television.这句话中&#xff0c;主语是they&#xff0c;谓语动词watch&#xff0c;television是宾语。除了这些成分会决定句子的含义&#xff0c…

python数据挖掘分析案例python_Python 数据挖掘实例 决策树分析

友情提示&#xff1a;此篇文章大约需要阅读 7分钟57秒&#xff0c;不足之处请多指教&#xff0c;感谢你的阅读。安装Anaconda Python集成环境下载环境anaconda下载选择安装环境下载过程中使用默认&#xff0c;但有一个页面需要确认&#xff0c;如下图。anaconda选择页面第一个勾…

服务器开机显示f1 f2,开机提示按F1/F2才能进入系统的解决方法

电脑开机出现了一个怪现象&#xff0c;那就是每次开机的时候都会有“F1”或者是“F2”的提示&#xff0c;并且要按一下才能正常进入系统&#xff0c;该怎么解决呢&#xff1f;下面秋叶系统小编教大家解决办法&#xff01;下图为开机按F1键才能正常进入系统的画面&#xff01;下…

mysql日志监控 zabbix_zabbix监控mysql哪些性能

匿名用户1级2017-09-27 回答一、从网上下载相应脚本与XML定义文件。extensive_mysql_monitoring_including_replication1.   Template_MySQL_Server&#xff0e;xml2.   Template_MySQL_Replication_Master&#xff0e;xml3.   Template_MySQL_Replication_Slave&#xf…

apache httpclient 工具类_HttpClient 和Mycat 主从节点和读写分离

第175次(HttpClient)学习主题&#xff1a;HttpClient学习目标&#xff1a;1 掌握HttpClient自定义工具以及HttpClient具体的使用对应视频: http://www.itbaizhan.cn/course/id/85.html对应文档:无对应作业1. HttpClient自定义工具类的使用(1) 如何编写一个HttpClient工具类&…

已通过os信号请求关闭服务器,redis(一)内部机制的介绍和启动过程

redis(一)内部机制的介绍和启动过程redis的基本介绍redis服务端redis客户端redis的持久化redis中的文件事件和时间时间redis的启动过程redis的基本介绍redis是一种非关系型数据库&#xff0c;采用key&#xff0c;value的形式来存储数据。key是二进制数据&#xff0c;对于value的…

datalist可以放div吗?_混凝土中能放竹子吗?可以代替钢筋吗?为何打地坪混凝土放竹子?...

大家好&#xff0c;我是专注家居和装修知识分享的家居杂坛。喜欢的就点击一下关注吧&#xff01;对于在地面上所浇筑的混凝土&#xff0c;常规有两种做法。例如&#xff0c;在混凝土中铺设钢筋&#xff0c;打成钢筋混凝土的地面&#xff0c;又或者还有一些朋友在钢混凝土中放入…

snmp协议_软件评测师写作专栏之OSI七层模型及其常见的协议11

各位学员大家好&#xff0c;大家在学习计算机网络的时候&#xff0c;OSI七层模型及其常见的协议是必考的内容。为了让大家快速掌握这方面的知识点&#xff0c;接下来就带领大家一起来学习一下&#xff01;例题&#xff1a;下面的协议中属于应用层协议的是( 1 )&#xff0c;该协…

nginx文件服务器密码登录,风的方向

说明很多时候我们服务器上的页面或者服务可能没有安全配置&#xff0c;使得服务开放的暴露在互联网中&#xff0c;很不安全。nginx可以给我们提供密码配置&#xff0c;来保护我们的服务器上的服务的安全性。配置nginx配置文件在需要配置密码的服务的相关nginx配置文件中的locat…

selenium python下载_使用Selenium、Chrome和Python下载PDF

我试着按照前面关于这个主题的文章来写&#xff0c;比如这些(post 1&#xff0c;post 2)&#xff0c;但是我还是被卡住了。我的脚本必须使用一组凭据登录到站点&#xff0c;然后通过一些下拉菜单导航以选择报表。选择报表后&#xff0c;将弹出一个新窗口&#xff0c;在该窗口中…

劲乐团u显示服务器维护,劲乐团9YOU原版服务端架设教程

我来做一个o2jam的服务端架设教程&#xff0c;希望新手能有点帮助相信你已经全的数据库文件了,其实只要里面的三个就可以了test2...o2jamtrade---onlinereport那么GO了.首先确定你已经安装好了MSSQL.如果没有.........那就先安装下......企业版安装在SQL服务器的安装盘中找到MS…

linux部署tomcat项目404_一个tomcat下部署多个项目或一个服务器部署多个tomcat

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]♪ 点击上方绿标 收听一个tomcat下部署多个项目或一个服务器部署多个tomcat最近需要把两个项目同时部署到服务器上&#xff0c;于是研究了一下&#xff0c;页借鉴了很多别人的方法&#xff0c;把过程记录下来&#xff0c;以…

科学计数法_第一章 科学计数法与近似数

生活中&#xff0c;我们常常遇到一些较大的数&#xff0c;如10000000、3450000000等.利用科学计数法表示某些较大的数可以免去一些不必要的麻烦&#xff0c;尤其是遇到一些乘法运算时&#xff0c;如20000000245000000.科学记数法表示数时&#xff0c;不改变数的符号&#xff0c…

python调用浏览器打开网页_python调用浏览器,实现刷网页浏览小程序!

Python 和放大镜的二进制代码私信小编007即可自动获取大量Python视频教程以及各类PDF&#xff01;python 打开浏览器&#xff0c;可以做简单的刷网页的小程序 and 其他有想象力的程序。不过仅供学习&#xff0c;勿用非法用途。python的webbrowser模块支持对浏览器进行一些操作主…

# 傅立叶变换 画曲线_让你永远忘不了的傅立叶变换解析

使用联想链条和几何直观&#xff0c;辅以从实际需求衍生概念的思考模式&#xff0c;详解什么是傅立叶变换&#xff0c;为什么要做傅立叶变换等&#xff0c;帮助记忆和理解&#xff0c;目的当然是标题所说&#xff1a;让你永远忘不了傅立叶变换这个公式。另&#xff0c;这篇博客…

bat批处理执行python_通过批处理来运行python程序

》准备》》在所用的python源程序最前面指定该源程序要用那种可执行程序去运行它》》例如&#xff1a;#!/bin/sh shell脚本#!/usr/bin/perl perl脚本#!/usr/bin/python python脚本#!/usr/bin/python3 python3脚本#!/usr/bin/python2 python2脚本》》我的程序使用的解释器》》》#…

messagehub讲解_艾舜杰SAP Data Hub 数据服务总线技术深度讲解

原标题&#xff1a;艾舜杰SAP Data Hub 数据服务总线技术深度讲解艾舜杰SAP Data Hub 是一个多方面的数据编排解决方案, 旨在解决在不断增长的分布式数据环境中的挑战。它的关键功能包括&#xff1a;数据管道、治理和架构管理。解决方案可弹性扩展, 可编排并自动化处理不同数据…

select报错 spark_spark-sql master on yarn 模式运行 select count(*) 报错日志

启动hive --service metastore启动 dfs yarn[rootbigdatastorm bin]# ./spark-sql --master yarn --deploy-mode client --driver-memory 512m --executor-memory 512m --total-executor-cores 1spark-sql>select count(*) ;LogSLF4J: Class path contains multiple SLF4J …