爬虫反爬机制——代理IP的使用

目录

一、爬虫为什么要用代理?

二、代理ip的网站

三、代理ip的测试网站

四、测试代理ip


一、爬虫为什么要用代理?

        当请求网站的次数过多时,当前网站就会封闭你的请求ip,从而让你没有办法爬取到那些正确的信息,代理IP可以起到中间层的作用,使用以后能够让爬虫伪装自己的真实IP,从而无法实施封禁行为,不过也不是所有的代理ip都很实用。

二、代理ip的网站

芝麻HTTP官网:高匿HTTP代理IP,SOCKS5代理IP,360天IP去重服务

静态代理IP - 小象代理 - 优质高速HTTP代理IP-爬虫-代理服务器

        这两个是我常用的代理ip的网站,初次登录会有免费的代理ip可以领取,但大多时效短、稳定性差,用来测试ip的效果还行,爬取大量信息的话就有些力有不逮了。

三、代理ip的测试网站

https://2023.ip138.com/

        这是一个测试ip可行性的网站,可以检测出你当前所处的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的地址就表示成功了,之后有什么任务需要执行的话只要在这个循环里直接写入代码就成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值