Python爬虫之模拟知乎登录

经常写爬虫的都知道 , 有些页面在登录之前是被禁止抓取的 , 比如知乎的话题页面就要求用户登录才能访问 , 而 “登录” 离不开 HTTP 中的 Cookie 技术 。
登录原理
Cookie 的原理非常简单 , 因为 HTTP 是一种无状态的协议 , 因此为了在无状态的 HTTP 协议之上维护会话(session)状态 , 让服务器知道当前是和哪个客户在打交道 , Cookie 技术出现了  , Cookie 相当于是服务端分配给客户端的一个标识 。

Python爬虫之模拟知乎登录

文章插图
 
cookie
  1. 浏览器第一次发起 HTTP 请求时 , 没有携带任何 Cookie 信息
  2. 服务器把 HTTP 响应 , 同时还有一个 Cookie 信息 , 一起返回给浏览器
  3. 浏览器第二次请求就把服务器返回的 Cookie 信息一起发送给服务器
  4. 服务器收到HTTP请求 , 发现请求头中有Cookie字段 ,  便知道之前就和这个用户打过交道了 。
实战应用
用过知乎的都知道 , 只要提供用户名和密码以及验证码之后即可登录 。当然 , 这只是我们眼中看到的现象 。而背后隐藏的技术细节就需要借助浏览器来挖掘了 。现在我们就用 Chrome 来查看当我们填完表单后 , 究竟发生了什么?
Python爬虫之模拟知乎登录

文章插图
 
(如果已经登录的 , 先退出)首先进入知乎的登录页面 www.zhihu.com/#signin  , 打开 Chrome 的开发者工具条(按 F12)先尝试输入一个错误的验证码观察浏览器是如何发送请求的 。
Python爬虫之模拟知乎登录

文章插图
 
从浏览器的请求可以发现几个关键的信息
  1. 登录的 URL 地址是 www.zhihu.com/login/email
  2. 登录需要提供的表单数据有4个:用户名(email)、密码(password)、验证码(captcha)、_xsrf 。
  3. 获取验证码的URL地址是 www.zhihu.com/captcha.gif…
_xsrf 是什么?如果你对CSRF(跨站请求伪造)攻击非常熟悉的话 , 那么你一定知道它的作用 , xsrf是一串伪随机数 , 它是用于防止跨站请求伪造的 。它一般存在网页的 form 表单标签中 , 为了证实这一点 , 可以在页面上搜索 “xsrf” , 果然 , _xsrf在一个隐藏的 input 标签中
Python爬虫之模拟知乎登录

文章插图
 
摸清了浏览器登录时所需要的数据是如何获取之后 , 那么现在就可以开始写代码用 Python 模拟浏览器来登录了 。登录时所依赖的两个第三方库是 requests 和 BeautifulSoup , 先安装
pip install beautifulsoup4==4.5.3pip install requests==2.13.0复制代码http.cookiejar 模块可用于自动处理HTTP Cookie , LWPCookieJar 对象就是对 


    推荐阅读