2021.7.4
紧接上一步
步骤二
进入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>