Site icon泓源视野

通过爬虫获取免费IP代理,搭建自己的IP池(https)

文章目录
前言
简介
代码
如何调用结果
总结
前言
常见的反爬虫措施之一,就是查看用户发起请求的IP地址,若很频繁,则封IP。我们可以通过使用动态代理IP池实现反爬虫。百度搜索:爬虫IP池, 就有很多网站,这些网站一般都有提供免费的代理IP。但是这些IP质量不高,需要自己手动复制粘贴,测试后再使用,效率底下。我们可以写个爬虫,批量获取免费IP,自动测试后,再使用。

本篇文章使用的目标网址为:proxy list。本教程中不解析页面,而是直接获取json格式。因为HTTP较少,所以本文章只获取其中HTTPS类型的IP地址。使用的检查IP的网址为:https://icanhazip.com/

读者可以直接复制所有代码,新建py文件后,粘贴运行即可。2021.4.5亲测有效

此教程为获取https的,获取http的教程为:通过爬虫获取免费IP代理,搭建自己的IP池(http)

简介
传入URL地址,返回可用的IP地址list列表

__init __ :设置请求头,请求地址(直接是json格式)
check_ip : 检查IP地址是否可用,返回可用的当前页面上的IP地址list和端口号
run: 程序主代码
代码
import requests
import json

class FreeIP():
def __init__(self):
self.url = "http://proxylist.fatezero.org/proxy.list"
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}

def check_ip(self, ip_list):
correct_ip = []
for ip in ip_list:
if len(correct_ip) > 10: # 可以根据自己的需求进行更改或者注释掉
break
ip_port = "{}:{}".format(ip["host"],ip["port"])
proxies = {'https': ip_port}
try:
response = requests.get('https://icanhazip.com/', proxies=proxies,
timeout=3).text # 如果请求该网址,返回的IP地址与代理IP一致,则认为代理成功
# 可以更改timeout时间
if response.strip() == ip["host"]:
print("可用的IP地址为:{}".format(ip_port))
correct_ip.append(ip_port)
except:
print("不可用的IP地址为:{}".format(ip_port))
return correct_ip

def run(self):
response = requests.get(url=self.url).content.decode()

ip_list = []
proxies_list = response.split('\n')

for proxy_str in proxies_list:
try:
proxy = {}
proxy_json = json.loads(proxy_str)
if proxy_json["anonymity"] == "high_anonymous" and proxy_json["type"] == "https":
host = proxy_json['host']
port = proxy_json['port']
proxy["host"] = host
proxy["port"] = port
ip_list.append(proxy)
print("{}符合https和高匿条件".format(host))
except:
print(proxy_str)

correct_ip = self.check_ip(ip_list)
print("可用的IP地址有{}个".format(len(correct_ip)))
print(correct_ip)

if __name__ == '__main__':
ip = FreeIP()
ip.run()

如何调用结果
(不推荐)可以将此代码复制到自己的爬虫代码里,每次调用free_ip.get_ip(),获得list。该方法不推荐,因为会使网站并发量大,并且小型爬虫项目不需要这么多代理IP。
(推荐)手动复制控制台里的IP地址信息,粘贴到代码中,作为初始化IP地址,然后每次随机选择一个IP地址请求。
url = 'http://icanhazip.com/'
# 注意,底下的[]内容为复制粘贴上的
ip =['149.28.58.133:8080', '134.209.218.104:8080', '157.245.252.104:8080', '157.230.85.89:8080', '62.151.183.160:3128', '68.183.102.160:8080', '44.192.64.137:80', '134.209.70.67:8080', '169.57.1.84:80', '157.230.208.88:8080', '157.230.227.106:8080']
for i in range(100):
try:
real_ip = random.choice(ip)
proxy = {'http':real_ip}
res_text = requests.get(url=url,proxies=proxy, timeout = 3)
print("成功")
except:
print("{}不可用".format(real_ip))
ip.remove(real_ip)

总结
HTTPS端口号,可以请求http、https网址
有的同学设置请求的时候,发现在设置proxy时,如果为http,而目标url为https,也能请求成功。这是误区,因为如果proxy里的类型和url类型不同时,请求的IP地址并不是代理IP地址,而是本机的IP,具体可以通过IP地址网站实验

关注微信公众号【泓源视野网络安全】 不迷路

泓源视野网络安全,微信公众号

Exit mobile version