使用Python模拟登陆知乎和v2ex

Python这门语言真的是相当出色,能够完成各种各样的任务,GUI桌面应用、Web应用、爬虫等等都可以完成,这不得不归功于他各种各样的模块支持,感觉Python就像是半个框架一样,你在写各种功能的时候不需要接触很多底层的东西,你只需要调用别人写好的各种Python模块API就能帮你完成各种任务。 今天使用Python做了两个模拟登陆的练习,相比PHP稍微有些复杂的Cookie操作,引入Python的cookielib模块之后,对cookie的操作就变得相当简单。

第一次模拟登陆的是知乎,写代码之前先用浏览器正常登录,分析一下流程,点击登录按钮之前,我先清除了cookie,开启Wireshark抓包,用Chrome的审查元素工具也行,只是Chrome有时候会跳转,不太方便,然后登陆,正常登录,说明登录的时候不需要携带Cookie也可以正常登录,过程还是相当简单的,然后分析抓包结果。 查看了一下Post的数据:一共是四个数据:

_xsrfemailpasswordrememberme。其中_xsrf比较特别,是在隐藏域的,需要先打开网页获取,其他的没什么特别的,直接贴出源码:

 

# encoding:utf-8
import urllib, urllib2, re, cookielib

# 账号相关参数
username = 'yourusername'
password = 'yourpassword'

# 打开目标链接,获取Html
url = 'http://www.zhihu.com'
zhihu = urllib.urlopen(url)
contents = zhihu.read()
# print(contents)
# 获取xsrf值
reg = r'name="_xsrf" value="(.*)"/>'
pattern = re.compile(reg)
result = pattern.findall(contents)
xsrf = result[0]
# 保存cookie
lgurl = 'http://www.zhihu.com/login'
cookie = cookielib.CookieJar()
cookie_handler = urllib2.HTTPCookieProcessor(cookie)
hdr = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36'}
post_data = {'_xsrf':xsrf, 'email':username, 'password':password, 'rememberme':'y'}
dt = urllib.urlencode(post_data)
req = urllib2.Request(lgurl, dt, hdr)
opener = urllib2.build_opener(cookie_handler)
urllib2.install_opener(opener)
response = opener.open(req)
page = response.read()
# print(page)
testurl = 'http://www.zhihu.com/settings/account'
req = urllib2.urlopen(testurl)
print(req.read())


然后是v2ex的,v2ex是一个朋友推荐给我的,上了之后感觉很不错,大神很多,讨论环境也不错,是个程序员论坛但是又不是那种只讨论专业知识的地方,回复帖子扣铜币让我感觉很不错,这样避免了水贴泛滥,废话不说了,继续说下v2ex的模拟登陆。 v2ex的登录要求cookie,Get登录页面的时候服务器会返回一个cookie,删除登录页面的cookie之后就无法正常登录了,所以,我们要使用登录页面的cookie进行登录,除了cookie的处理,过程同上,放出源码,可以看出和上面的不同了。


# encoding:utf-8
import urllib, urllib2, cookielib, re

# 账号相关参数
username = 'yourusername'
password = 'yourpassword'

# cookie设置
cj = cookielib.CookieJar()
cookie_hanler = urllib2.HTTPCookieProcessor(cj)

# 获取once的值
lgurl = 'http://v2ex.com/signin'
req = urllib2.Request(url = lgurl)
opener = urllib2.build_opener(cookie_hanler)
urllib2.install_opener(opener)
contents = opener.open(req)
contents = contents.read()

# 根据正则表达式匹配once值
reg = r'value="(.*)" name="once"'
pattern = re.compile(reg)
result = pattern.findall(contents)

# 登录参数设置
lgurl = 'http://v2ex.com/signin'
once = result[0]
data = {'u':username, 'p':password, 'once':once, 'next':'/'}
data = urllib.urlencode(data)
hdr = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36', 'Referer':'http://v2ex.com/signin', 'Host':'v2ex.com'}
req = urllib2.Request(url = lgurl, data = data, headers = hdr)
opener = urllib2.build_opener(cookie_hanler)

# 进行登录操作
response = opener.open(req)
page = response.read()
print(page)

# 可以随便访问其他的链接
contents = urllib2.urlopen('http://v2ex.com/member/'+username)
contents = contents.read()
print(contents)