如何建立自己的代理IP池,减少爬虫被封的几率

在爬虫过程中,难免会遇到各种各样的反爬虫,运气不好,还会被对方网站给封了自己的IP,就访问不了对方的网站,爬虫也就凉凉。

代理参数-proxies

首先我们先来介绍下什么是代理参数

代理,顾名思义,就是代理你原来的IP地址去对接网络

的IP地址

使用代理参数,可以隐藏自身真实的IP地址,避免被对方的网站封了。

1、语法结构
proxies = {
'协议':'协议://IP:端口号'
}
2、示例
proxies = {
'http':'http://IP:端口号',
'https':'https://IP:端口号'
}

如何获取代理IP

那具体如果获取代理IP呢,大多数IP都是收费,免费的IP的可以使用的很少,比如下面这些网站,

这次我就主要介绍爬取89网的免费IP,并测试可用性,存入自己的代理IP池中

89代理官网中有两种获取免费IP的方法,第一种就是主页面显示的IP地址

方法一



F12进行调试,页面是静态的页面,结构也相对简单,其IP地址全部在tr标签

import csv
import time ,random
import requests
from fake_useragent import UserAgent
from lxml import etree
class GetProxyIP(object):
#初始化URL
def __init__(self):
self.url='https://www.89ip.cn/index_{}.html'
# 获取代理IP
def get_IP(self,url):
html=requests.get(
url=url,
headers={
'User-Agent':UserAgent().random
},
timeout=5
).text
#转换为xpath可解析格式
parse_html=etree.HTML(html)
#解析得到所有tr列表
tr_list=parse_html.xpath('//tr')
#遍历每个tr,获取每个tr中的IP
for tr in tr_list[1:]:
ip=tr.xpath('.//td[1]/text()')[0].strip()
port=tr.xpath('./td[2]/text()')[0].strip()
#测试IP可用性
self.mtest_ip(ip,port) def mtest_ip(self,ip,port):
url='http://httpbin.org/get'
#设置headers
headers={
'User-Agent':UserAgent().random
}
#设置proxies代理参数
proxies={
'http': f'http://{ip}:{port}',
'https': f'https://{ip}:{port}'
}
try:
#发起请求
res=requests.get(url=url,proxies=proxies,headers=headers,timeout=8)
print(res.status_code)
#得到状态码就说明IP可用
if res.status_code:
print(ip,port,'Sucess')
#存到列表中
L=[ip+':'+port]
#写到csv中
with open('proxies.csv', 'a', encoding='utf-8') as f:
writer=csv.writer(f)
writer.writerow(L)
#IP不可用则抛出异常
except Exception as e:
print(ip,port,'Failed',e) #运行方法
def main(self):
#爬取1000页
for i in range(1,1001):
url=self.url.format(i)
#解析得到IP
self.get_IP(url)
time.sleep(random.randint(5,10)) if __name__ == '__main__':
spider= GetProxyIP()
spider.main()

方法二

在API接口中生成IP链接,访问进去也是有很多免费的代理IP





下面就直接爬虫代码进行爬取

# 获取开放代理接口
import csv import requests
import re
from fake_useragent import UserAgent
# 获取代理IP列表
def get_ip_list():
url='http://api.89ip.cn/tqdl.html?api=1&num=60&port=&address=&isp='
html=requests.get(url=url,headers={'User-Agent':UserAgent().random}).text
#按<br>分组
t_arr=html.split('<br>')
# 第一个特殊,需要先按</script>\n分组
t_0=t_arr[1].split('</script>\n')[1].strip
ip_list=[]
ip_list.append(t_0)
# 第二个及后面直接遍历就行
for i in range(2,len(t_arr)-1):
ip_list.append(t_arr[i])
print(ip_list)
#测试所有的IP可用性
for ip in ip_list:
mtest_ip(ip)
def mtest_ip(ip):
url='http://baidu.com/'
headers={
'User-Agent':UserAgent().random
}
proxies={
'http': f'http://{ip}',
'https': f'https://{ip}'
}
try:
res=requests.get(url=url,proxies=proxies,headers=headers,timeout=8)
print(res.status_code)
#一般状态码返回200就说明可用
if res.status_code==200:
print(ip,'Sucess')
L=[ip]
with open('proxies2.csv', 'a', encoding='utf-8', newline='') as f:
writer=csv.writer(f)
writer.writerow(L)
except Exception as e:
print(ip,'Failed',e) if __name__ == '__main__':
get_ip_list()

以后直接调用IP就可以用别人的代理了

