python模拟登录segmentfault及备份文章(续)

上一篇用requests模拟请求,最后没有拿到cookies。今天偶尔看一篇HTTP相关的文章,发现在某些请求返回的header中会有set-cookie字段,很明显之前的失败应该是没有接收到包含这个字段的response。自己尝试人肉登录发现,cookie中的sf_remember字段是登录成功后跳转到首页时进行set-cookie的,而不是post的时候设置的。所以今天为了更好地模拟请求,使用request.Session来进行,这样cookie就不用自己去同步了,能更好地模拟浏览器行为

def _get_user_cookies(self):
        s = requests.Session()
        s.headers.update(headers)
        rep = s.get(target_url)
        post_url = "%s%s?_=%s" % (target_url, login_api_path,
                                  self.get_req_from_html(rep.text))
        data = {
            'mail': self.username,
            'password': self.passwd,
        }
        s.post(post_url, data=data)

通过反复登陆,我发现必须带要带headers,而headers必须的字段只有Referer,这样才能post成功,成功后会经过一个302重定向到首页,经历这个过程便能登陆成功。我查看登陆成功后的cookies,如下:

<RequestsCookieJar[<Cookie PHPSESSID=web3~4mc7mh81sh6vrrbgamcrh03ad3 for segmentfault.com/>]>

并没有sf_remember这个字段,可能是因为我在post的时候没有使用remember字段(记住该用户那个),说明之前想当然认为该字段就是标记登录是不可靠的,标记登录的很有可能只是PHPSESSID这个值而已。下图登录后的所有cookies

图片描述

因此模拟登录及备份文章就不需要phantomjs了,只用requests就足够,当然这只是对于segmemtfault来说,对于微博那种动态的,说不定就只能用Phantomjs,当然能分析出请求过程就能最大限度地使用简单方法来做自己想做的事

代码在这儿,增加了打印文章信息及耗时信息的功能,截图如下:
图片描述

总结:

对于登录(或其它任何post行为)时由登录链接直接进行跳转的(跳转次数不限),可以直接用requests模拟,它的Session完全可以跟随这种跳转行为。
对于跳转是由网页中的js脚本所控制的,使用phantomjs这种模拟真实浏览器行为,可以更容易保证其完成整个登录行为,相对地因为模拟的成本速度会慢一些。而且这种类型,理论上也是可以用requests模拟出来的,但是需要事先去分析导致跳转的js代码,会比较麻烦且不一定能成为,如果成功则可以提速。比如网易云音乐的艺人页面,请求了两个doc,其实只有第二个是需要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值