搜索公众号:白帽子左一,领配套练手靶场,全套安全课程及工具
很久很久以前,我有个梦想,就是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