python爬虫-requests cookie模拟登录豆瓣

课程目标:

  1. 为什么要模拟登录
  2. 模拟登录原理 - cookie和session
  3. 如何识别常用的验证码
  4. 通过 selenium模拟登录并使用coodie
  5. 滑动验证码+selenium模拟登录哔哩哔哩

1.为什么要模拟登录

因为很多网站是需要登录之后才可以看到一些数据,所以需要用python模拟登录。

2.模拟登录原理 -cookie和session

request模拟登录豆瓣如下

import json
import requests


def login():
    username = "xxx@qq.com"
    password = "xxx"
    url = "https://accounts.douban.com/j/mobile/login/basic"
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
    }

    post_data = {
        "ck": "",
        "name": username,
        "password": password,
        "remember": "true",
        "ticket": ""
    }
    res = requests.post(url, data=post_data, headers=headers)
    res_json = json.loads(res.text)
    if res_json['status'] == "success":
        print("登录成功")
    else:
        print("登录失败")


if __name__ == "__main__":
    login()

将 cookie 保存到文件中并从文件中读取 cookie

我们在上面已经登录之后,再登录首页,看看我们是否已经登录了。登录之后,右上角会显示我们的用户名,所以用用户名来做下识别。如下

    # 上面已经登录了,下面继续登录首页,看看我们是否登录了
    html = requests.get("https://www.douban.com/").text
    # 8ll是我的豆瓣昵称,登录之后会显示出来
    if "8ll" in html:
        print("已经登录")
    else:
        print("未登录")

我们需要用到 requests 的session,

session = requests.session()

然后在请求中,把 request都换成session,如下,就可以正常登陆了

html = session.get("https://www.douban.com/", headers=headers).text

但是这样的话,程序退出了,就要重新获取一次,有没有方法可以把cookie保存下来呢?当然有,有2中方法

1. 第一种,利用res的cookies,然后给到下一次请求的cookies参数中,如下

    res = session.post(url, data=post_data, headers=headers)
    res_json = json.loads(res.text)
    if res_json['status'] == "success":
        print("登录成功")
        cookie_jar = res.cookies
    else:
        print("登录失败")

    # 上面已经登录了,下面继续登录首页,看看我们是否登录了
    html = session.get("https://www.douban.com/", headers=headers, cookies=cookie_jar).text

上面用的是 cookie_jar 对象,也可以换位 dict对象,如下

    res = session.post(url, data=post_data, headers=headers)
    res_json = json.loads(res.text)
    if res_json['status'] == "success":
        print("登录成功")
        cookie_dict = res.cookies.get_dict()
    else:
        print("登录失败")

    # 上面已经登录了,下面继续登录首页,看看我们是否登录了
    html = session.get("https://www.douban.com/", headers=headers, cookies=cookie_dict).text

如上,我们只要把 cookie保存到文件中,下次需要的时候再打开即可。要用到python的一个包 import pickle,可以让我们很简单的把一个对象写到一个文件中。

1. 用pickle 把对象写入到文件,这里是把 cookie_jar文件写到文件中,及上面的 res.cookies, 不是 .get_dict()

 ps: wb, w=write写入,b代表二进制

    if res_json['status'] == "success":
        print("登录成功")
        f = open("douban.cookie", "wb")
        pickle.dump(res.cookies, f)
        f.close()
    else:
        print("登录失败")

代码可以用 with 优化如下,自动调动close。

        with open("douban.cookie", "wb") as f:
            pickle.dump(res.cookies, f)

2. 怎么用pickle 读数据, rb 是 read读,b是二进制的方式

with open("douban.cookie", "rb") as f:
    cookies = pickle.load(f)
    # 上面已经登录了,下面继续登录首页,看看我们是否登录了
    html = session.get("https://www.douban.com/", headers=headers, cookies=cookies).text
    # 8ll是我的豆瓣昵称,登录之后会显示出来
    if "8ll" in html:
        print("已经登录")
    else:
        print("未登录")

完整代码如下:

# +--------------------------
# | User: zq                -
# | Version: python3.7      -
# | Time: 2020-03-16 16:21                
# +--------------------------
import json
import requests
import pickle


def login():
    session = requests.session()
    username = "xxxx@qq.com"
    password = "xxxxx"
    url = "https://accounts.douban.com/j/mobile/login/basic"
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
    }

    post_data = {
        "ck": "",
        "name": username,
        "password": password,
        "remember": "true",
        "ticket": ""
    }

    res = session.post(url, data=post_data, headers=headers)
    res_json = json.loads(res.text)
    if res_json['status'] == "success":
        print("登录成功")

        with open("douban.cookie", "wb") as f:
            pickle.dump(res.cookies, f)
    else:
        print("登录失败")

    with open("douban.cookie", "rb") as f:
        cookies = pickle.load(f)
        # 上面已经登录了,下面继续登录首页,看看我们是否登录了
        html = session.get("https://www.douban.com/", headers=headers, cookies=cookies).text
        # 8ll是我的豆瓣昵称,登录之后会显示出来
        if "8ll" in html:
            print("已经登录")
        else:
            print("未登录")


if __name__ == "__main__":
    login()

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值