作者:Wilson_Iceman 出处:http://blog.youkuaiyun.com/Wilson_Iceman 欢迎转载, 但请保留这段声明。多谢!
最近一直在尝试使用Scrapy实现知乎的模拟登陆,终于实现了,今天在这里总结一下。
很多朋友可能知道了知乎进行了改版,特别是登录这一部分,不再使用传统的Form表单的形式,而是使用了Multipart/form-data的这种结构来提交表单数据,这就给我们模拟登陆知乎增加了不少麻烦。最近一直在尝试各种办法,后来又结合网络中其他朋友的意见,终于实现了使用Scrapy来模拟登陆知乎。
首先和之前的登录不同的是,之前登录有两个接收表单的地址,一个是https://www.zhihu.com/login/phone_num,一个是https://www.zhihu.com/login/email。现在知乎登录统一都改成了https://www.zhihu.com/api/v3/oauth/sign_in。所以我们发送表单数据的时候实际上是要发送给这个地址。另一个不同的地方是,之前在headers中需要一个_xsrf参数,这个参数是动态生成了。但是现在除了这个参数外,还需要另一个参数X-UDID。
接下来我们看看最近的知乎模拟登陆需要提交的表单数据有哪些。
从上面的截图中我们可以看到,之前的知乎模拟登陆只需要三个参数,分别是_xsrf, username, password,可是现在我们需要
这么多的字段才能完成模拟登陆的事情。现在需要做的是看看哪些字段是固定的,哪些字段是动态生成的。
我用了几个假的账号来尝试找出哪些字段是固定的,哪些字段是动态生成的。
- client_id : c3cef7c66a1843f8b3a9e6a1e3160e20 (目前是固定的)
- grant_type : password (固定)
- timestamp : (动态生成)
- source: com.zhihu.web (固定)
- signature : (动态生成)
- username : (用户输入)
- password : (用户输入)
- captcha : (动态生成,但是账号密码正确时并不需要)
- lang : 'en' (固定)
- ref_source : 'homepage' (固定)
- utm_source : "" (固定)
def get_headers(self):
'从网页源代码内解析出 uuid与Xsrftoken'
z1 = self.s.get('https://www.zhihu.com/')
sel = Selector(z1.text)
jsdata = sel.css('div#data::attr(data-state)').extract_first()
xudid = json.loads(jsdata)['token']['xUDID']
xsrf = json.loads(jsdata)['token']['xsrf']
headers = headers_raw_to_dict(post_headers_raw)
headers['X-UDID'] = xudid
headers['X-Xsrftoken'] = xsrf
return headers
这部分代码比较简单,主要就是通过css选择器来找到登录页面中隐藏的headers中的两个字段的参数,分别是X-UDID和
def check_captcha(self, headers, cn=True):
'发送一个验证码的请求,不管需不需要都必须发送这个请求'
if cn:
url = 'https://www.zhihu.com/api/v3/oauth/captcha?lang=cn'
else:
url = 'https://www.zhihu.com/api/v3/oauth/captcha?lang=en'
headers.pop('X-Xsrftoken')
z = self.s.get(url, headers=headers)
show_captcha = json.loads(z.text)['show_captcha']
if show_captcha:
with open('captcha.jpg', 'wb') as f:
f.write(response.body)
f.close()
captcha = input("please input the captcha\n>")
else:
captcha = ''
return z.json()
这段代码其实就是简单的发送一个验证码的请求,如果你的用户名和密码都正确的话不需要验证码,但是这个请求必须发。
接下来我就把源码贴出来

最低0.47元/天 解锁文章
443

被折叠的 条评论
为什么被折叠?



