Python爬虫教程 - 100天从新手到大师(04Day)


接上文 今天我们来学习 POST请求和模拟登录

1. post 和 get 的区别

get: 直接向我们的服务端请求资源响应
post:首先携带数据给服务器,然后呢再得到提交数据之后的资源响应

get: 问答 url传参 params 账号密码 十分的危险 好几百字
post: 安全性 载体方便

2. post请求案例

2.1 get抓取登录后的页面

目标 url :https://www.17k.com/

涉及到
cookie
post请求

注册登入之后 进入书架 抓包分析

import requests

if __name__ == '__main__':
    # 1.确认目标url
    url_ = 'https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919'

    # 设置用户代理
    headers_ = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 2.利用requests发送get请求,得到响应对象
    response_ = requests.get(url_, headers=headers_)

    str_data = response_.text

    print(str_data)

运行代码
在这里插入图片描述

结果:显示"用户登陆信息错误" 同一个url
https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919 爬虫程序访问

“用户登陆信息错误” 浏览器访问 > 我们想要的数据

浏览器访问:会自动携带上cookie 爬虫程序访问: 没有带上cookie

cookie 会话记录 > 记录着你的客户端和服务端进行交互的记录 浏览器:我们填入了一次用户名和密码之后 就会被记录在cookie里面
第二次访问该网站的时候,自动携带了拥有登录信息的cookie,所以就实现了自动登录
爬虫:并没有携带带有(登录信息)的cookie,所以服务就返回"用户登陆信息错误" 如果我们的爬虫程序 拥有了登录过后的cookie(成功登录信息),就可以请求得到登录过后的页面

解决方法:
尽可能模拟正常的用户

1.添加用户代理
2.添加cookie,去浏览器寻找正常用户的登录过后的cookie

第一种cookie添加方法,直接以键值对的方式,放到headers请求头里面

# 第一种cookie添加方法,直接以键值对的方式,放到headers请求头里面
import requests

if __name__ == '__main__':
    # 1.确认目标url
    url_ = 'https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919'

    # 设置用户代理
    headers_ = {
        # 用户代理User-Agent
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
        # 会话记录(携带成功登录信息)cookie
        'Cookie':'GUID=c7b41c1b-a028-45cb-8f8e-faf4191171d2; Hm_lvt_9793f42b498361373512340937deb2a0=1696913244; sajssdk_2015_cross_new_user=1; accessToken=avatarUrl%3Dhttps%253A%252F%252Fcdn.static.17k.com%252Fuser%252Favatar%252F16%252F76%252F37%252F102033776.jpg-88x88%253Fv%253D1696914202336%26id%3D102033776%26nickname%3D%25E4%25B9%25A6%25E5%258F%258B1E23RL1lm%26e%3D1712466202%26s%3D1ad9bfade041e79f; c_channel=0; c_csc=web; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22102033776%22%2C%22%24device_id%22%3A%2218b17e93fa0a8d-0bc855267748aa-26021a51-1024000-18b17e93fa13c1%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%2C%22first_id%22%3A%22c7b41c1b-a028-45cb-8f8e-faf4191171d2%22%7D; Hm_lpvt_9793f42b498361373512340937deb2a0=1696914351'
    }

    # 2.利用requests发送get请求,得到响应对象
    response_ = requests.get(url_,headers=headers_)

    str_data = response_.text

    print(str_data)

第二种携带cookie的方法,单独构造一个字典,携带cookie

# 第二种携带cookie的方法,单独构造一个字典,携带cookie
import requests

