爬取免费代理,拥有自己的代理池

搜索公众号:白帽子左一,领配套练手靶场,全套安全课程及工具 

很久很久以前,我有个梦想,就是SQL注入不要被ban,于是ip代理成为了首选,但是奈何钱包有限,只能爬取免费代理,于是借鉴了许多文章,形成了今日的ip代理池。

python编写,内容主要涉及多线程问题、以及爬虫。

一、具体实现流程:

图片

包括三个模块:
获取ip代理模块(爬虫获取ip),代理池模块(实现存储爬取的ip,写入有效ip代理),验证模块(对爬取的ip进行验证),获取模块(获取有效ip,并去重!)。

二、代码分析:(按程序执行顺序)代码分析:(按程序执行顺序


(一)、入口文件:StartApi.py

1.Init: 获取必要的参数。

2.getproxy: 调用module.GetProxy,多线程使用exec函数,实例化

3.module.GetProxy下的类,开始爬虫获取代理ip。

4.isproxy:调用module.IsProxy和module.OptPool类,循环判断获取代理池的ip,并进行判断。

图片

startproxy:程序入口函数,三个模式:

-c api 可获取已爬取存在ips.txt的有效代理0ip;

-t 100 100个多线程各个爬虫爬取一次获取有效代理;

-t 50 -m 1 -time 10 50个多线程无限次循环爬取有效ip,并且每10分钟进行循环。

具体代码如下:

·

# -*- coding:utf-8 -*-

·# Author:qiuzishan

import module.GetProxy

from module.OptPool import ProxyPool

from module.IsProxy import IsProxy

from threading import Thread

import time

from queue import Queue

from argparse import ArgumentParser

from module.GetApi import GetApi





class StartApi:

    def __init__(self):

        arg = ArgumentParser(description='baidu_url_collection')

        arg.add_argument('-t', help='线程数量 默认10个线程', type=int, default=10)

        arg.add_argument('-c', help='默认爬取ip进行验证 -c api 即可获取ips.txt的ip值!', type=str, default='getproxy')

        arg.add_argument('-m', help='默认只爬取一次,-m 1 可实现无线循环,默认8分钟爬取一次', type=int, default=0)

        arg.add_argument('-time', help='默认8分钟爬取一次,-m 10 实现每10分钟爬取一次,搭配-m使用,最好不低于5分钟', type=int, default=8)

        args = arg.parse_args()

        self.que = Queue()

        self.c = args.c

        self.t = args.t  # 获取线程!!!这很重要!

        self.m = args.m

        self.time = args.time



    def getproxy(self):

        '''

        有几个代理,就会有几个线程爬取代理!

        :param msg:

        :return: 循环获取代理,这里可以加入获取代理的实例

        '''

        thread = []

        usemodels = ['BeautifulSoup', 'ProxyPool', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'datetime', 're', 'requests', 'time']

        getmodels = dir(module.GetProxy)

        for i in getmodels:

            if i not in usemodels:

                # 用于测试是否存在代理print(i)

                self.que.put('import module.GetProxy\nmodule.GetProxy.' + i + '()')

        proxyNum = self.que.qsize()  # 有几个爬虫就开启几个线程

        for i in range(0, proxyNum):

            t = Thread(target=exec, args=(self.que.get(),))

            thread.append(t)

        for i in thread:

            i.start()

            # print(f'线程数:{i}开始')

        for i in thread:

            i.join()



    def isproxy(self, msg):

        """

        :return: 循环判断代理

        """

        pp = ProxyPool()

        ip = IsProxy(self.t)

        print(msg)

        while True:

            flag = pp.get_length_pool()

            if flag == 0:

                print
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值