目录
网站模拟登录总结
一、环境
window7系统
python3语言
pycharm工具
二、简介
由于需要爬取的网站大多需要先登录才能正常访问或者需要登录后的cookie值才能继续爬取,所以网站的模拟登录是必须要熟悉的,这里总结了拉勾、知乎、CSDN 、微博等的模拟登录过程以及遇到的问题。
三、模拟登录网站
以下的网站模拟登录重点是如何利用requests模拟浏览器请求、抓包分析等,涉及到验证码识别的没有做太多深入,往后会专门学习验证码识别这块,训练字库来提高OCR识别率等技术,而这里就简单的使用人工识别或者接入解码平台来识别验证码。
1、拉勾网模拟登录
拉勾网爬取需要携带cookie值 , 不然很快就会被网站识别为爬取而被重定向到登录界面。上篇文章介绍的拉勾全站爬取,其获取cookie的方法是利用selenium模拟浏览器操作登录拉勾,其缺点是速度慢,影响爬虫性能。现在利用requests模拟浏览器请求登录 , 不用像selenium一样完全模拟浏览器操作需要解析执行CSS、Javascript,性能得到提高,算是对拉勾网爬取的一个改进吧
分析浏览器登录拉勾
发现浏览器登录拉勾的关键请求url依次为:
登录界面url:
表单提交url(一般为post方法):
登录成功后的重定向url,其实是向服务器请求授权证明的url(寻找的一个依据是其response中含有set-cookie):
携带ticket请求授权的url:
上面是用FireFox浏览器查看的url请求情况,发现跟Chrome浏览器不同的是最后那个请求授权的url,FireFox里该请求的response中并没有我们需要的Set-Cookie,但实际上是有的;我们来看看Chrome中的该请求的response:
以上的url分析就是拉勾登录请求的基本情况,最后在进入拉勾主页,保存整个登录过程的cookie值到本地;
表单提交和代码实现
整个登录过程的cookie传递我们很少关注是因为利用了requests的session方法创建了一个持久会话,只要是在该会话中的请求,其cookie会自动保存、携带到下一个请求,可通过该方法获取cookie:
拉勾的登录操作重点就在表单提交的url请求上,分析该request,发现其请求头信息中有两个可疑参数,
这两参数在哪冒出来的?只能找啊,一般有三个考虑途径:
- 在网页面中出现
- 由javascript生成
- 需要请求url获取响应
我们在登录页面处发现了这两个参数:
故可以简单地编写程序将他们解析出来
def getTokenCode(self):
login_page = 'https://passport.lagou.com/login/login.html'
data = self.session.get(login_page, headers=self.HEADERS , allow_redirects=False) #allow_redirects
soup = BeautifulSoup(data.content, "lxml", from_encoding='utf-8')
'''
要从登录页面提取token,code, 然后在头信息里面添加
<!-- 页面样式 --><!-- 动态token,防御伪造请求,重复提交 -->
<script type="text/javascript">
window.X_Anti_Forge_Token = 'dde4db4a-888e-47ca-8277-0c6da6a8fc19';
window.X_Anti_Forge_Code = '61142241';
</script>
'''
anti_token = {'X-Anit-Forge-Token': 'None',
'X-Anit-Forge-Code': '0'}
anti = soup.findAll('script')[1].getText().splitlines()
anti = [str(x) for x in anti]
anti_token['X-Anit-Forge-Token'] = re.findall(r'= \'(.+?)\'', anti[1])[0]
anti_token['X-Anit-Forge-Code'] = re.findall(r'= \'(.+?)\'', anti[2])[0]
return anti_token
表单数据也是必须的
可见密码password是经过加密了的,那到底是怎么加密的呢?还是找, 在Chrome中Ctrl+ f 寻找,最后发现在这里: