Python爬虫(4)

一:代理IP的介绍与使用

1.代理IP的相关介绍

代理的概念
在计算机互联网中代理是一个专有名词,主要是替代主体去执行一些行为操作。
例如在 Web 网站中,就存在正向代理和反向代理两种情况:
正向代理:指的是用户这边增加一个代理层,让用户访问用户代理,然后再让用户代理去访问用户的目标网站,从而达到隐藏用户真实信息的目的,简单来说正向代理用户就是用于保护用户的隐私,例如VPN等。

反向代理:指的是在服务器这边增加一个代理层,当用户向服务器发送请求时,实际上访问到的是服务器代理,然后再让服务器代理向服务器请求,从而保护服务器的隐私防止被用户直接访问,简单来说就是用于保护服务器的隐私,例如apache,nginx等。

代理IP的概念
任务要求在短时间内批量的进行数据采集。
为了防止被服务器检测为爬虫,需要进行如下伪装:
使用 User-Agent 池 => 防止被检测出一直使用同一个浏览器进行频繁请求。
使用 Cookie 账号池 => 防止被检测出是同一个账号进行频繁请求。
IP地址如果是固定的 => 如果进行频繁的请求就不太可能是正常用户,那就可以封IP禁止访问了。
为了防止服务器通过IP地址来检测出我们是爬虫程序,可以通过代理IP来随机使用不同的IP地址请求数据。

代理IP的种类
代理IP的种类很多,根据代理ip的匿名程度,可以分为下面这三类:
(1)透明代理(Transparent Proxy):透明代理虽然可以直接”隐藏“你的IP地址,但是还是可以查到你是谁。
(2)匿名代理(Anonymous Proxy):使用匿名代理,别人只能知道你用了代理,无法知道你是谁。
(3)高匿代理(Elite proxy或High Anonymity Proxy):高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。
从使用的角度来看,毫无疑问使用高匿代理效果是最好的。

2.代理IP的配置信息

代理IP的品牌很多,我们以天启IP作为讲解案例。
官网链接: https://www.tianqiip.com/
进入官网后先注册账号,注册后会免费赠送购买代理IP的天启币,这些足够大家进行测试使用。另外在注册好之后要记得做实名认证,否则是无法使用代理IP的。

代理IP提取接口
1.点击API提取

在这里插入图片描述
2.在加载的新页面中选择需要提取的代理IP的数量与时长
提取IP
在这里插入图片描述
选择提取IP的数量和时长

3.然后在下面选择提取代理IP的格式参数(一般默认参数即可)
在这里插入图片描述
4.将复制的链接在新的浏览器页面里进行访问,并复制IP地址
在这里插入图片描述
5.点击个人中心进入白名单的设置页面,点击添加IP白名单
在这里插入图片描述
6.进入页面将IP地址复制后添加进白名单即可
在这里插入图片描述
7.然后回到原来的页面就可以看到代理IP的信息了
在这里插入图片描述
(这里作者提取的3分钟IP过期了,又租了一个新的,所以跟上面的有差异)

8.然后回到API提取页面,选择代码demo这里我们用Python语言
在这里插入图片描述
官网demo介绍

#! /usr/bin/python
# coding=utf-8
import requests
import time
# 请求地址
targetUrl = "http://myip.ipip.net"
#
# #代理服务器
proxyHost = "代理IP"
proxyPort = 代理端口
#非账号密码验证
proxyMeta = "http://%(host)s:%(port)s" % {
"host": proxyHost,
"port": proxyPort,
}
#账号密码验证
#proxyMeta = "http://账号:密码@%(host)s:%(port)s" % {
# "host": proxyHost,
# "port": proxyPort,
#}
#
# #pip install -U requests[socks] socks5代理
#非账号密码验证
# proxyMeta = "socks5://%(host)s:%(port)s" % {
#
# "host" : proxyHost,
#
# "port" : proxyPort,
#
# }
#账号密码验证
# proxyMeta = "socks5://账号:密码%(host)s:%(port)s" % {
#
# "host" : proxyHost,
#
# "port" : proxyPort,
#
# }
#
proxies = {
"http": proxyMeta,
"https": proxyMeta
}
#
start = int(round(time.time() * 1000))
resp = requests.get(targetUrl, proxies=proxies,timeout=10)
costTime = int(round(time.time() * 1000)) - start
print(resp.text)
print("耗时:" + str(costTime) + "ms")

