先来说一下我们学校查询打卡的网站:
可以看到,想要获得打卡次数,首先需要登录
我们可以用python做一个小小的爬虫来获得打卡次数。
那么问题来了,Python如何模拟登录呢?
比较传统的方法是用抓包分析提交的数据,这里就不说了,网上有很多例子. 但是,分析包和网页代码有时候很麻烦(有些网站提交的表单数据需要经过复杂的加密,比如QQ空间).
经过一番寻找尝试,我发现了mechanize 这个库,可以说是Python模拟登录的一把利剑
这是官方网址: https://pypi.python.org/pypi/mechanize/
既然趁手的兵器有了,接下来就可以开工了(需要了解的知识有正则表达式,Python编码等, 即使不知道也可以看懂大部分代码)
思路很简单, 就是:
打开网站->检测表单->输入账号密码->提交表单->登录成功->抓取所需要的信息(正则 or BeautifulSoup)
关于正则表达式可以参看这个网站: https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx
完整的代码如下:
# -*- 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要复杂不少.
若文章有误, 请指出, 感激不尽