Python爬虫编程13——cookie池

目录

cookie的作用

cookie池的部署

cookie的优势

cookie的属性

如何查看网站的cookie

cookie的保存使用(案例)


cookie的作用

1.登录账号可以降低被封禁的概率;

2.解决单个账号受访问限制;

3.避免复杂的模拟登录验证码;

4.爬取登录之后才能爬取的数据;

cookie池的部署

cookie池的部署重点在于模拟登录服务和cookie的检测。

cookie的优势

1.服务分离;

2.组件也可以实现分离;

3.服务能够分开部署;

cookie的属性

name = value 键和值 具体的cookie名称和内容

domain 作用域

path /表示根路径

expire 有效期

如何查看网站的cookie

1.

 点击网址前的🔒:

 查看cookie:

2.

 3.直接查看拼接好的cookie

 

 

cookie的保存使用(案例)

网址:http://shanzhi.spbeen.com/login/

这里JS反爬登录函数封装在了tools中的get_js里,如有需要可以查看主页中的JS反爬文章。

import requests
from lxml import etree
from tools import get_js
import json


def save_cookie(cookie_dict):
    """
    把cookie存入cookie池中
    Parameters
    ----------
    cookie_dict 待存储的cookie

    Returns
    -------

    """
    with open('cookies.txt', 'a', encoding='utf-8') as file_obj:
        # json.dumps 把字典转换成字符串
        file_obj.write(json.dumps(cookie_dict) + '\n')


# 传入账号和密码 实现模拟登陆
def login(username, password):
    # 请求的url和请求头
    url = 'http://shanzhi.spbeen.com/login/'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
        'Cookie': 'csrftoken=3U8bCQmmBjGjuZYIWpkZsAr9nHBgnk93Va1lyPz542u4bfKo4toe1o6Rh8QIVmKo'
    }
    # 获取源码中的csrfmiddlewaretoken和pk
    res = requests.get(url, headers=header).text
    html = etree.HTML(res)
    csrfmiddlewaretoken = html.xpath('//input[@name="csrfmiddlewaretoken"]/@value')[0]
    pk = html.xpath('//input[@id="pk"]/@value')[0]
    # new_password为加密之后的密码
    # 使用js环境进行的加密处理
    new_password = get_js('./shanzhi.js', 'doLogin', password, pk)

    postdata = {
        'username': username,
        'password': new_password,
        'csrfmiddlewaretoken': csrfmiddlewaretoken
    }
    cresponse = requests.post(url=url, headers=header, data=postdata)
    # print(cresponse.history[0].cookies.get_dict())

    # 确定模拟登录成功之后 想办法从响应对象中提取出cookie 然后存入cookie池中
    # 对于网页有可能不是把cookie的信息存放在history的第一个元素里面的情况 我们需要优化代码
    cookie_dict = cresponse.history[0].cookies.get_dict()
    # 存入cookie池
    save_cookie(cookie_dict)


if __name__ == '__main__':
    test_list = [
        {"username": "logic_00", "password": "logic_00"},
        {"username": "logic_01", "password": "logic_01"},
        {"username": "logic_10", "password": "logic_10"},
        {"username": "logic_11", "password": "logic_11"}
    ]
    for t in test_list:
        username = t.get("username")
        password = t.get("password")
        # print(username, password)
        login(username, password)

对于网页有可能不是把cookie的信息存放在history的第一个元素里面的情况,我们需要优化代码。

session        会话对象        跨请求保持某一些参数。

import requests
from lxml import etree
from tools import get_js
import json
from requests import utils


def save_cookie(cookie_dict):
    """
    把cookie存入cookie池中
    Parameters
    ----------
    cookie_dict 待存储的cookie

    Returns
    -------

    """
    with open('cookies2.txt', 'a', encoding='utf-8') as file_obj:
        # json.dumps 把字典转换成字符串
        file_obj.write(json.dumps(cookie_dict) + '\n')


# 传入账号和密码 实现模拟登陆
def login(username, password):
    # 请求的url和请求头
    url = 'http://shanzhi.spbeen.com/login/'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
        'Cookie': 'csrftoken=3U8bCQmmBjGjuZYIWpkZsAr9nHBgnk93Va1lyPz542u4bfKo4toe1o6Rh8QIVmKo'
    }
    # Session 维持会话 在跨请求的时候可以保留某一些参数
    session = requests.Session()

    # 获取源码中的csrfmiddlewaretoken和pk
    res = session.get(url, headers=header).text
    html = etree.HTML(res)
    csrfmiddlewaretoken = html.xpath('//input[@name="csrfmiddlewaretoken"]/@value')[0]
    pk = html.xpath('//input[@id="pk"]/@value')[0]
    # new_password为加密之后的密码
    # 使用js环境进行的加密处理
    new_password = get_js('./shanzhi.js', 'doLogin', password, pk)

    postdata = {
        'username': username,
        'password': new_password,
        'csrfmiddlewaretoken': csrfmiddlewaretoken
    }
    cresponse = session.post(url=url, headers=header, data=postdata)
    # print(cresponse)

    # 打断点之后 找到session 通过session再找到cookie
    # 通过session获取cookie的方式一共有两种
    # 第一种
    # cookie_dict = session.cookies.get_dict()
    # print(cookie_dict)

    # 第二种
    cookie_dict = utils.dict_from_cookiejar(session.cookies)
    print(cookie_dict)

    # 存入cookie池
    save_cookie(cookie_dict)


if __name__ == '__main__':
    test_list = [
        {"username": "logic_00", "password": "logic_00"},
        {"username": "logic_01", "password": "logic_01"},
        {"username": "logic_10", "password": "logic_10"},
        {"username": "logic_11", "password": "logic_11"}
    ]
    for t in test_list:
        username = t.get("username")
        password = t.get("password")
        # print(username, password)
        login(username, password)

利用爬取的cookie验证登录

import requests
from requests import utils
import json

# 从cookie池种获取cookie
with open('cookies.txt', 'r', encoding='utf-8') as file_obj:
    # cookie = file_obj.read()
    # readlines() 一次性从列表里面取出多行的
    cookie_list = file_obj.readlines()
    # print(type(cookie_list), cookie_list)

for cookie_str in cookie_list:

    # print(cookie_str)
    cookie_dict = json.loads(cookie_str)
    # print(cookie_dict)

    # 用session检测cookie 携带上cookie做模拟登录 如果能够模拟登录成功 就证明cookie是有效的
    # url = 'http://shanzhi.spbeen.com/index/'
    # # 会话对象
    # session = requests.Session()
    # # 把cookie放到session对象种
    # session.cookies = utils.cookiejar_from_dict(cookie_dict)
    #
    # # 通过会话发送请求
    # response_obj = session.get(url)
    # print(response_obj.text, response_obj.status_code)


    # 用requests检测cookie
    cookie_turn = ['{}={}'.format(k, v) for k, v in cookie_dict.items()]
    # print(cookie_turn)
    cookie = '; '.join(cookie_turn)
    url = 'http://shanzhi.spbeen.com/index/'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
        'Cookie': cookie
    }
    response_obj = requests.get(url, headers=header)
    print(response_obj.text, response_obj.status_code)

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值