网站开发电子书网站ip地址 转向域名
news/
2025/9/30 12:32:14/
文章来源:
网站开发电子书,网站ip地址 转向域名,百度快照 如何抓取网站,wordpress调用排序从大到小内容简要
1分析网站
2简单爬取
3进阶自定义爬取
4保存进数据库
学校基础设施太差#xff0c;宿舍电量过低提醒虽然贴在楼下#xff0c;但是作为低头一族#xff0c;经常忘记看提醒导致宿舍酣战时突然黑屏#xff0c;为了避免这种尴尬的场景以及强化PY学习#xff0c;我决定…内容简要
1分析网站
2简单爬取
3进阶自定义爬取
4保存进数据库
学校基础设施太差宿舍电量过低提醒虽然贴在楼下但是作为低头一族经常忘记看提醒导致宿舍酣战时突然黑屏为了避免这种尴尬的场景以及强化PY学习我决定制作一个简单的爬虫。
首先我通过学校的微信公众号找到了一个十分隐蔽的查低电量提醒网站。它的界面是这样的手机适应的页面当然在电脑上会有一些崩。但是不要介意我们要的是功能。下面是查询到的界面虽然看起来low而且经常不更新但是它至少能用。于是我决定用它来制作低电量提醒查询脚本。审查元素我们可以发现宿舍区域 楼号 宿舍号 截止时间 剩余电量 完整表单信息
简化重要的部分可以看出这个表单有用的信息有如下代码简化版HTML
提取完以后感觉难度就降低了不少。但是只用填前3个空就能查询到。我觉得后几个空可能会设定一些防止爬取的障碍我使用审查元素中自带的查询network功能看了一下。在一个post方法中我找到了如下数据------WebKitFormBoundaryOJwEBCeqt5bb9jEZ
Content-Disposition: form-data; namekindId
9
------WebKitFormBoundaryOJwEBCeqt5bb9jEZ
Content-Disposition: form-data; namesearch.text0北区------WebKitFormBoundaryOJwEBCeqt5bb9jEZ
Content-Disposition: form-data; namesearch.text1
3
------WebKitFormBoundaryOJwEBCeqt5bb9jEZ
Content-Disposition: form-data; namesearch.text2
537
------WebKitFormBoundaryOJwEBCeqt5bb9jEZ
Content-Disposition: form-data; namesearch.text3
------WebKitFormBoundaryOJwEBCeqt5bb9jEZ
Content-Disposition: form-data; namesearch.text4
------WebKitFormBoundaryOJwEBCeqt5bb9jEZ
Content-Disposition: form-data; namesearch.text5
------WebKitFormBoundaryOJwEBCeqt5bb9jEZ--
Post 数据
这跟我之前见到的post格式不同上网查了一下这是一种叫做multipart/form-data格式的post它能把post信息以二进制形式发送过去所以还能用来传送文件。做个小脚本还能学到这样的新知识。阅历1.
根据它的基本信息。我写了如下的代码来post并抓取得到的网页全内容#-*- coding: utf-8 -*-
importurllib2importurllib
urlhttp://hqsz.ouc.edu.cn/houqin/store/findone.actionboundary---------------------------12174501422663 #分隔符
data []
data.append(--boundary)
data.append(Content-Disposition: form-data; namekindId)
data.append()
data.append(9)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text0)
data.append()
data.append(北区)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text1)
data.append()
data.append(3)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text2)
data.append()
data.append(537)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text3)
data.append()
data.append()
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text4)
data.append()
data.append()
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text5)
data.append()
data.append()
data.append(--boundary--)
data.append()
httpbody\r\n.join(data)printtype(httpbody)
content_typemultipart/form-data; boundary%s %boundaryprintcontent_type
requrllib2.Request(url,httpbody)
req.add_header(Accept,text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.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?kindId9)
req.add_header(Content-Type, content_type )
req.add_header(Accept-Language,zh-CN,en-US;q0.7,en;q0.3)
req.add_header(Accept-Encoding,gzip, deflate)
req.add_header(Connection,keep_alive)
responseurllib2.urlopen(req)
htmlresponse.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的目标地址
urlhttp://hqsz.ouc.edu.cn/houqin/store/findone.action
#设置post的数据
boundary---------------------------12174501422663 #分隔符
data []
data.append(--boundary)
data.append(Content-Disposition: form-data; namekindId)
data.append()
data.append(9)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text0)
data.append()
data.append(eara)#查询房间所在区域
#data.append(北区)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text1)
data.append()#查询房间所在的楼号
data.append(house)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text2)
data.append()#查询房间的房间号
data.append(room)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text3)
data.append()
data.append()
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text4)
data.append()
data.append()
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text5)
data.append()
data.append()
data.append(--boundary--)
data.append()
httpbody\r\n.join(data)#以上部分就是查询信息的表单
content_typemultipart/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;q0.7,en;q0.3)
req.add_header(Accept-Encoding,gzip, deflate)#req.add_header(Connection,keep_alive)
response urllib2.urlopen(req)
htmlresponse.read()
unicodePagehtml.decode(utf-8)
patternur([\s\S]*?)\/strongresultre.findall(pattern,unicodePage,re.S)try:if(result[11]):print u剩余电量,result[11],u请及时交电费
except:print u电量充足eararaw_input(请输入区域(北区东区南区):)
earaeara.decode(gbk).encode(utf-8) #将输入的Gbk字符转化为utf-8字符
houseraw_input(请输入楼号(例如1号楼1):)
roomraw_input(请输入房间号(例如110房间:110):)
Search_e(eara,house,room)
用户自定义友好
光查询还不能满足我我还想知道最近的用电情况我决定把他们保存在数据库中进行分析。
于是我更换了如下代码#-*- coding: utf-8 -*-#encoding:utf-8
importurllib2,reimporturllibimportMySQLdb as dbdefSearch_e(eara,house,room):#post的目标地址
urlhttp://hqsz.ouc.edu.cn/houqin/store/findone.action
#设置post的数据
boundary---------------------------12174501422663 #分隔符
data []
data.append(--boundary)
data.append(Content-Disposition: form-data; namekindId)
data.append()
data.append(9)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text0)
data.append()#data.append(eara)
#查询房间所在区域
data.append(北区)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text1)
data.append()#查询房间所在的楼号
data.append(house)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text2)
data.append()#查询房间的房间号
data.append(room)
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text3)
data.append()
data.append()
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text4)
data.append()
data.append()
data.append(--boundary)
data.append(Content-Disposition: form-data; namesearch.text5)
data.append()
data.append()
data.append(--boundary--)
data.append()
httpbody\r\n.join(data)#以上部分就是查询信息的表单
content_typemultipart/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;q0.7,en;q0.3)
req.add_header(Accept-Encoding,gzip, deflate)#req.add_header(Connection,keep_alive)
response urllib2.urlopen(req)
htmlresponse.read()
unicodePagehtml.decode(utf-8)
patternur([\s\S]*?)\/strongresultre.findall(pattern,unicodePage,re.S)try:return result[11]except:return 20.0connection db.connect(hostlocalhost,userroot,passwdroot,dboucect,port3306,init_commandset names utf8)
cursorconnection.cursor()
cursor.execute(select * from rooms);
resultcursor.fetchall()
cursor.close()
connection.close()printresultfor item inresult:
aeraitem[3]
house item[1]
room item[2]
numSearch_e(aera,house,room)
connection db.connect(hostlocalhost,userroot,passwdroot,dboucect,port3306,init_commandset names utf8)
cursorconnection.cursor()
cursor.execute(update rooms set ect numwhere idstr(item[0]));
connection.commit();
cursor.close();
connection.close();
保存数据库版本
现在这样就可以保存进数据库了但是这个网站几乎是7-5天更新一次我现在还不会计划任务爬取网页进行分析我要学习的还有很多现在一个用C#写出来的自动发邮件的小程序已经完成。我相信我就能够一点一点变成大神的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922833.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!