if __name__ == '__main__':
    # 1.确认目标url
    url_ = 'https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919'

    # 设置用户代理
    headers_ = {
        # 用户代理User-Agent
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 单独构造一个字典,携带cookie
    cookies_ = {
        'Cookie': 'GUID=c7b41c1b-a028-45cb-8f8e-faf4191171d2; Hm_lvt_9793f42b498361373512340937deb2a0=1696913244; sajssdk_2015_cross_new_user=1; accessToken=avatarUrl%3Dhttps%253A%252F%252Fcdn.static.17k.com%252Fuser%252Favatar%252F16%252F76%252F37%252F102033776.jpg-88x88%253Fv%253D1696914202336%26id%3D102033776%26nickname%3D%25E4%25B9%25A6%25E5%258F%258B1E23RL1lm%26e%3D1712466202%26s%3D1ad9bfade041e79f; c_channel=0; c_csc=web; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22102033776%22%2C%22%24device_id%22%3A%2218b17e93fa0a8d-0bc855267748aa-26021a51-1024000-18b17e93fa13c1%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%2C%22first_id%22%3A%22c7b41c1b-a028-45cb-8f8e-faf4191171d2%22%7D; Hm_lpvt_9793f42b498361373512340937deb2a0=1696914351'
    }

    # 2.利用requests发送get请求,得到响应对象
    response_ = requests.get(url_, headers=headers_, cookies=cookies_)

    str_data = response_.text

    print(str_data)

2.2 post模拟登录

利用post请求完成模拟登录,去得到登录过后的数据

“”"
post请求 > url
模拟登录 > 用户名,密码
“”"

先退出登入 再重新登入 这时候用户名和密码任意一个输错 进行抓取登入的 url

https://passport.17k.com/ck/user/login

if __name__ == '__main__':
    # 1.确认目标url
    url_ = 'https://passport.17k.com/ck/user/login'

    # 设置用户代理
    headers_ = {
        # 用户代理User-Agent
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }
    # 模拟登录,就不需要携带登录信息cookie
    # 携带数据(form表单里面携带) 一:选中之后输入shift+引号   二:按住alt不放,在需要添加引号的地方鼠标左键点击一下,点完之后,输入shift+引号
    form_data = {
        "loginName": "xxxxxx",  # 你的用户名
        "password": "xxxxxxx"  # 你的密码
    }

    # 2.利用requests发送post请求,模拟登录
    response_ = requests.post(url_, headers=headers_, data=form_data)

    str_data = response_.text

    print(str_data)

运行结果:
succ 登入成功

在这里插入图片描述

使用post请求模拟登录的好处:

cookie也是能够拿到登录过后的数据,但每次都要去现拿,存在一个cookie过期问题
使用登录过后的cookie get: cookie是有有效期 使用post登入一次 就不需要携带cookie

使用post请求模拟登录的坏处:
10个页面 就需要登录10次 太过麻烦
容易被检测到非正常的用户行为,从而被封禁账号

各有优缺 两者结合

3. session自动携带cookie

解决办法:
首先用post请求模拟登录,我们就可以直接获取到最新的登录后的cookie
再拿着这个最新的cookie去发送get请求不同的页面

import requests

if __name__ == '__main__':
    # 1.确认目标url(登录的url)
    login_url = 'https://passport.17k.com/ck/user/login'

    # 设置用户代理
    headers_ = {
        # 用户代理User-Agent
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 模拟登录,就不需要携带登录信息cookie
    # 携带数据(form表单里面携带) 一:选中之后输入shift+引号   二:按住alt不放,在需要添加引号的地方鼠标左键点击一下,点完之后,输入shift+引号
    form_data = {
        "loginName": "",  # 你的用户名
        "password": ""  # 你的密码
    }

    # 如果想要自动携带登录过后的cookie,那么就需要封装一个新的发送请求的对象
    session_ = requests.session()

    session_.post(login_url, headers=headers_, data=form_data)  # 这里可以不接收响应对象

    # 目的就是为了让这个对象session_携带登录过后的cookie
    read_url = 'https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919'

    response_ = session_.get(read_url, headers=headers_)  # 自动携带了登录过后的cookie

    str_data = response_.text

    print(str_data)

4. 反爬之cookie池

用户代理:客户端的信息 系统版本 浏览器

短时间内向同一个服务端发送多次请求 用户代理池

cookie 记录你的账户信息的

短时间内向同一个服务端发送多次请求

cookie池,多个cookie

cookie:服务端返回给我们cookie
A理发店 会员卡 B理发店 会员卡

怎么拥有多个账号密码
1.发动朋友
2.花钱买

cookie_list = [
    'aaaaaaaaaaa',
    'bbbbbbbbbbb'
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值