ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-05 14:59:29  阅读:194  来源: 互联网

标签:ip IP list 爬虫 proxy https IP地址 port


文章目录

前言

常见的反爬虫措施之一,就是查看用户发起请求的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地址网站实验

标签:ip,IP,list,爬虫,proxy,https,IP地址,port
来源: https://blog.csdn.net/weixin_49328057/article/details/115442051

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有