在很多情况下,一些网站的页面需要登录才能看到,这个时候我们往往就需要模拟登录了。
登录一般需要两个内容:用户名和密码,有的网站可能是手机号和验证码,有的是微信扫码,有的是 OAuth 验证等等,但根本上来说,都是把一些可供认证的信息提交给了服务器,然后服务器返回一个“凭证”。这个“凭证“”的生成和验证目前比较流行的实现方式有两种:
第一种:Session 和 Cookies
实现方式:方式一:Cookies 里面只存了 Session ID ,服务器能根据 Cookies 找到对应的 Session;方式二:Cookies 里面直接存了某些凭证信息。
第二种:JWT(JSON Web Token)
实现方式:用户使用用户名密码登录,然后服务器生成 JWT 字符串返回给客户端,客户端每次请求都带着这个 JWT 就行了
模拟登录基本以下三种方法:
- 方法一,人工在浏览器里面登录账号,然后把 Cookies/JWT 复制过来交给爬虫,这也是最省事省力的方式。
- 方法二,如果我们不想有任何手工操作,可以直接使用爬虫来模拟登录。登录的过程其实多数也是一个 POST 请求,我们用爬虫提交用户名密码等信息给服务器,服务器返回的 Response Headers 里面可能带了 Set-Cookie 的字段,我们只需要把这些 Cookies/JWT 保存下来就行了。
- 方法三,我们也可以用 Selenium 或 Pyppeteer 来驱动浏览器模拟登录,等待登录成功之后,再保存当前浏览器的 Cookies/JWT。
如果爬虫要求爬取的数据量比较大或爬取速度比较快,而目标网站又有单账号并发限制或者访问状态检测并反爬的话,可能我们的账号就会无法访问或者面临封号的风险了。这时候我们可以使用分流的方案来解决,比如某个网站一分钟之内检测一个账号只能访问三次或者超过三次就封号的话,我们可以建立一个账号池,用多个账号来随机访问或爬取,这样就能数倍提高爬虫的并发量或者降低被封的风险了。