Python网络爬虫实战(四)模拟登录

  • 2019 年 10 月 3 日
  • 笔记

对于一个网站的首页来说,它可能需要你进行登录,比如知乎,同一个URL下,你登录与未登录当然在右上角个人信息那里是不一样的。

1

(登录过)

2

(未登录)

那么你在用爬虫爬取的时候获得的页面究竟是哪个呢?

肯定是第二个,不可能说你不用登录就可以访问到一个用户自己的主页信息,那么是什么让同一个URL在爬虫访问时出现不同内容的情况呢?

在第一篇中我们提到了一个概念,cookie,因为HTTP是无状态的,所以对方服务器并不知道这次请求到底来自于谁,就好像突然你收到了一封信,上面让你给他寄一些东西,但是信上却没有他的联系方式。

在HTTP中也是如此,我们普通的请求都类似于匿名信,而cookie的出现,就是让这封信上盖上了你自己的名字。

在请求时附带上你的cookie,服务器放就会知道这次请求来自于谁,然后你点击个人信息页,服务器就知道是要返回这个cookie对应的用户的信息页了。

在谷歌浏览器中,你可以在控制台Application里面找到当前网站的所有cookie键值对。一般来说用于确认你个人信息的只有一个键值对,但是你也可以把所有的都用上,并不能保证对方服务器是不是对某些键值对也进行检查了。

很多网站在你没有登录的情况下并不会给过多的数据让你看,所以你的爬虫需要进行一次模拟登录。

模拟登录需要从一个网站的登录界面开始,因为我们要在这里用爬虫发送post请求附带账号密码来登录对方网站。

拿人人网来举例。

人人网登录地址:http://www.renren.com/

3

打开控制台,我们可以先尝试观察一次登录的网络请求。很容易就能在里面找到一个/login的POST请求,登录的请求都会是POST,因为GET请求的参数会放在URL上,很容易被人拦截看到你的账号密码。

4

在表单参数中,我们需要注意的就只有email,password和rkey了,其他的照填即可。

email是我们的账号名,可以是邮箱也可以是电话号。

password是密码,这个密码明显是加密过的,对于这种情况,我们在请求时也要用同样的算法对密码进行加密,但是我们如何知道对方采用了什么加密算法呢?

这种情况大多数你都可以在控制台sources里面找到,在这里你可以找到网站加载过的所有文件,而加密算法一般会在js文件中。

sources里面很明显有一个叫login.js的文件,那么它一定和登录有关系,因为在sources里面打开js太难看了,会缩成一行,所以我就在控制台打开它了。

5

根据password定位到这里。

6

可以找到关于登录时密码加密的算法,顺便一提,人人网这个login.js的函数命名真的是没救了,abcd…xyz用了个遍,不知道是为了恶心自己人还是恶心别人写爬虫分析它这个login。但是很遗憾的是人人网给爬虫留下了一个很方便的登录途径,我们甚至可以不用自己加密密文!!!

虽然说这里可以不用自己转义加密算法了,但是其实很多网站并不会像人人网这样暴露出一个action的do事件让我们可以直接调用的,所以最好还是掌握一些密文加密的那部分。

再来看人人网暴露出的爬虫便捷登录的接口。

7

我们只需要调用这个do即可完成登录。

也就是说,我们模拟这个form来完成请求,在请求前,我们需要把信息装填到form中。

先安装scrapy依赖

pip install scrapy

import scrapy  url = "http://www.renren.com/PLogin.do"  data = {"email": "xxxxx", "password": "xxxxx"}  response = scrapy.FormRequest(url,formdata=data,callback=self.parse_page)

登录成功之后,我们就可以从response中拿到cookie,然后在之后的请求中都附带上cookie,这样对方服务器就知道我们是谁了。

7

如果之前在网页登录失败次数过多,可能会导致爬虫模拟登录需要验证码,而此处是考虑不需要验证码的情况,所以可能会登录失败,解决方法可以是清理本机Cookie。