Mechanize

Author Avatar
Tr0y 12月 26, 2015 22:08:35 本文共 812 字
  • 文为知己者书
  • 在其它设备中阅读本文章

Python 模拟登陆神器:Mechanize

一个栗子

先来说一下我们学校查询打卡的网站:

image-20180922101046687

可以看到,想要获得打卡次数,首先需要登录
我们可以用 python 做一个小小的爬虫来获得打卡次数。
那么问题来了,Python 如何模拟登录呢?

比较传统的方法是用抓包分析提交的数据,这里就不说了,网上有很多例子. 但是,分析包和网页代码有时候很麻烦(有些网站提交的表单数据需要经过复杂的加密,比如 QQ 空间).
经过一番寻找尝试,我发现了 mechanize 这个库,可以说是 Python 模拟登录的一把利剑
这是官方网址

既然趁手的兵器有了,接下来就可以开工了(需要了解的知识有正则表达式,Python 编码等, 即使不知道也可以看懂大部分代码)

思路很简单, 就是:
打开网站->检测表单->输入账号密码->提交表单->登录成功->抓取所需要的信息(正则 or BeautifulSoup)

关于正则表达式可以参看这个网站

代码

# -*- coding: cp936-*-
import mechanize  #就是它!
import cookielib
import urllib
import re

def getS(html): #利用正则抓取网页
    #这里可以定义一个抓取信息的函数,至于抓啥就写啥咯

br =mechanize.Browser()
##关联 cookies
cj =cookielib.LWPCookieJar()
br.set_cookiejar(cj)

#1-2 的内容就是 mechanize 的强大之处,mechanize 可以检测到表单,并可以通过输出表单内容来选择需要填写的表单

#-----------------------------------------------------------------------------1---------------------------------------------------------------------------------

## 设置一些参数,因为是模拟客户端请求,所以要支持客户端的一些常用功能
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),max_time=1)

## 这个是 degbug ## 可以看到执行过程,对调试代码有帮助
#br.set_debug_http(True)
#br.set_debug_redirects(True)
#br.set_debug_responses(True)

br.addheaders =[('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11)Gecko/20100701 Firefox/3.5.11')]##模拟浏览器头
response =br.open('******') #需要登录的那个网站

#输出登录所有需要填写的表单并打印 ,便于下一步的选择       
for f in br.forms():
    print f

br.select_form(nr=0) #根据上一步选择对应的表单

u=raw_input('输入账号\n')
print ''
p=raw_input('输入密码\n')
try:
    br.form['username'] = u #模拟填写表单'username'(这个表单的名字也是来源于输出表单那一步,括号里就是表单名了,有个=号记得要省去)
    br.form['password'] = p #同上
    br.submit() ##模拟按钮提交表单
    print ''
    html=br.response().read()#获取登录后的网页源码,其实这也是验证是否登录成功的方法之一
    getS(html)
#----------------------------------------------------------------------------2---------------------------------------------------------------------------------
except:
    print '账号密码不相符!!\n'  #抛出账号密码错误

总结

mechanize 省去了抓包的过程,跳过了大部分分析网页代码的过程. 但是 mechanize 也有一个很大的缺点,有些网页的表单它是检测不到的,
这时候只能通过一般方法获取登录所需要的东西,相对使用 mechanize 要复杂不少.

End

What do you think?

本文标题: Mechanize
原始链接: http://www.tr0y.wang/2015/12/26/Mechanize/
发布时间: 2015.12.26-22:08
最后更新: 2018.11.03-20:51
版权声明: 本站文章均采用CC BY-NC-SA 4.0协议进行许可。转载请注明出处!