内容简要

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]*?)"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]*?)"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大学电费通知的小脚本相关推荐

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

    内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...

  2. python 提取网页正文_用Python写个爬虫小程序,给女朋友每日定时推送睡前小故事...

    ↑ 关注 + 星标 ,每天学Python新技能后台回复[大礼包]送你Python自学大礼 导读:这篇文章利用简单的Python爬虫.邮件发送以及定时任务实现了每天定时发送睡前小故事的功能,是一篇步骤详 ...

  3. python自动网页抢_用Python写个了红包提醒,再不怕错过一个亿了

    又到了辞旧迎新的时候,群里的红包也多起来了.然而大佬们总是喜欢趁我不在的时候发红包,经常打开手机,发现红包已被抢完,感觉错过了一个亿. 安卓上有不少红包助手工具,但 iOS 似乎没有.而且就算有,这种 ...

  4. python写网页插件_用python 实现activex网页控件

    首先,这个东东貌似只有windows上才能实现,所以,需要部署windows下的相关环境 1.需要安装python 2.安装python的win32com的lib,下载地址: 3.安装本地的web容器 ...

  5. python下载网页歌词_使用Python下载歌词并嵌入歌曲文件中的实现代码

    使用python扫描本地音乐并下载歌词这次这个真的是干货哦,昨晚弄了半晚上,,,,从8点吃完饭就开始写,一直到了快12点才弄好,,,新手,伤不起呀.... 先简单的说下吧,百度提供了一个音乐搜索的ap ...

  6. python制作网页系统_使用python静态网页生成工具pelican快速在github上部署网站博客...

    简介 Pelican用Python编写的静态站点生成器.亮点: 使用reStructuredText或Markdown格式直接用编辑器编写内容 简单的CLI工具来(重新)生成站点 易于与分布式版本控制 ...

  7. python 下载网页文件_『如何用python把网页上的文本内容保存下来』python爬取网页内容教程...

    python爬虫:如何爬网页数据并将其放在文本 用requests库 r=r.requests.get(url) r.concent 保存到文件里就行了 如何用python把网页上的文本内容保存下来 ...

  8. python怎么做网页制作_[源代码]Python爬取网页制作电子书代码发布

    最近,在GitChat发布一场Chat(Chat地址请猛戳这里),人数当天就达标了,今天把文章完成提交,同时将文章中的代码发布到码云,我就等待大家前来捧场了,Chat地址请猛戳这里. 有人爬取数据分析 ...

  9. python爬网页文字_怎么用python爬取网页文字?

    用Python进行爬取网页文字的代码:#!/usr/bin/python # -*- coding: UTF-8 -*- import requests import re # 下载一个网页 url  ...

最新文章

  1. _​_​i​n​t​6​4​ ​与​l​o​n​g​ ​l​o​n​g​ ​i​n​t
  2. 微信小程序页面搜索框查询(无后台接口情况下)
  3. 2018年全国及31省市数据中心相关政策汇总及解读「全」
  4. 视频分享:挨踢项目求生法则(1)——团队建设篇
  5. 飞秋官方下载 访问我博客也有近一半的用户
  6. 统计字符数(信息学奥赛一本通-T1187)
  7. 海龟交易法则07_如何衡量风险
  8. 购物中心节假日如何统计客流量分析客流量数据?
  9. 深入浅出:Java多线程编程实战(一)
  10. 澳洲java待遇_2018年澳洲IT薪资一览,最新IT薪水Salary,给学IT的同学打一针鸡血...
  11. 聚类数据生成函数--make_blobs()
  12. 基于图搜索的规划算法之Voronoi图法
  13. vmware virtual machine must be running in order to be migrated
  14. 红光光浴一次能排多少湿气?-红光光浴/种光光学
  15. 使用Wamp在win7上搭WEB服务器
  16. 支付宝面试:说说序列和反序列?
  17. 《The Art of Assembly Language》中文名:汇编语言编程艺术 中英文正式版本下载
  18. 2022年全球市场单线激光雷达总体规模、主要生产商、主要地区、产品和应用细分研究报告
  19. 风控算法赛lgb实战-拍拍贷魔镜杯
  20. (16)打鸡儿教你Vue.js

热门文章

  1. 钢铁侠材质制作——2、线条轮廓部分的制作
  2. 《流浪地球》海报丨见证小破球24亿票房逆袭之路
  3. DesignWare USB 2.0 OTG Controller (DWC_otg) Device Driver File List
  4. 为什么1GB内存的苹果能完爆3GB内存的安卓机
  5. 明日直播| NLPCC workshop百度架构师带你快速上手飞桨NLP
  6. 机器学习和人工智能的关系
  7. MySQL数据库基本命令
  8. 利用freemarker模板引擎进行word导出
  9. 【工业大数据】工业大数据应用场景分析;工业大数据,从何做起
  10. 艺赛旗(RPA)UEBA、RPA 客户端设置部门