来自 威尼斯国际官方网站 2019-11-14 16:37 的文章
当前位置: 威尼斯国际官方网站 > 威尼斯国际官方网站 > 正文

Python模拟校园网登录,在Python中使用mechanize模块

如今忙着实验室的类型,学习的时间相对超少。前风流浪漫段时间刚开首接触python时,依样画葫芦照着写了三个爬虫,爬取了有个别网址的图片。当看到一张张图纸自动出以往Computer显示器上时,某些小小成就感。作者想大部分人起头了然Python学习Python都以从爬虫开始的吧。近来又想着解决用Python完成高校网的机关登录进度,每一天登入学园网都要输入学号和密码,未有二个深深记住密码的意义就是五毒俱全。为了偷点懒开端了就学,懒真的是上学的重力。记录一下学学的长河。

明白哪些火速在命令行或许python脚本中实例化叁个浏览器日常是那多少个有效的。
老是作者必要做别的有关web的机关职分时,作者都施用这段python代码去模拟三个浏览器。  

1 抓包

实际上用Python完毕高校网登入已经有成都百货上千爱钻研的同学完成了,然则对于笔者那五个刚了然Python语法的小白来说,代码艰深难懂,再者说每种高校的学园网登陆进程也是见仁见智的,外人的代码毕竟无法直接动用。由此小编从基本知识在此以前学起,再通晓代码,再到它山之石能够攻玉。在这里些爱钻研同学的博客中,作者连连看见抓包那么些词。那怎么是抓包呢,寻觅一下就有答案。

