目录
一、爬虫为什么要用代理?
二、代理ip的网站
三、代理ip的测试网站
四、测试代理ip
当请求网站的次数过多时,当前网站就会封闭你的请求ip,从而让你没有办法爬取到那些正确的信息,代理IP可以起到中间层的作用,使用以后能够让爬虫伪装自己的真实IP,从而无法实施封禁行为,不过也不是所有的代理ip都很实用。
芝麻HTTP官网:高匿HTTP代理IP,SOCKS5代理IP,360天IP去重服务
静态代理IP - 小象代理 - 优质高速HTTP代理IP-爬虫-代理服务器
这两个是我常用的代理ip的网站,初次登录会有免费的代理ip可以领取,但大多时效短、稳定性差,用来测试ip的效果还行,爬取大量信息的话就有些力有不逮了。
https://2023.ip138.com/
这是一个测试ip可行性的网站,可以检测出你当前所处的ip地址,结合代理ip就可以测试这些ip能否打印出正确的地址,保证ip的可用性。
1、首先按照惯例,编写接收代理ip的代码,这里的请求链接API接口根据购买的代理ip生成。
import requests
import redis
import time
r = redis.Redis(host='127.0.0.1', port=6379,db=4,decode_responses=True)
#将代理ip存入到redis数据库中
while True:
if r.llen('proxy_ip')<5:#判断表里的IP是否少于5个,如果少于5个,就重新获取
source = requests.get(#获取ip
'https://api.xiaoxiangdaili.com/ip/get?appKey=942600746699214848&appSecret=X6ytzy5N&cnt=5&wt=json').json()
#上面有个白名单可以检测是否为个人使用,其他人使用这个地址就必须被加入白名单
for i in source['data']: #循环拼接
ip = i['ip']
port = i['port']
proxy = 'http://{}:{}'.format(ip, port) +'|0'
print(proxy)
# ip = str(i['ip']) + ':' + str(i['port'])+'|0' #0是当前代理ip的失败次数
r.lpush("proxy_ip",proxy) #从左边插入拼好的ip
else:
time.sleep(5) #相当于每5秒检查池里的ip数量是否满数
print('代理IP池已经满了')
ip = r.rpop('proxy_ip')
print(ip.decode('utf8'))
2、开始测试代理ip的可行性,这里直接从数据库redis中读取
import requests
from lxml import etree
import redis
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
r = redis.Redis(host='127.0.0.1', port=6379,db=4,decode_responses=True) #从数据库中排出代理ip
while True:
rr = r.rpop("proxy_ip").split('|') #用|分割,前边是代理ip,后边是失败次数
ip = rr[0]
n = int(rr[1])
proxy= {
'https':ip #这里的协议需要跟抓的网站上的协议配对
}
print(proxy)
try: #测试代理ip是否访问成功
response = requests.get('https://2023.ip138.com/',headers=headers,proxies=proxy,timeout=5)
except:
n = n + 1
if n < 3:
r.lpush("proxy_ip", ip + '|' + str(n))
print('请求失败,',ip + '|' + str(n))
else:
print('舍弃' + ip)
continue
source = response.text #提取页面源码
contents = etree.HTML(source).xpath('/html/body/p[1]//text()')
print(contents) #插入当前代理,打印出来
# print(type(response.status_code))
if response.status_code in (200,302): #提取访问状态,如果在200到302之间,就再从左边插进去
r.lpush("proxy_ip", ip+'|0')
else:
n = n+1 #判断失败次数,如果失败次数大于等于3,则直接舍弃
if n<3:
r.lpush("proxy_ip", ip + '|' + str(n))
print('请求失败,', ip + '|' + str(n))
else:
print('舍弃'+ip)
#非常简化的代理ip池,装一些不太紧张的任务可以用这个,简单,省代理,几个代理ip不停的循环
3、测试之后,如果可以正常打印出代理ip的地址就表示成功了,之后有什么任务需要执行的话只要在这个循环里直接写入代码就成