爬cookie跳过登录2018-12-02

cookie知识

把从浏览器获取到的cookie添加到session里来绕过登录

原因:http请求是无状态的,也就是说,你的每一次请求,网站服务器都会认识是一次新的请求。

问题:既然每一次请求都是新的请求,那么网站识别用户就遇到困难了:一个网站需要服务于多个用户,每个用户的需要呈现的内容可能是不同的。如果每次请求都是全新的,服务器会不知道是谁发过来的,进而就可能造成一个混乱的局面,把A的消息发给了B,C的邮件给了A等等。

解决方案:服务器如果需要识别你的身份,那它就给你发送一个或多个cookie(如果不需要对你进行特异性识别,那就没必要设置cookie了),之后你的每个请求默认会带上服务器设置的cookie(浏览器自动处理)。由于服务器给每个用户的分配的cookie的值是不同的,那服务器就可以轻松地通过cookie的值来识别用户了。

拓展:既然服务器是通过cookie这个令牌识别你是谁的,那么只要你的请求带上了任意一个人的cookie去访问服务器,那么服务器就会认为你就是那个人。所以在以前有中间人攻击这个事情,黑客就是通过拦截你的请求,找到你的cookie,自己伪装成你,然后帮他发广告或者是进行一些其他的危险操作以获得利润。

如果我们需要爬取一个需要登录的网站,但是他的登录流程非常麻烦,甚至需要输入验证码。我们有没有什么比较轻便的办法来解决这个问题呢?
当然有:我们在浏览器上登录了,然后把浏览器上的网站发送给你的cookie,按照格式添加到我们的session里面,那么我们就无需登录,成功伪装成了浏览器里面的自己的账号了,进而可以直接进行爬取了(每个请求带上cookie,服务器就会认为我们是已经登录过了)。

怎么获取浏览器的cookie呢?
F12打开调试模式,然后选中NetWork(网络)。接着鼠标点到网页上去,按F5刷新界面。我们马上可以看到在调试窗口里面的列表有一个接一个的请求出现了,我们找到第一个请求(通常是第一个,具体请看请求的网址),点击一下,就显示出了这个请求的具体信息了。
接着再找到Request Header里面的Cookie:


在我的截图里面,百度给我发送了非常多的cookie,你可能没这么多,但是也不影响,毕竟这只是个示例。

  • 接着我们把所有的cookie复制下来。
  • 每一条cookie是以;隔开的,所以我们先以;把这些cookies分开,分割为一条条的cookie。
  • 对于每条cookie我们再以第一个=把一条cookie分为 name 和 value 两个部分。
  • 然后我们把这些key-value的数据,添加到一个dict里面
  • 最后把cookie添加到 http_session 的cookies里面

举个例子,复制下来的cookies字符串为
"sessionid=124586245;name=pikaqiu;FDS=fdsa=okok;how=areyou"
首先我们以;切割这个字符串得到了下面这几条cookie

"sessionid=124586245"
"name=pikaqiu"
"FDS=fdsa=okok"
"how=areyou"

然后我们再把这几条cookie转换成requests能够接受的格式:

cookies = {
    'sessionid': '124586245',
    "name": "pikaqiu",
    "FDS": "fdsa=okok",
    "how": "areyou",
    }

最后再把这个cookie添加到requests提供的http_session里面,之后这个session就会自动为我们处理cookie了,包括每个请求发送cookie,修改和删除cookie的信息。

下面以上图的百度举个例子,下面就是采用了我自己的cookie访问百度的例子:

import requests
http_session = requests.session()
cookies = {'BAIDUID': 'CC97B75E17BC78:FG=1',
    'BIDUPSID': 'CC97B75E17FE0BEEBC78',
    'PSTM': '15700',
    'BDSFRCVID': 'th-sJeC626F0ZTQA',
    'H_BDCLCKID_SF': 'tJPjVC0yt',
    'ispeed_lsm': '2',
    'H_PS_645EC': '00e6qFET6oh4QC9Q',
   }  # 为了减少篇幅,我删掉了后面的几个cookie,你们可不能偷懒哦~
requests.utils.add_dict_to_cookiejar(http_session.cookies, cookies)
response = http_session.get("https://www.baidu.com")
print(response.content.decode('utf-8'))

通过把浏览器的cookie添加到程序里面,然后用程序来进行访问,我们就可以节约用程序登录的步骤,专心进行我们其他的操作了。这个办法同样适用于一些不需要登录,但是对cookie有要求的网站

https://1024dada.com/python/q/154504

你可能感兴趣的:(爬cookie跳过登录2018-12-02)