3.代理IP的使用测试

当配置好代理IP后,就可以定义代理IP来进行数据请求了

import requests
# 1、设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
# 2、设置代理IP
proxies = {
	'http': '123.245.249.182:40003'
}
# 3、定义请求链接
url = 'http://myip.ipip.net'
# 4、发送请求并打印输出内容
response = requests.get(url, headers=headers, proxies=proxies)
print(response.text)

剔除失效的代理IP
即便是使用代理IP,服务器也有办法检测请求对象是否是爬虫程序,,因为如果服务器也购买IP代理,将购买到的代理IP加入反爬虫数据库中,那么只要对请求者的IP进行核对就能查出来,只不过这种方式非常耗费金钱和资源,服务器商也不可能买下所有的代理IP。所以只要建立一个IP代理池,从IP代理池中随机抽取来进行请求数据,如果其中一些代理IP失效或者被屏蔽了,就从IP代理池中剔除。

Timeout的介绍
设置代理IP的响应时间,通过这个特点可以将一些响应很长的代理IP去掉

import random
import requests
# 1、定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
# 2、定义代理IP列表
ip_list = [
'1.2.3.4:1034',
'2.3.4.5:4417',
'4.7.6.1:4008',
'1.2.5.2:4090'
]
# 3、定义请求链接
url = 'http://myip.ipip.net'
# 4、循环遍历列表中的IP地址
for i in range(len(ip_list)):
# 5、从列表中随机取出一个代理IP
random_ip = random.choice(ip_list)
print('随机代理IP', random_ip)
# 6、定义代理IP字典
proxies = {'http': random_ip}
# 7、设置异常处理
try:
# 发送请求测试代理IP是否失效
response = requests.get(url, headers=headers, proxies=proxies,
timeout=3)
print(response.text)
# 如果捕捕捉到异常说明代理IP失效
except Exception as e:
print(e)
# 移除失效的代理IP
ip_list.remove(random_ip)
# 8、打印有效果的代理IP
print(ip_list)

4.Retrying介绍使用

Retrying介绍
因为代理IP是收费的,而且使用代理IP时有可能因为网络波动导致请求失败而误认为代理IP已经失效。所以通过retrying第三方模块来设置重新请求的次数,让代理IP多次重复请求URL链接。

安装命令

pip install retrying

测试代码

import requests
from retrying import retry
# 1、定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
# 2、定义代理IP列表
ip_list = [
	'1.2.3.4:1034',
	'2.3.4.5:4417',
	'4.7.6.1:4008',
	'1.2.5.2:4090'
]
# 3、定义测试的网站链接
url = 'http://myip.ipip.net'
# 4、使用retry重复发起三次请求
@retry(stop_max_attempt_number=3)
def send_request(proxies):
ip = proxies.get("http")
print(f'---正在使用【{ip}】发起请求---')
requests.get(url, headers=headers, proxies=proxies, timeout=3)
# 5、定义代理IP列表
new_ip_list = []
# 6、遍历代理IP列表
for ip in ip_list:
# 获取proxies字典
proxies = {'http': ip}
try:
send_request(proxies)
except Exception as ex:
print(f'代理IP【{ip}】无效,准备删除。')
new_ip_list.append(ip)
# 7、将记录下来的无效IP进行删除
for new_ip in new_ip_list:
ip_list.remove(new_ip)
print('剩下的代理IP为:', ip_list)

PS:
retry的参数在这里找到:
在这里插入图片描述

  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值