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…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

找不到天隆虚拟机_玩转虚拟机,教你如何装系统

最近小白系统收到很多小伙伴的私信想要知道虚拟机如何安装系统&#xff0c;那么今天小白系统整理了下虚拟机安装系统的教程&#xff0c;下面一起看下吧。虚拟机安装系统适合什么人群呢&#xff1f;1、如果你新买的电脑不支持安装Win7系统&#xff0c;那么装个虚拟机吧&#xff…

从数据类型 nvarchar 转换为 numeric 时出错_JS入门篇(三):javascript的数据类型详解...

JavaScript的数据类型分为两大类&#xff0c;基本数据类型和复杂数据类型。基本数据类型&#xff1a;Undefined、Null、Boolean、Number、String。复杂数据类型&#xff1a;Object。(1)Undefined类型Undefined 类型只有一个值&#xff0c;即特殊的 undefined。在使用 var 声明变…

为啥我的页面模板的from提交不了数据_4-9【微信小程序全栈开发课程】意见反馈(四)--提交反馈信息

1、创建后端操作文件先在后端server/controllers文件夹中创建操作文件createopinion.js&#xff0c;用来将从前端页面提交的数据&#xff0c;插入到opinions表中&#xff0c;创建完之后&#xff0c;页面目录如下2、添加路由在路由管理文件server/routes/index.js文件中添加路由…

rac一节点时间比另一个节点快_数据库数据那么多为什么可以检索这么快?

你好&#xff0c;是我琉忆。经常跟数据打交道的你&#xff0c;有没有去考虑过数据上百万&#xff0c;为什么它可以检索那么快&#xff1f;一说到数据库的检索速度这么快&#xff0c;我想你一定想到了索引。没错&#xff0c;今天我们来简单聊聊索引&#xff0c;聊聊索引是什么&a…

唯有自己变得强大_真正的自立,唯是让自己变得更加强大

更大的成功&#xff0c;不是看我们用双腿走了多少路&#xff0c;而是要看我们总共行了多少路。一只萤火虫&#xff0c;靠自身的力量发出了光芒。夜晚&#xff0c;它仰头望天&#xff0c;对着月亮说&#xff1a;“我是靠自己而发光的&#xff0c;而你却是借助太阳的光芒。虽然你…

mysql必知必会_MySQL必知必会

MySQL必知必会联结的使用, 子查询, 正则表达式和基于全文本的搜索, 存储过程, 游标, 触发器, 表约束.了解SQL数据库基础电子邮件地址薄里查找名字时, 因特网搜索站点上进行搜索, 验证名字和密码, 都会用到数据库.数据库是一个以某种有组织的方式存储的数据集合.把数据库想象成一…

vm虚拟机安装_虚拟机 --- 安装VM(一)

虚拟机&#xff08;英语&#xff1a;virtual machine&#xff09;&#xff0c;在计算机科学中的体系结构里&#xff0c;是指一种特殊的软件&#xff0c;可以在计算机平台和终端用户之间创建一种环境&#xff0c;而终端用户则是基于这个软件所创建的环境来操作软件。虚拟机最初由…

cnetos7 mysql5.6 utf8设置_CentOS7下安装MySQL 5.6修改字符集为utf8并开放端口允许远程访问...

前言mysql最初的免费战略已经深入人心&#xff0c;感觉自己一直都在用mysql。今天在CentOS7下装mysql。发现原来centos下默认没有mysql&#xff0c;因为开始收费了&#xff0c;取而代之的是另一个mysql的分支mariadb&#xff0c;这个是mysql创始人重新主导的分支。But, whateve…

preparedstatement打印sql语句_Mybatis是这样防止sql注入的

链接&#xff1a;https://juejin.im/post/5e131203e51d4541082c7db3Mybatis这个框架在日常开发中用的很多&#xff0c;比如面试中经常有一个问题&#xff1a;$和#的区别&#xff0c;它们的区别是使用#可以防止SQL注入&#xff0c;今天就来看一下它是如何实现SQL注入的。什么是S…

mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率

原标题&#xff1a;使用MySQL 5.7虚拟列提高查询效率导读翻译团队&#xff1a;星耀队知数堂团队成员&#xff1a;星耀队-芬达&#xff0c;星耀队-顺子&#xff0c;星耀队-M哥原文出处&#xff1a;https://www.percona.com/blog/2018/01/29/using-generated-columns-in-mysql-5-…