代理与模拟登录

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('当前请求出错了')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>