01 代理
反爬:封IP
1.什么是封IP
我们用程序访问人家网站,请求次数一下很多 不像人在访问,有些网站就会封掉你的IP 封了以后,当前的IP就不能访问这个网站,爬不了这个数据
2.所有网站都会封IP吗?
不会,是否封IP是看网站的设置策略来的,他不会把这个告诉我们,也不是所有的网站会封IP,具体确定是否封IP ,需要通过爬取数据的测试才能发现
3.怎么应对封IP被封
可以通过代理IP的方式解决。代理IP让服务器以为是不同用户在请求 让我们爬虫能请求成功,因为每个不同的用户IP不一样 IP就相当于我们当前的地址,我们原来的IP地址被封了,换一个新的IP地址,新的没有被封 就可以访问
代理匿名度分类
透明代理:接访问网站 网站后台可以看到你的IP
普通匿名:代理服务器用自己的IP 代理你的IP 但是 告诉了目标服务器是代理访问
高匿名代理:隐藏代理信息 让服务器觉得是真人访问 服务器看到的是代理IP
代理IP的使用
- 首先需要获取代理IP自己去网站上搜eg:携趣【9】【1.38】
-
import requests # https://www.xiequ.cn/ headers1 = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" } proxies = { # key: 看你请求的url是啥协议 http就写http value: http://ip:port 'http': 'http://221.234.28.181:3828' } response = requests.get(url='http://httpbin.org/get', headers=headers1, proxies=proxies) # 携带请求头 等号前面固定单词 等号后面 看你的变量的名字 print(response.text)
02 模拟登录
为什么要做模拟登录
有些网站的页面需要我们登陆才能爬取 ,不登录我们爬不了这个数据
所有网站都需要做模拟登录吗?
不用,我们目标页面需要登录才能看的话 就要做模拟登录,否则就不需要,甚至有些网站没有登录的选项,去做模拟登录肯定是不合适的
模拟登录怎么做
模拟登录中,最重要的就是cookie,他可以代表我们的登录信息,所以只要获取到登录后的cookie去访问页面就行
cookie是什么
cookie可以帮我们维持登陆状态
一:cookie介绍
1:cookie是浏览器访问服务器 服务器传给浏览器的一段数据
2:浏览器需要保存这个数据
3:以后请求 浏览器需要携带这个数据
二:cookie需要了解的知识点
cookie是有时效性的 ,不同的网站时效性不一样,Cookie通过在客户端记录信息确定用户身份
我们登录了人家网站 cookie的字段就会是登录后的状态,没有登录,就是登录前的cookie,甚至有些网站没有cookie 或者不同的页面cookie的值不一样
我们不需要去纠结这个值怎么生成的 不同页面的cookie怎么不一样,爬虫只需要知道如何用这个cookie就行
模拟登录的方法
手动拿cookie登录
直接在网页手动的拿登录的cookie写在请求头
手动取cookie登录的过程
#首先登陆
# 爬虫访问核心的点 是不是就是登录状态
# 如果我们请求的时候 带上了登录后的cookie去访问 就可以成功获取需要登录才能访问的网站
import requests
headers1 = {
# 页面目标url标头的cookie值
'Cookie':"_4399tongji_vid=172675165087174; _4399tongji_st=1726751650; USESSIONID=78b95fb6-8088-486c-8496-b4753d7117b4; Hm_lvt_e5a07b5994f78634294b9c347a5be7d2=1726751651; HMACCOUNT=34117985325527B9; Hm_lvt_5c9e5e1fa99c3821422bf61e662d4ea5=1726751651; _4399stats_vid=17267516510209905; Puser=15348438633; ptusertype=my.4399_login; Qnick=; Pnickset=1; ol=1; _gprp_c=""; phlogact=l14633; Uauth=4399|1|2024919|my.|1726751923502|a57ec38c8f3788da3b290756bea5b46c; Pauth=3503245786|2319398724|t3ce7n2813fb79d5cc217fde0492ec8f|1726751923|10002|cdd4ed27fd244ae63c4fe926da316401|2; ck_accname=2319398724; Xauth=bd35f04eeae67404c65f7c0ca74705bc; Pnick=0; Hm_lpvt_e5a07b5994f78634294b9c347a5be7d2=1726751923; Hm_lpvt_5c9e5e1fa99c3821422bf61e662d4ea5=1726751923; Pmtime=47c0c227ef79358a7c3e%7C1726751986",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
}
response = requests.get(url="https://my.4399.com/forums/index-getMtags?type=game",headers=headers1)
response.encoding="utf-8"
print(response.text)
代码登录
1:抓取登陆接口
先在登录页面打开抓包,发送错误的账号密码,点击登录 ,然后找到哪个请求是登录的请求,看看请求方法与传递的参数
2:用代码登录 发送账号密码
请求这个url,携带页面看到的参数,此时需要传递正确的账号密码,如果有加密字段或者验证码字段一般需要进行逆向
3:访问需要登录才能查看的页面 带登录后的cookie 进行请求
最后再用代码发请求,访问需要登录才能看到的数据的目标url,带上前面登录的cookie,就可以成功访问,爬取需要登录才能看到的数据了
'''
1:抓取登陆接口
https://ptlogin.4399.com/ptlogin/login.do?v=1 登录的url
2:用代码登录 发送账号密码
3:访问需要登录才能查看的页面 带登录后的cookie 进行请求
'''
import requests
headers1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
}
# 用代码登录 发送账号密码
data1 = {
"password": 'nanfeng', # 正确的密码
"username": "15348438633"
}
login_res = requests.post(url="https://ptlogin.4399.com/ptlogin/login.do?v=1", headers=headers1,data=data1)
print(login_res.cookies) # RequestsCookieJar对象 登录后的cookie
# 3:访问需要登录才能查看的页面 带登录后的cookie 进行请求
response = requests.get(url="https://my.4399.com/forums/index-getMtags?type=game",headers=headers1,cookies= login_res.cookies) # cookies有s 可以传字典或者CookieJar对象
response.encoding="utf-8"
print(response.text)
#!!!1 两种方法都可以处理模拟登录 用代码去做模拟登录 难度较高 推荐用cookie直接登录的写法!!!
03 会话管理
sesson对象
'''
import requests
session = requests.session() # 实例化 注意 加括号
headers1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
}
# 用代码登录 发送账号密码
data1 = {
"password": 'nanfeng', # 正确的密码
"username": "15348438633"
}
login_res = session.post(url="https://ptlogin.4399.com/ptlogin/login.do?v=1", headers=headers1,data=data1)
# print(login_res.cookies) # RequestsCookieJar对象 登录后的cookie
# 3:访问需要登录才能查看的页面 带登录后的cookie 进行请求
response = session.get(url="https://my.4399.com/forums/index-getMtags?type=game",headers=headers1)
response.encoding="utf-8"
print(response.text)
04 超时处理
import requests
headers1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
}
# 超过设定秒数未得到服务器响应,则触发错误
# response=requests.get('https://www.google.com/',headers=headers1,timeout = 3) # 超时时间
# 请求超过3秒 响应超过7秒就报错
response = requests.get('https://www.google.com/', headers=headers1, timeout=(3, 7)) # 超时时间
print(response.text)
代码: # cookies参数传递 使用get方法中的cookies参数进行传递 注意:参数必须为字典类型或者cookiejar对象 response = requests.get(url='登录后才能看的页面',headers=headers1,cookies= 前面模拟登录的响应对象.cookies05 异常处理
import requests
headers1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
}
try:
response = requests.get('https://www.google.com/', headers=headers1, timeout=(3, 7)) # 超时时间
print(response.text)
except Exception:
print('当前请求出错了')
标签:登录,IP,代理,cookie,requests,headers1,response,模拟
From: https://blog.csdn.net/D18346/article/details/143099789