接上文 今天我们来学习 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'
]