python用电度数设计_用Python实现一个爬取XX大学电费通知的小脚本
内容简要
1分析网站
2简单爬取
3进阶自定义爬取
4保存进数据库
学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强化PY学习,我决定制作一个简单的爬虫。
首先我通过学校的微信公众号找到了一个十分隐蔽的查低电量提醒网站。它的界面是这样的:
手机适应的页面当然在电脑上会有一些崩=。=,但是不要介意,我们要的是功能。下面是查询到的界面
虽然看起来low而且经常不更新,但是它至少能用。于是我决定用它来制作低电量提醒查询脚本。审查元素,我们可以发现
宿舍区域
楼号
宿舍号
截止时间
剩余电量
完整表单信息
简化重要的部分,可以看出,这个表单有用的信息有如下代码:
简化版HTML
提取完以后感觉难度就降低了不少。但是只用填前3个空就能查询到。我觉得后几个空可能会设定一些防止爬取的障碍,我使用审查元素中自带的查询network功能看了一下。在一个post方法中我找到了如下数据:
------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并抓取得到的网页全内容
#-*- 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这样的信息一般可以用如下格式:
这其中的data.append('')是必加的,图省事省略掉就错了。
这样的代码只能针对一个人的,不能由用户输入,这样感觉很不好,于是我选择加上用户输入。先把以上函数封装成一个函数Search_e(eara,house,room);
之后在py中调用这个函数就行了,代码如下:
#-*- 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)
用户自定义友好
光查询还不能满足我,我还想知道最近的用电情况,我决定把他们保存在数据库中进行分析。
于是我更换了如下代码,
#-*- 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#写出来的自动发邮件的小程序已经完成。我相信我就能够一点一点变成大神的。
python用电度数设计_用Python实现一个爬取XX大学电费通知的小脚本相关推荐
- python 爬网页通知_用Python实现一个爬取XX大学电费通知的小脚本
内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...
- python用电度数设计_在Python中动态模拟时绘制电压大小
我使用psspy(PSS / E,工程电力系统模拟器)来模拟电力系统. 我在公共汽车上应用了一个三相故障并且排队.现在我想绘制动态模拟过程中的电压大小,我的python代码如下: import sys ...
- python用电度数设计_无所不能的Python之配电设计自动化系统
诚如题目所言,本人结合Python程序设计与配电设计的互补性打算开发一个配电设计自动化系统,用来提高配电设计的工作效率.本人目前处在配电设计行业,已深耕多年,期间一直有学习Python,后来发现Pyt ...
- python程序设计课程设计_《Python程序设计》教学大纲.doc
PAGE 理论课程教学大纲 <Python程序设计>教学大纲 课程编号: 总 学 时:64(其中,讲课:32:实验:32) 学 分:3 实践教学:0周 修读专业:地理信息系统.应用化学 大 ...
- python 科学计算设计_《Python科学计算-(第2版)》怎么样_目录_pdf在线阅读 - 课课家教育...
第1章 Python科学计算环境的安装与简介 1 1.1 Python简介 1 1.1.1 Python 2还是Python 3 1 1.1.2 开发环境 2 1.1.3 集成开发环境(IDE) 5 ...
- python从零开始学爬虫_从零开始学爬虫(爬取豆瓣),一看就会
一. 准备工作 语言:python 编辑器:pycharm 需要导的包:bs4.re.urllib.xlwt(可以通过左上角file->settings->project->inte ...
- python 安居客 爬虫_爬虫学习6:爬取安居客的VR房源信息
公司的VR产品在推广前夕,需要做一个较详细的市场分析报告,我们可以从下面几个步骤来深入探讨: 1.需要展望整个VR的市场规模有多大,从而论证我们需要面对的市场分量, 2.在这个大市场下面,我们面对的细 ...
- python用电度数设计_Python时间序列预测实战(电力负荷预测)
这是我之前工作做的一个项目 import os import pandas as pd import numpy path = "E:/工作/负荷预测/历史负荷数据-每天" #文件 ...
- python 科学计算设计_用Python做科学计算 高清晰PDF
用Python做科学计算一书介绍如何用Python开发科学计算的应用程序,除了介绍数值计算之外,我们还将着重介绍如何制作交互式的2D.3D图像:如何设计精巧的程序界面:如何和C语言所编写的高速计算程序 ...
最新文章
- linux平台的链接与加载
- 正则表达式的学习二:正则表达式的匹配规则总结
- CubieBoard 简单入门
- HTML 显示和隐藏浏览器滚动条
- Python有了concurrent的话mutiprocessing和threading还有存在的意义吗?
- C++ — 智能指针的简单实现以及循环引用问题
- Java代码实现Fibonacci数列
- C# 6.0 (C# vNext) 的新功能:Exception-Handling Improvements
- UI设计灵感|如何简易花繁多的数据?功能仪表盘界面设计来看
- android arcgis多变形边框颜色,Arcgis for Android 判断指定点是否在多边形内部
- Tomcat Linux下自启动
- vs2013编译ffmpeg之三十一 vidstab
- U盘所有文件(夹)变成.exe文件的解决方法
- 最强蜗牛服务器维护祷告bug,最强蜗牛地缝bug是什么 最强蜗牛地缝事件漏洞说明...
- android+清除循环动画,android自定义View之(4)-一键清除动画
- 11 02 11 无用功
- 笔试 - 邪恶数字4与7
- 快到家了【经济学人】
- 掌握JS中的“this” (一)
- 读书心得 | 软技能-代码之外的生存指南
热门文章
- [转] 大三下,我们该做什么?
- (转载+原创)jQuery实现的全选、全不选、反选和半选功能
- 我们应不应该继续学习python
- easyexcel复杂模板导出(合并行列,列统计汇总)
- 大数据技术具备哪些特点
- 360浏览器强制使用急速模式
- Overleaf使用Latex输入中文的两种方法
- 旧机还在换盆?! Linux deploy让她再发光!
- Recorder教程☀️ Unity官方录屏插件使用介绍
- python中 math.isfinite返回值为false_带有Python示例的math.isfinite()方法