美文网首页
学习一键获取免费真实的匿名代理

学习一键获取免费真实的匿名代理

作者: 龙皓晨 | 来源:发表于2018-08-11 22:52 被阅读0次

    昨天闲来无事,实现了一个代理工厂,该程序自动从网上抓取免费代理(实现了9个代理网站哦),并对代理的可用性和匿名性进行检查,同时定时检查有效代理和无效代理,对于多次检查始终无效的代理,做放弃处理。同时检查函数可以自定义指定,用来针对不同的检查结果做出不同的反应。当然代理网站也可以自定义,简单的几行代码几条配置信息,实现最大限度的free-style。

    网上抓取免费代理的小程序已经很多了,那为什么我还要写呢,原因只有一个,用起来简单,免费代理这东西,你指望他用来看电影,就是扯蛋,网速都贼慢。说白了,用他只是为了提供给我们广大程序员一个可用ip罢了,那么这个程序肯定是程序员怎么用起来方便怎么写。pip一键安装,守护进程的方式启动,剩下的不需要你操心了,直接去redis中获取有效代理即可。

    原理什么的不讲了,都差不多,直接说使用方法

    使用docker一键启动!

    docker run -d -e REDIS_HOST=192.168.200.150 cnaafhvk/proxy-factory product start
    

    如果你不喜欢用docker的话,那么请往下看。

    安装

    # python3 以上版本
    pip install proxy-factory
    # 依赖 redis(必须), tesseract-ocr(可选)
    

    运行

    product start
    

    1分钟后看看你本地redis中good_proxies字段,是不是已经有了不少代理?

    超简单有木有

    但是!

    理想很丰满,现实很骨感。如果你运气好一个坑都没有踩到,那么请点右上角(或左上角)x,我们下次再见。但是我很清楚,99%的盆友都会遇到各种安装坑,所以如何躲坑也是我下面即将讲述的重点,支起耳朵来吧!

    首先

    程序使用到了redis做为存储,如果你电脑上正好安装有redis同时也启动着,那么恭喜你,这个坑不会撂倒你。如果没有,那么请安装

    #ubutnu & pi
    apt-get install redis-server
    其它平台请自行google。
    

    其次

    程序使用到了 tesseract-ocr 这个google开源的验证码识别程序,代理网站mimvp很坑爹,端口使用图片,于是乎只能机器识别了。当然,不安装ocr也没有关系,无非放弃这个网站喽。

    #ubutnu & pi
    apt-get install tesseract-ocr
    

    最后

    还是上面那个垃圾网站的坑,因为要识别验证码,我对图片进行了处理,所以需要pillow,pillow的安装请自行查看pillow官网,如果想放弃这个网站,打开我的源码,把这个网站相关的代码注释掉即可。

    如果你是windows平台,相信我,千万坑总有一个能把你撂倒,珍爱生命,远离windows。

    好了,坑讲解完毕。

    下面讲启动方式。

    启动方式

    程序虽小,功能挺全。

    先贴下指令

    usage: proxy factory [-h] [-s SETTINGS] [-cm CHECK_METHOD] [-sm SPIDER_MODULE]
                         [-d]
                         [{stop,start,restart,status}]
    
    positional arguments:
      {stop,start,restart,status}
    
    optional arguments:
      -h, --help            show this help message and exit
      -s SETTINGS, --settings SETTINGS
                            local settings.
      -cm CHECK_METHOD, --check-method CHECK_METHOD
                            proivde a check method to check proxies.
                            eg:module.func
      -sm SPIDER_MODULE, --spider-module SPIDER_MODULE
                            proivde a module contains proxy site spider methods.
                            eg:module
      -d, --daemon
    ####################################################################
    - product start: 程序开始(阻塞式)
    - product -d start: 程序开始(守护进程模式)
    - product restart 程序重启(守护进程模式)
    - product stop 程序关闭(守护进程模式)
    - product status 程序状态(守护进程模式)
    - product -s localsettings 指定一个自定义配置模块。(只要在sys.path中就可以找到)
    - product -cm check-method 指定一个自定义检查方法。(只要在sys.path中就可以找到)
    - product -sm spider-module 指定一个自定义的spider模块,存放自定义的spider方法。(只要在sys.path中就可以找到)
    

    自定义检查方法

    def check(self, proxy):
        """
        自义定检查方法
        :param self: ProxyFactory对象
        :param proxy: 代理
        :return: True则代理可用,否则False
        """
        import requests
        resp = requests.get("http://2017.ip138.com/ic.asp", proxies={"http": "http://%s"%proxy})
        self.logger.info(resp.text)
        ....
        return resp.status_code < 300
    

    将检查方法保存成python文件,比如check,然后-cm check.check指向他即可。

    自定义代理网站

    def fetch_custom(self, page=5):
        """
        自定义代理网站抓取
        :param self:ProxyFactory对象
        :param page: 可以在里记录一些可选参数,但是方法只能接收一个必选参数
        :return: set类型的代理列表,ip:port
        """
        proxies = set()
        url_tmpl = "http://www.kxdaili.com/dailiip/1/%d.html"
        for page_num in range(page):
            url = url_tmpl % (page_num + 1)
            soup = BeautifulSoup(get_html(url, self.headers), "html")
            table_tag = soup.find("table", attrs={"class": "segment"})
            trs = table_tag.tbody.find_all("tr")
            for tr in trs:
                tds = tr.find_all("td")
                ip = tds[0].text
                port = tds[1].text
                latency = tds[4].text.split(" ")[0]
                if float(latency) < 0.5:  # 输出延迟小于0.5秒的代理
                    proxy = "%s:%s" % (ip, port)
                    proxies.add(proxy)
        return proxies
    

    将代理网站方法保存成python文件,比如proxy_sites.py 然后-sm proxy_site指向他即可。

    配置模块

    REDIS_HOST = "0.0.0.0"
    
    REDIS_PORT = 6379
    
    # 质量不好的代理检查的时间间隔
    BAD_CHECK_INTERVAL = 60
    
    # 质量不好的代理连续检查失败次数的最大值,超过则丢弃
    FAILED_TIMES = 5
    
    # 质量好的代理检查的时间间隔
    GOOD_CHECK_INTERVAL = 60
    
    # 抓取新代理的时间间隔
    FETCH_INTERVAL = 60
    
    LOG_LEVEL = 'DEBUG'
    
    LOG_MAX_BYTES = 1024*1024*10
    
    LOG_BACKUPS = 5
    
    LOG_DIR = "/home/pi/logs"
    
    LOG_STDOUT = False
    
    LOG_JSON = False 
    

    将配置模块信息保存成localsettings.py,然后-s 指向他就可以。同时,程序还支持环境变量配置,只要将字段保存为环境变量信息,如 export GOOD_CHECK_INTERVAL = 120,配置即可生效,优先级关系:环境变量>localsettings>defaultsettings。

    redis中的状态

    127.0.0.1:6379> keys *
    1) "good_proxies"
    2) "bad_proxies"
    127.0.0.1:6379> type good_proxies
    set
    127.0.0.1:6379> type bad_proxies
    hash
    127.0.0.1:6379> smembers good_proxies
     1) "110.77.227.20:51552"
     2) "46.8.243.89:65205"
     3) "118.193.107.175:80"
     4) "223.99.214.21:53281"
     5) "119.41.200.20:53281"
     6) "120.198.224.7:8080"
     7) "110.77.177.116:51552"
     8) "36.37.219.198:53281"
     9) "138.197.230.116:55555"
    10) "219.138.58.59:3128"
    11) "192.158.236.58:3128"
    12) "58.26.10.67:8080"
    13) "60.208.44.228:80"
    14) "120.198.224.5:8080"
    15) "103.231.218.126:53281"
    16) "186.215.148.228:80"
    17) "210.26.125.142:8080"
    18) "31.145.111.12:65103"
    19) "218.201.98.196:3128"
    20) "61.160.208.222:8080"
    21) "101.200.45.131:3128"
    22) "120.198.224.6:8080"
    23) "52.66.155.0:80"
    24) "195.234.87.211:53281"
    25) "192.117.146.110:80"
    26) "106.14.51.145:8118"
    27) "106.75.25.3:80"
    28) "177.24.31.129:8080"
    29) "203.153.113.226:51552"
    30) "118.193.107.222:80"
    31) "112.13.93.43:8088"
    32) "114.215.103.121:8081"
    33) "118.193.107.240:80"
    34) "111.56.5.41:80"
    35) "118.193.107.138:80"
    36) "118.193.107.182:80"
    37) "183.215.140.117:8118"
    38) "110.77.227.35:51552"
    39) "137.74.254.242:3128"
    40) "110.77.239.184:51552"
    41) "94.177.201.18:80"
    42) "110.77.210.182:51552"
    43) "202.51.188.170:53281"
    44) "124.133.230.254:80"
    45) "120.198.224.5:8088"
    46) "118.193.107.180:80"
    47) "121.69.45.162:8118"
    48) "118.193.107.100:80"
    127.0.0.1:6379> 
    

    9个代理网站,有反爬机制的只有2个,一个是mimvp,使用图片端口反爬,一个是goubanjia,使用js混淆反爬,有兴趣的可以研究一下。

    欢迎交流指导


    Python学习交流群:834179111,群里有很多的学习资料。欢迎欢迎各位前来交流学习。
    本文转自网络 如有侵权 请联系小编删除

    相关文章

      网友评论

          本文标题:学习一键获取免费真实的匿名代理

          本文链接:https://www.haomeiwen.com/subject/whsjbftx.html