如何建立自己的代理IP池,减少爬虫被封的几率的更多相关文章

  1. 【python3】如何建立爬虫代理ip池

    一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问. 这种时候,可 ...

  2. python多线程建立代理ip池

    之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受.所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多.之所以 ...

  3. 建立爬虫代理IP池

    单线程构建爬虫代理IP池 #!/usr/bin/python3.5 # -*- coding:utf-8 -*- import time import tempfile from lxml impor ...

  4. Python爬虫代理IP池

    目录[-] 1.问题 2.代理池设计 3.代码模块 4.安装 5.使用 6.最后 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代 ...

  5. 做了一个动态代理IP池项目,邀请大家免费测试~

    现在出来创业了,目前公司在深圳. 做了啥呢, 做了一个动态代理 IP 池项目 现在邀请大家免费测试体验! 免费激活码:关注微信公众号:2808proxy (每人每天限领一次噢~) 网站:https:/ ...

  6. springboot实现java代理IP池 Proxy Pool,提供可用率达到95%以上的代理IP

    一.背景 前段时间,写java爬虫来爬网易云音乐的评论.不料,爬了一段时间后ip被封禁了.由此,想到了使用ip代理,但是找了很多的ip代理网站,很少有可以用的代理ip.于是,抱着边学习的心态,自己开发 ...

  7. C#——做一个简单代理IP池

    一.缘由. 抓取数据时,有一些网站 设置了一些反爬虫设置,进而将自己本地 IP 地址拉入系统黑名单.从而达到禁止本地 IP 访问数据的请求. 二.思路. 根据其他 代理 IP 网站,进行一个免费的代理 ...

  8. 自己设计代理IP池

    大体思路 使用redis作为队列,买了一份蘑菇代理,但是这个代理每5秒可以请求一次,我们将IP请求出来,从redis列表队列的左侧插入,要用的时候再从右侧取出,请求成功证明该IP是可用的,将该代理IP ...

  9. 构建一个给爬虫使用的代理IP池

    做网络爬虫时,一般对代理IP的需求量比较大.因为在爬取网站信息的过程中,很多网站做了反爬虫策略,可能会对每个IP做频次控制.这样我们在爬取网站时就需要很多代理IP. 代理IP的获取,可以从以下几个途径 ...

随机推荐

  1. tmux 入门教程

    tmux 本教程是基于ACWing的<Linux基础课>所做,希望大家支持ACWing 功能 分屏 当需要同时运行两个终端,并且进行比对着输入时,来回切换比较麻烦,就可以利用分屏 可以在一 ...

  2. Nodejs path对象

    很快Node就会迎来4.0的时代,届时将并入现有的iojs,所以先前写过的iojs入门系列直接更名为NodeJS入门. 本篇开始将逐个介绍Node的各主要模块,依循API文档走一遍,但会给出比API文 ...

  3. indexOf() 和 lastIndexOf()

    一,定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索 ...

  4. iOS 学习资料Blog 技术论坛等,不断添加中。。。。

    iOS 学习资料整理 http://www.jianshu.com/p/dc81698a873c    中文 iOS/Mac 开发博客列表  https://github.com/tangqiaobo ...

  5. LVS负载均衡群集部署——DR模式

    LVS负载均衡群集部署--DR模式 1.LVS-DR概述 2.部署实验 1.LVS-DR概述: LVS-DR(Linux Virtual Server Director Server)工作模式,是生产 ...

  6. 【CF888G】Xor-MST(生成树 Trie)

    题目链接 大意 给出\(N\)个点的点权,定义两个点之间的边权为这两个点权的异或和,求这\(N\)个点间的最小生成树. 思路 贪心地想,相连的两个点异或和应当尽量的小. 那么应先从高位确定,因为高位的 ...

  7. postman中环境变量的设置方法、使用方法和实际中常见使用场景

    文中共介绍2种添加环境变量的方法.2种使用环境变量的方法,以及不同方法的适用范围. 文中给出了环境变量的两种常见使用场景:切换环境.动态参数关联(前一个请求的响应作为下一个请求的入参) 2种添加环境变 ...

  8. springboot自动扫描添加的BeanDefinition源码解析

    1. springboot启动过程中,首先会收集需要加载的bean的定义,作为BeanDefinition对象,添加到BeanFactory中去. 由于BeanFactory中只有getBean之类获 ...

  9. VS Code Java 2 月更新!教育特别版:单元测试、GUI开发支持、Gradle项目创建、以及更多!

    新春快乐!欢迎来到 Visual Studio Code Java 的 2 月更新,这个月我们给大家带来了一期教育特别版.每年的年初是许多学校开学的时间,为了给学生和教师提供在 Visual Stud ...

  10. MySQL基本数据类型与约束条件

    昨日内容回顾 数据存储的演变 # 方向: 朝着更加统一和方便管理 数据库的发展史 # 由本地保存逐步演变为线上保存 数据库的本质 # 本质上就是一款CS架构的软件 """ ...