紧接上一步
步骤二
进入https://www.facebook.com/login.php?login_attempt=1&lwv=110,在header的cookies中提交fr的值,在post中提交下面八个值,其中:lsd、email、pass、persistent、default_persistent、timezone、lgndim、lgnrnd、lgnjs、locale、next。这些值必须按照指定顺序提交,这个按顺序提交纠结了我一天。。。。其中email是登陆的用户名,pass是密码。Local是地区,比如“zh_CN”。Next为https://www.facebook.com/。注意发送前使用urllib.urlencode(values)函数对post的值进行url编码。其输入是一个字典,输出是一段字符串。Python的urllib2包中处理header数据时,是以字典类型作为输入的,所以不需要进行url编码,这个小问题也需要注意,否则会浪费很多时间。
def login_second_step(self): sent_url = 'https://www.facebook.com/login.php?login_attempt=1&lwv=110' request = urllib2.Request(url=sent_url,headers=self.facebook_header,data=self.login_post_values) content=self.opener.open(request) print '-------------------------------------------' for key in self.cj: print key.name,':',key.value print '-------------------------------------------'</span>
这一步的response是302重定向报文,python会自动向新目标https://www.facebook.com/发送一个新的请求,但是这个请求没有带上我们获取的cookie值。为了使得重定向报文得到新的cookie值,需要自己编写http_error_302()方法,参考了下面这篇博客http://www.hawkwithwind.net/blog/2013/08/13/python-urllib2-%E9%87%8D%E5%AE%9A%E5%90%91%E6%97%B6%E8%8E%B7%E5%8F%96cookie/
首先我们要自己编写一个遇到302重定向时的解决办法,在这里我的做法比较粗暴,手工处理cookie值,并将新cookie值添加到请求的头部,代码如下:
class RedirectHandler(urllib2.HTTPRedirectHandler): def http_error_302(self,req,fp,code,msg,headers): print '############ GOT 302 ###############' cookiemap = {} setcookie = str(headers["Set-Cookie"]) cookieTokens = ["Domain","Expires", "Path", "Max-Age",'path','domain'] tokens = setcookie.split(";") for cookie in tokens: cookie = cookie.strip() if cookie.startswith("Expires="): cookies = cookie.split(",", 2) if len(cookies) > 2: cookie = cookies[2] cookie = cookie.strip() else : cookies = cookie.split(",", 1) if len(cookies) > 1: cookie = cookies[1] cookie = cookie.strip() namevalue = cookie.split("=", 1) if len(namevalue) > 1: name = namevalue[0] value = namevalue[1] if name not in cookieTokens: cookiemap[name] = value print cookiemap str_cookie = '' for key in cookiemap: str_cookie = str_cookie + key + '=' + cookiemap[key] + '; ' str_cookie = str_cookie[:-2] print str_cookie req.add_header("Cookie", str_cookie)<span style="white-space:pre"> </span>#设置新的cookie值 return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)</span>
然后,需要在urllib2包中提交请求的opener中添加我们的302处理方法,代码如下:
opener = urllib2.build_opener(httpHandler, httpsHandler,RedirectHandler, urllib2.HTTPCookieProcessor(self.cj))</span>