Python爬虫学习日记:模拟登陆
#! /usr/bin/env python
#coding=utf-8
import urllib2,urllib,cookielib
def login():
#第一部分是通过预访问的方式,获取目标网址的cookie信息
firstGetCookieUrl='http:/www.xxx.com/login'
# 获取cookiejar实例
cj = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
resq=urllib2.urlopen(firstGetCookieUrl)
#第二部分是从获取的cookie信息中提取需要的参数为字典
f = {}
for index, Cookie in enumerate(cj):
#列出cj中的phpsessid和csrf_name_cookie值
f[Cookie.name] = Cookie.value
#第三部分获取用户名和密码后登录指定网址
username = raw_input("请输入用户名:")
password = raw_input("请输入密码:")
#拿到需要的csrf_cookie_name参数
csrf_post_name = f.get('csrf_cookie_name')
data = {"username": username, "password": password, 'foward': 'null', 'csrf_test_name': csrf_post_name}
#将post的数据编码
data_encodeed=urllib.urlencode(data)
post_data='http://www.xxx.com/login'
#post_data = raw_input('请输入网址:')
#自己设置User-Agent(真实伪装,超越限制)
headers ={"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
#带有请求信息请求登录目标网址
req=urllib2.Request(post_data,data_encodeed,headers)
content=opener.open(req)
print content.read() #linux下没有gbk编码,只有utf-8编码
if __name__ == '__main__':
login()
由于本次模拟登录的后台地址需要在post时的data信息中携带cookie值作为服务器的登录token校验
所以在第一部分先通过预访问的形式获取了cookie参数,并添加进入post请求的header中。
在第二三部分通过分解获得的cookie实例拿到具体的cookie参数值。并将其录入字典f中,为下一步data信息中需要的csrf_test_name参数做准备。
最后一部分是关键的登录操作。
备注:本次操作中比较麻烦的是获取cookie参数,由于cookielib初步获取的cookie实例为cookie instance格式,不太好提取(通过正则匹配应该可以,但是还没学会呢哈哈哈哈,所以曲线救国了)。查找资料后通过enumerate()将获得的cj值分解为列表格式,然后通过cookie的固定方法cookie.name,cookie.value获得具体的键对值。再将其写入至data信息中才完成了服务器端的token校验。