您当前的位置: 首页 >  爬虫

IT之一小佬

暂无认证

  • 3浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

爬虫之利用requests.session进行状态保持

IT之一小佬 发布时间:2021-01-24 14:43:59 ,浏览量:3

requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。

1.1 requests.session的作用以及应用场景
  • requests.session的作用
    • 自动处理cookie,即 下一次请求会带上前一次的cookie
  • requests.session的应用场景
    • 自动处理连续的多次请求过程中产生的cookie
1.2 requests.session使用方法

session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie

session = requests.session() # 实例化session对象
response = session.get(url, headers, ...)
response = session.post(url, data, ...)
  • session对象发送get或post请求的参数,与requests模块发送请求的参数完全一致
1.3 代码测试

使用requests.session来完成github登陆,并获取需要登陆后才能访问的页面

1.3.1 提示

  1. 对github登陆以及访问登陆后才能访问的页面的整个完成过程进行抓包
  2. 确定登陆请求的url地址、请求方法和所需的请求参数
    • 部分请求参数在别的url对应的响应内容中,可以使用re模块获取
  3. 确定登陆后才能访问的页面的的url地址和请求方法
  4. 利用requests.session完成代码

思路截图:

示例代码:

import requests
import re


def login():
    #  session
    session = requests.session()
    #  headers
    session.headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }

    #  url-获取token
    url1 = 'https://github.com/login'
    #  发送请求获取响应
    res_1 = session.get(url1).content.decode()
    # print(res_1)
    #  正则提取
    token = re.findall('', res_1)[0]     #  此处正则在打印出来的终端中获取,不要直接从F12中复制
    print(token)

    #  url2-登录
    url2 = 'https://github.com/session'
    #  构建表单数据
    data = {  #  data中的数据只需要token、login和password也是可以登录成功的
        # 'commit': 'Sign in',
        'authenticity_token': token,
        'login': 'xxxxxx',
        'password': 'xxxxxxx',
        # 'webauthn-support': 'supported',
        # 'webauthn-iuvpaa-support': 'unsupported',
        # 'timestamp': '1611468618614',
        # 'timestamp_secret': '0aeef8430701271fd17269ecde4b017549c9238b7a24829379772b344e301fea',
    }
    print(data)
    #  发送请求登录
    session.post(url2, data=data)

    #  url3-验证
    url3 = 'https://github.com/xxxxx'
    response = session.get(url3)
    print(response.content.decode())


login()

运行效果:

示例代码2:

import requests
import re


# 构造请求头字典
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
}

# 实例化session对象
session = requests.session()

# 访问登陆页获取登陆请求所需参数
response = session.get('https://github.com/login', headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />', response.text).group(1) # 使用正则获取登陆请求所需参数

# 构造登陆请求参数字典
data = {
    'commit': 'Sign in', # 固定值
    'utf8': '✓', # 固定值
    'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中
    'login': input('输入github账号:'),
    'password': input('输入github账号:')
}

# 发送登陆请求(无需关注本次请求的响应)
session.post('https://github.com/session', headers=headers, data=data)

# 打印需要登陆后才能访问的页面
response = session.get('https://github.com/xxxxxx', headers=headers)
print(response.text)
关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.4468s