上一篇用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,如下:
]>
并没有sf_remember
这个字段,可能是因为我在post的时候没有使用remember
字段(记住该用户那个),说明之前想当然认为该字段就是标记登录是不可靠的,标记登录的很有可能只是PHPSESSID
这个值而已。下图登录后的所有cookies
因此模拟登录及备份文章就不需要phantomjs
了,只用requests
就足够,当然这只是对于segmemtfault来说,对于微博那种动态的,说不定就只能用Phantomjs,当然能分析出请求过程就能最大限度地使用简单方法来做自己想做的事
代码在这儿,增加了打印文章信息及耗时信息的功能,截图如下:
总结:
对于登录(或其它任何post行为)时由登录链接直接进行跳转的(跳转次数不限),可以直接用requests
模拟,它的Session
完全可以跟随这种跳转行为。
对于跳转是由网页中的js脚本所控制的,使用phantomjs这种模拟真实浏览器行为,可以更容易保证其完成整个登录行为,相对地因为模拟的成本速度会慢一些。而且这种类型,理论上也是可以用requests
模拟出来的,但是需要事先去分析导致跳转的js代码,会比较麻烦且不一定能成为,如果成功则可以提速。比如网易云音乐的艺人页面,请求了两个doc,其实只有第二个是需要的。