模拟登陆中 302 重定向和 cookies 的一些困惑

2016-07-31 21:32:29 +08:00
 Huayx9

我想写一个查询话费和流量的爬虫,关键是实现模拟登陆的这个部分。 在登陆过程中,点击登陆之后,登陆表单会 post 到一个地址(这一步浏览器不显示),然后会 302 跳转到登陆成功的页面。

我现在想得到登陆成功的 cookies ,不知道该怎么提取,requests.session()并没有得到登陆成功的 cookies. 得不到登陆成功的 cookies ,代码就不能爬取登陆之后的查询信息。

post 表单的地址 http://i.imgur.com/2OS1Zi1.png

登陆过程中的重定向 1 http://i.imgur.com/cI6wBCV.png

登陆过程中的重定向 2 http://i.imgur.com/3c19Y38.png

再跳转登陆成功的页面 http://i.imgur.com/uAZsUdI.png

我有三个问题

代码如下,谢谢大家

#coding=utf-8
import requests
import re

# request headers
Head ={'Accept-Language': 'zh-CN,zh;q=0.8', 'Accept-Encoding': 'gzip, deflate, sdch', 'Host': 'ah.189.cn',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Upgrade-Insecure-Requests': '1', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0',
       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'}


# Chrome 打开登陆页面提取的 cookies
Cook = {'Hm_lvt_333c7327dca1d300fd7235c159b7da04': '1469964315',
        'lid': '', '_gscu_1758414200': '69964315ee6pb621', 'v_lasttime': '1469964315502',
        '_gscs_1758414200': '69964315tq317521|pv:1', 'Hm_lvt_c7c8eed8670bd7fffefc8b202fe0904d': '1469964315',
        'v_url_code': 'http%3A//ah.189.cn/sso/login%3FreturnUrl%3D%252Fbiz%252Fservice%252Faccount%252Finit.action',
        'JSESSIONID_SSO': 'Jh1GXdgDZJqdZqpLvRQvZzdlvT7y6BxHhCny9MhbKh1Kw1hSLNt2Q1c6231LrHQWrpDL4m115pz0YTLJN7jx2fmpTfPBx1JwlYvvkLBRySmy18tnW1c2Q7qPvQqK9kJP!463350529',
        'v_trackId': '1BD7B46E79FE234CE9C67E49D95245FB', 'Hm_lpvt_333c7327dca1d300fd7235c159b7da04': '1469964315',
        '_gscbrs_1758414200': '1', 'Hm_lpvt_c7c8eed8670bd7fffefc8b202fe0904d': '1469964315',
        'JSESSIONID_PERSONWEB': 'p2MyXdgGd8f5phjTTv2CJMr6J8QYhSyLX0kkZHlSwpppjhYGf3qm!1538637772'}

#登陆提交的表单
postdata = {'remPwd': '0',
        'loginName': '',
        'returnUrl': '/biz/service/account/init.action',
        'validCode': '',
        'loginType': '4', 'sysId': '1003', 'passType': '0',
        'csrftoken': '',
        'accountType': '9', 'ssoAuth': '0',
        'passWord': '',
        'latnId': '551'}


#登陆页面
baseurl = 'http://ah.189.cn/sso/login?returnUrl=%2Fbiz%2Fservice%2Faccount%2Finit.action'
#登陆表单 post 的地址
posturl = 'http://ah.189.cn/sso/LoginServlet'



sess = requests.session()
sess.headers.update(Head)

def getP(url,cookies):
    """带 session()requests 的 get 方法"""
    pre = sess.get(url,cookies = cookies)
    return pre

def getVerifyURL(url):
    """从主页提取验证码地址"""
    reg = r'/sso/VImage.servlet\?random=0\.[0-9]+'      #正则表达式匹配验证码图片链接
    img = re.search(reg,getP(url,cookies = Cook).content).group()
    imge = "http://ah.189.cn" + img     #得到验证码图片链接
    return imge

def getCodePic():
    """下载验证码图片"""
    verifyURL = getVerifyURL(baseurl)
    codePic = getP(verifyURL,cookies = Cook).content
    print verifyURL
    with open('x.jpeg','wb') as jpg:
        jpg.write(codePic)

def postData():
    """post 表单信息更新"""
    username = raw_input("输入手机号")
    code = raw_input("输入密码")
    passwd = raw_input("输入验证码")
    postdata['loginName'] = str(username)
    postdata['validCode'] = str(code)
    postdata['passWord'] = str(passwd)

getCodePic()
postData()

postover = sess.post(posturl,postdata)       #post 表单
cookLogin = postover.cookies       #查看 post 表单之后的 cookies
print cookLogin
con = sess.get('http://ah.189.cn/biz/service/account/init.action')
#登陆成功的页面
print "登陆成功",con

11347 次点击
所在节点    Python
29 条回复
Huayx9
2016-08-01 09:06:38 +08:00
@scnace 等号。。有的没的
lslqtz
2016-08-01 09:47:28 +08:00
@scnace 话说 wechat 为啥要 base64 不是只有邮件防爬虫 base64 么。。
jackyspy
2016-08-01 09:55:06 +08:00
@Huayx9 selenium2 只是操控浏览器
Huayx9
2016-08-01 10:43:33 +08:00
@lslqtz 太直接了,也容易暴露
gulu
2016-08-01 18:53:14 +08:00
我只是提醒一下,题主你试过 allow_redirects=True 了吗?
gulu
2016-08-01 18:58:02 +08:00
@lxy 你说的 cookie 同名应该是同样的 name=value pair 吧。 严格来说 cookie 更像一个 OrderedDict , 里面的 name=value 相同,但其它的什么 path, hosts, expire 信息不同的话算两个 cookie 。
coolloves
2016-08-01 23:11:36 +08:00
mark
lxy
2016-08-04 10:51:41 +08:00
@Huayx9 抽空检查了一下项目代码,是我自己的问题…… 某处调用了 requests.cookies.get_dict() 未指定域名且返回的信息不包括域名信息,进而导致了同名 cookies 混淆……
shanechiu
2017-12-05 16:10:44 +08:00
一个很好的问题。的确,会经常碰到临时重定向的情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296195

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX