我想写一个查询话费和流量的爬虫,关键是实现模拟登陆的这个部分。 在登陆过程中,点击登陆之后,登陆表单会 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.