在Python中使用mechanize模块模拟浏览器功能,Pyth

作者: 网络编程  发布:2019-11-28

近日忙着实验室的品种,学习的光阴相对超少。前大器晚成段时间刚起始接触python时,比葫芦画瓢照着写了三个爬虫,爬取了某些网址的图样。当看见一张张图片自动出今后Computer显示器上时,某些相当小成就感。作者想领先45%人初始理解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类的实例来设置U讴歌MDXL央求的headers,urllib仅能够选取U福特ExplorerL。
  • 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个URAV4L地址,第二个为记名页面网站,但那并非数据提交哀告的UPAJEROL,因并不是大家须求的U陆风X8L。第4个UPRADOL才是生机勃勃体达成进度的第生龙活虎。点击Inspectors按键,能够看出Post诉求的全部消息。上边的UTiggoL正是我们模拟登陆所要求的UOdysseyL。下边蓝绿框框起来的正是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中使用mechanize模块模拟浏览器功能,Pyth

关键词: 金沙澳门官网

上一篇:理清PHP在Linxu下进行时的文件权限
下一篇:没有了