2021-07-04

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>
上一篇:(转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联


下一篇:【爬虫学习】④ Session 与 Cookies