抓包(packet capture卡塔尔正是将网络传输发送与选取的数目包实行收缴、重发、编辑、转存等操作,也用来检查互联网安全--来自百度宏观

情趣是领略了,但也只是领略其字面上的意思,对于真正理解依旧要去施行能力有越来越深的认识。

import mechanize
import cookielib
# Browser
br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# Want debugging messages?
#br.set_debug_http(True)
#br.set_debug_redirects(True)
#br.set_debug_responses(True)
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

2 Fiddler

Fiddler是后生可畏款抓包工具,至于缘何下载了那款软件,也是看推荐的人非常多。那么为了兑现全自动登陆军高学校网的职能,作者又初步了上学Fiddler软件的运用。看了这几篇博客也基本有了一个摸底。

当今你收获了二个浏览器的亲自去做,br对象。使用那一个目的,便得以打开三个页面,使用雷同如下的代码:  

3 Http恳求响应

领会抓包工具的行使还远远不足,看着Fiddler里面显示的数目庸庸碌碌。还得跟着学习者软件里显示的是哪些数据,数据是什么样看头,小编急需什么样数据。互联网知识及其紧缺的本身随便搜索什么见到的结果都是例外的知识。那么内部最入眼的是Http央浼和响应了。笔者又寻觅到了以下几篇博客,对于这一个也许有了一些骨干的认知。我们的高校网实际相当于多少个Http伏乞响应的进度,只要知道了需要的网站,须求的多寡以致别的相应的供给,模拟登入也就落到实处了轮廓上了。

  • HTTP之乞请响应内容详明
  • http央求与响应全经过

感激网络,感激这么些不仅仅爱钻研还爱进献的校友们。

# Open some site, let's pick a random one, the first that pops in mind:
r = br.open('http://google.com')
html = r.read()
# Show the source
print html
# or
print br.response().read()
# Show the html title
print br.title()
# Show the response headers
print r.info()
# or
print br.response().info()
# Show the available forms
for f in br.forms():
  print f
# Select the first (index zero) form
br.select_form(nr=0)
# Let's search
br.form['q']='weekend codes'
br.submit()
print br.response().read()
# Looking at some results in link format
for l in br.links(url_regex='stockrt'):
  print l

4 Python相关知识

基本功性知识前边基本通晓的大都了,剩下的正是兑现工具Python的读书了。看了相关同学的代码后,主要行使到了以下八个模块,urllib、urllib2、cookielib。

  • urllib 和urllib2都以采用U牧马人L央浼的有关模块,但是urllib2能够接收二个Request类的实例来设置UKoleosL诉求的headers,urllib仅能够负责U奇骏L。
  • urllib提供urlencode方法用来GET查询字符串的产生,而urllib2未有。那是为啥urllib常和urllib2一齐使用的来由。如今的半数以上http央求皆以经过urllib2来拜谒的。
  • cookielib是停放的操作cookie模块,合营urllib、urllib2模块能够自由地模仿登录、爬取数据了。

对此这个文化,以下博客有相比较详细的介绍。

  • python爬虫 - Urllib库及cookie的使用
  • 关于Cookie的规律、功能,分歧以致利用
  • python—cookielib模块对cookies的操作
  • python的httplib、urllib和urllib2的界别及用

要是你拜候的网址要求验证(http basic auth),那么:  

5 实现

开采我们的Fiddler抓包工具,设置一下Filter,设置Host地址,只抓取登入学园网页面包车型大巴消息。图片 1

展开学校网登入页面,输入账号密码,点击登入。
图片 2
在Fiddler中我们就足以看看全体的报到进度。图片 3

能够看看左侧共有4个UTiguanL地址,第二个为记名页面网站,但那实际不是数据交由诉求的U普拉多L,因此不是我们须要的UENCOREL。第三个U宝马X5L才是一切实现进度的严重性。点击Inspectors开关,可以看见Post乞求的富有消息。上边的UCR-VL正是大家模拟登入所必要的U本田CR-VL。下边紫深黄框框起来的便是post的表单数据,我们在模仿的时候必要结构那几个表单。中间是大家组织Header所需求的音信。获得这一个就能够张开代码的编写制定啦。参考

# -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib
# 构建opener
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#posturl,即post方法所提交的url
post_url ='http://202.114.64.105:8080/eportal/userV2.do?method=login&param=true&wlanuserip=2f4818f809bb03949855832f02b16d5e&wlanacname=1e45aef6b6ca19a225a0ea53d741eeac&ssid=&nasip=5e15ad0ffd6b5c5c547d6756a5026574&snmpagentip=&mac=0b7f9d26b9fca3c8440b6a736dd7cd9d&t=wireless-v2&url=096e8e7059e430e083d28bd1997d6c398f3c08c737495b2fe98713e6195541bf2880d0d92acf2250&apmac=&nasid=1e45aef6b6ca19a225a0ea53d741eeac&vid=bee7bb6a6937bb74&port=a0a45c9f5ae3c42f&nasportid=ac41d60d7f1382084fc1d18ad6536cc7ff1d8558fc05d393faf4237ae4c8c8ab&username=2017xxxxxxxxx&pwd=xxxxxx'
# 根据抓包信息 构造表单
data = {
    'is_auto_land': 'false',
    'usernameHidden': '2017xxxxxxxxx',
    'username_tip': 'Username',
    'username': '2017xxxxxxxxx',
    'strTypeAu': '',
    'uuidQrCode': '',
    'authorMode': '',
    'pwd_tip': 'Password',
    'pwd': 'xxxxxx'
}
post_data = urllib.urlencode(data)
#根据抓包信息构造headers
headers = {
    'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Host': '202.114.64.105:8080',
    'Referer': 'http://202.114.64.105:8080/eportal/index.jsp?wlanuserip=2f4818f809bb03947c121d8e304df716&wlanacname=1e45aef6b6ca19a225a0ea53d741eeac&ssid=&nasip=5e15ad0ffd6b5c5c547d6756a5026574&snmpagentip=&mac=0b7f9d26b9fca3c8440b6a736dd7cd9d&t=wireless-v2&url=096e8e7059e430e083d28bd1997d6c398f3c08c737495b2fe98713e6195541bf2880d0d92acf2250&apmac=&nasid=1e45aef6b6ca19a225a0ea53d741eeac&vid=bee7bb6a6937bb74&port=a0a45c9f5ae3c42f&nasportid=ac41d60d7f1382084fc1d18ad6536cc7ff1d8558fc05d393faf4237ae4c8c8ab',
    'User-Agent':  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
}
req = urllib2.Request(post_url, post_data, headers)
content = opener.open(req)
#print content.read().decode('gbk').encode('utf-8')
print "连接成功"

代码中涉及账号密码都都用xxx替代。整个代码非常粗大略,不过里面提到的学问不菲,当然那是对于小白来讲的。

回看明天的学习进程,小编只想说感谢互连网,以致谢谢这么些不唯有爱钻研还爱进献的同窗们,是你们的下结论让新兴的人少走相当多弯路。后天在搜寻自动登陆军学园园网的时候,在微博上看到有人回复那是最简便易行最底蕴的标题,实现起来非常easy,笔者及时想那哪儿轻易了,完全摸不着头脑呀。站在今天询问多少相关文化后,笔者居然以为这回答还挺有道理的,实在是调用一下唇齿相依的库,构造一下生死相依的表单、header就OK。加上大家高校的学校网对于密码未有加密,也未曾验证码,难题变得更其简便易行。

懒是学习的引力,而经过兑现部分小作用也是不错的上学方法,比起枯燥的看书来得有意思些。继续求学~

# If the protected site didn't receive the authentication data you would
# end up with a 410 error in your face
br.add_password('http://safe-site.domain', 'username', 'password')
br.open('http://safe-site.domain')

出于以前运用了Cookie Jar,你无需管理网址的登录session。约等于无需管住亟待POST一个客商名和密码的图景。
平时说来这种地方,网址会呈请你的浏览器去存款和储蓄二个session cookie除非你重新登录,
而致令你的cookie中含有这么些字段。全数这个业务,存款和储蓄和重发那么些session cookie已经被Cookie Jar消除了,爽吧。
再者,你能够管理你的浏览器历史:  

# Testing presence of link (if the link is not found you would have to
# handle a LinkNotFoundError exception)
br.find_link(text='Weekend codes')
# Actually clicking the link
req = br.click_link(text='Weekend codes')
br.open(req)
print br.response().read()
print br.geturl()
# Back
br.back()
print br.response().read()
print br.geturl()

下载贰个文书:  

# Download
f = br.retrieve('http://www.google.com.br/intl/pt-BR_br/images/logo.gif')[0]
print f
fh = open(f)

为http设置代理  

# Proxy and user/password
br.set_proxies({"http": "joe:password@myproxy.example.com:3128"})
# Proxy
br.set_proxies({"http": "myproxy.example.com:3128"})
# Proxy password
br.add_proxy_password("joe", "password")

唯独,假如你只想要展开网页,而没有须要事先全部玄妙的功力,那您能够:  

# Simple open?
import urllib2
print urllib2.urlopen('http://stockrt.github.com').read()
# With password?
import urllib
opener = urllib.FancyURLopener()
print opener.open('http://user:password@stockrt.github.com').read()

本文由威尼斯国际官方网站发布于威尼斯国际官方网站,转载请注明出处:Python模拟校园网登录,在Python中使用mechanize模块

关键词: