通过爬虫获取免费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地址网站实验
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy的IP搭建可以通过代理服务器来实现。以下是一个简单的示例: 1. 安装Scrapy和requests库 ``` pip install scrapy pip install requests ``` 2. 在settings.py中添加以下代码: ``` DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 543, 'yourproject.middlewares.RandomProxyMiddleware': 544, } PROXY_LIST = [ 'http://ip1:port1', 'http://ip2:port2', ... ] PROXY_PROTOCOL = 'http' ``` 其中,PROXY_LIST是代理列表,可以从代理提供商那里获得。PROXY_PROTOCOL是代理协议,一般为http或https。 3. 创建中间件文件yourproject/middlewares.py,添加以下代码: ``` import random import requests from scrapy import signals from scrapy.exceptions import NotConfigured class RandomProxyMiddleware(object): def __init__(self, proxy_list, proxy_protocol): self.proxy_list = proxy_list self.proxy_protocol = proxy_protocol @classmethod def from_crawler(cls, crawler): proxy_list = crawler.settings.getlist('PROXY_LIST') proxy_protocol = crawler.settings.get('PROXY_PROTOCOL') if not proxy_list: raise NotConfigured("PROXY_LIST is not set") return cls(proxy_list, proxy_protocol) def process_request(self, request, spider): proxy = random.choice(self.proxy_list) try: request.meta['proxy'] = self.proxy_protocol + '://' + proxy response = requests.get('http://www.baidu.com', proxies=request.meta['proxy'], timeout=5) if response.status_code != 200: self.proxy_list.remove(proxy) print('Proxy invalid:', proxy) return self.process_request(request, spider) except Exception: self.proxy_list.remove(proxy) print('Proxy invalid:', proxy) return self.process_request(request, spider) ``` 这个中间件会随机选择一个代理服务器,并在发送请求之前检查该代理服务器是否可用。如果代理服务器不可用,则从代理列表中删除该代理,并使用另一个代理服务器。 4. 运行Scrapy 现在可以启动Scrapy并使用代理服务器了。可以使用以下命令启动Scrapy: ``` scrapy crawl yourspider ``` 其中,yourspider是你的爬虫名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值