python爱好者,参照fuck-login等项目尝试写爬虫。
首先打开知乎登陆页面,随便输入个账号密码进行尝试登陆,拿到登陆表单和请求头,以下所用工具为chrome开发者工具。
可以看到表单由五项构成,未知的三项分别为,_xsrf,captcha_type,captcha
请求头主要由User-Agent, Referer, Host三项构成。
所以请求头如下。
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
,'Referer':'https://www.zhihu.com/',
'Host':'www.zhihu.com'
表单三项首先解决_xsrf。尝试在页面中搜索xsrf,得到如下结果。
可以看到,_xsrf就在网页源码中,并且value值与表单项中一样,所以在这里采用正则表达式或者BeautifulSoup来提前。
注意应该用requests库中的session方法来进行以下操作,因为知乎会对cookie进行检验。应
保证以下操作和以后对的爬取内容均在一个会话中。
session = requests.session()
url_xsrf = session.get('https://www.zhihu.com',headers=headers)
html_xsrf = BeautifulSoup(url_xsrf.content,'lxml')
xsrf = html_xsrf.find('input')
由于知乎验证码是倒立的汉字,由图1可看出表单项中captcha项为倒立的字的坐标,此处不知该如何获取,观察到captcha_type这个字段的值为cn,遂尝试将值改为en请求看看结果如何。
选择左侧captch.gif选项,将cn改成en尝试获取验证码。
尝试成功,获取的是原来的知乎验证码,字母数字的组合。
此处captcha_url中str(int(time.time()))*1000,经观察requests url 中的r=150.......这一串数字很像时间戳,经验证果然是。
captcha_url = 'https://www.zhihu.com/captcha.gif?r='+str(int(time.time()*1000))+'&type=login&lang=en'
req_captcha = session.get(captcha_url,headers=headers)
with open('captcha.gif','wb') as f:
f.write(req_captcha.content)
将验证码图片保存至本地后,手动输入至程序中,至此,请求头构建完毕。
data = {'phone_num':手机号,
'password': 密码,
'captcha_type':'en',
'captcha':手动输入,
'_xsrf':xsrf
}
开始尝试登陆
req = session.post('https://www.zhihu.com/login/phone_num',headers=headers,data=data)
print(req.json()['msg'])
登陆成功,验证是否登陆成功,获取首页内容,检验和网页显示是否一致。
import re
req_sighin = session.get('https://www.zhihu.com',headers=headers)
html_sighin = BeautifulSoup(req_sighin.content,'lxml')
html_sighin.find('a',{'href':re.compile('//zhuanlan.zhihu.com/p/[0-9]*')})
可以看到,成功获取知乎首页内容,至此,模拟登陆成功,可以进行进一步的爬取。