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

很久很久以前,我有个梦想,就是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:qiuzishanimport module.GetProxyfrom module.OptPool import ProxyPoolfrom module.IsProxy import IsProxyfrom threading import Threadimport timefrom queue import Queuefrom argparse import ArgumentParserfrom module.GetApi import GetApiclass 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.cself.t = args.t  # 获取线程!!!这很重要!self.m = args.mself.time = args.timedef 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("退出循环")break  # 退出循环ip.startIsProxy()def startproxy(self):'''多进程同时运行'''if self.c == 'api':ga = GetApi()ga.start(self.t)else:if self.m:while True:getproxy = Thread(target=self.getproxy)isproxy = Thread(target=self.isproxy, args=('代理判断中',))getproxy.start()time.sleep(5)  # IpPool一开始无数据,因此先爬取加入IpPool列表中,防止出错isproxy.start()time.sleep(self.time*60)  # 每隔多长时间爬取一次else:getproxy = Thread(target=self.getproxy)isproxy = Thread(target=self.isproxy, args=('代理判断中',))getproxy.start()time.sleep(5)  # IpPool一开始无数据,因此先爬取加入IpPool列表中,防止出错isproxy.start()getproxy.join()isproxy.join()if __name__ == '__main__':print('''III                        pppppppp                                      lllIII                        pp     pp                                     lllIII                        pp      pp                                    lllIII  pppppppp              pp     pp        OOOOOOO        OOOOOOO       lllIII  pp     pp             pppppppp        OO      OO     OO      OO     lllIII  pp      pp            pp             OO        OO   OO        OO    lllIII  pp     pp             pp             OO        OO   OO        OO    lllIII  pppppppp   _________  pp              OO      OO     OO      OO     lllpp                    pp               OOOOOOOO       OOOOOOOO      lllpppp         {v 1.0 author:秋紫山 QQ:644976520 欢迎加q交流~~}pp''')start = time.perf_counter()sa = StartApi()sa.startproxy()end = time.perf_counter()print("use time:"+str(end - start) + "s")

(二)爬取代理ip: module/GetProxy.py

自定义爬虫类:

1.Init:不需要改变,把print的内容稍微改改即可,实现实例化即可启动该爬虫,并把获取的爬虫加入代理池ProxyPool里面

2.get_lxml_by_url:获取需要爬取页面的内容

3.get_proxy_by_lxml:自定义的爬虫,需要返回ip列表。

具体代码:
例如ip88Proxy

·# -*- coding:utf-8 -*-·# Author:qiuzishanimport requestsfrom bs4 import BeautifulSoupfrom module.OptPool import ProxyPoolimport timeimport re'''这里可以定义多个代理类,只要保证以“**.**.**.**:**”形式如池即可,然后在getproxy.py中加入多线程即可。'''class demoProxy:  # demo'''Get Agent from web 89ip'''def __init__(self):  # 自动爬取并且把ip输入代理池!此段函数不需要更改,print 的内容更改一下即可self.proxy = []try:print("demo代理开始爬取")self.proxy = self.get_proxy_by_lxml(self.get_lxml_by_url())except Exception as e:print("出错了:{}\n~aha代理demo凉了,求你了快去看看吧!".format(e))if self.proxy != []:pp = ProxyPool()for p in self.proxy:pp.get_into_pool(p)else:print("demo代理爬取的代理ip为空!代理可能凉了!")def get_lxml_by_url(self):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}r = requests.get('', headers=headers)  # 输入需要爬取的网站!if r.status_code == 200:response = r.textreturn responseelse:exit('Error: Module GetAgent Url Error')def get_proxy_by_lxml(self, response):ip = []# 爬取你的代理包括端口噢,例如,123.12.2.33:8080,然后放进ip列表里。# 请输入您的爬虫~# print(ip)return ipclass ip89Proxy:  # 89ip'''Get Agent from web 89ip'''def __init__(self):self.proxy = []try:print("89ip代理开始爬取")self.proxy = self.get_proxy_by_lxml(self.get_lxml_by_url())except Exception as e:print("出错了:{}\n~aha代理89ip凉了,求你了快去看看吧!".format(e))if self.proxy != []:pp = ProxyPool()for p in self.proxy:pp.get_into_pool(p)else:print("89ip代理爬取的代理ip为空!代理可能凉了!")def get_lxml_by_url(self):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}r = requests.get('https://www.89ip.cn/tqdl.html?num=200&address=&kill_address=&port=&kill_port=&isp=', headers=headers)if r.status_code == 200:response = r.textreturn responseelse:print('Error: Module GetAgent Url Error')def get_proxy_by_lxml(self, response):ip = []soup = BeautifulSoup(response, 'html5lib')soup.find_all('div')for div in soup.find_all('div', style="padding-left:20px;"):for child in div.children:if child.string is not None:if '更好用的代理ip请访问' not in child.string:ip.append(child.string.strip())# print(ip)return ip

(三)ip加入代理池: module/OptPool.py

相信很容易看懂!

·# -*- coding:utf-8 -*-·# Author:qiuzishanfrom queue import Queue·# IpPool存储所有未检验的代理,Proxy用于存储可用的代理IpPool = Queue()Proxy = Queue()class ProxyPool:'''代理池!'''def get_into_pool(self, args):  # 放进代理池一个ip''':param args::return: unknown IP warehousing'''IpPool.put(args)def get_length_pool(self):  # 返回代理池未验证的ip数量return IpPool.qsize()def get_out_pool(self):  # 取得代理池一个ip''':return: unknown IP outgoing'''if IpPool.qsize():getip = IpPool.get()return getipelse:print("IpPool变量无代理ip未检测")return 0  # 防止报错def get_into_proxy(self, args):  # 写入有效ip''':param args::return: effective IP warehousing'''Proxy.put(args)ip = Proxy.get()print(ip + '有效已写入ips.txt')with open('ips.txt', 'a', encoding='utf-8') as file:file.write(ip+'\n')def get_out_proxy(self):  # 输出有效ip''':return: effective IP outgoing'''proxy_txt = []with open('ips.txt', 'r', encoding='utf-8') as file:self.pass_isproxy = file.readlines()for i in self.pass_isproxy:proxy_txt.append(i.replace('\n', ''))return proxy_txt

(四)验证代理池ip: module/IsProxy.py

·# -*- coding:utf-8 -*-·# Author:qiuzishanimport requestsfrom module.OptPool import ProxyPoolfrom threading import Threadclass MyThread(Thread):  # 事实上没有调用这个函数,忽悠一下~def __init__(self, func):Thread.__init__(self)  #调用父类的init方法self.func = funcdef run(self):self.result = self.func()def get_result(self):Thread.join(self)print("asdasd")try:return self.resultexcept Exception:return Noneclass IsProxy:def __init__(self, t) -> None:self.pp = ProxyPool()self.t = tdef startIsProxy(self):self.manyTread()def manyTread(self):"""多线程开启!"""thread = []if self.pp.get_length_pool() < self.t:  # 最后代理池的剩余ip的不够线程,线程等于剩余的数量self.t = self.pp.get_length_pool()print("线程为:{}".format(self.t))for i in range(0, self.t):t = Thread(target=self.test_proxy)thread.append(t)for i in thread:i.start()# print(f'线程数:{i}开始')for i in thread:i.join()def test_proxy(self):ip = str(self.pp.get_out_pool())# print(ip)if ip != '0':proxies = {'http': 'http://' + ip,'https': 'https://' + ip,}try:requests.get('https://www.baidu.com/', proxies=proxies, timeout=10)self.pp.get_into_proxy(ip)return 1except requests.exceptions.ProxyError:print("无效ip" + ip)return -1except requests.exceptions.ConnectTimeout:print("无效ip" + ip)return -2except requests.exceptions.ReadTimeout:print("无效ip" + ip)return -3except requests.exceptions.ConnectionError:print("无效ip" + ip)return -4else:return 0if __name__ == '__main__':ip = IsProxy()

(五)、获取有效ip: module/GetApi.py

·# -*- coding:utf-8 -*-·# Author:qiuzishanfrom module.OptPool import ProxyPoolfrom module.QuChong import QuChongfrom module.IsProxy import IsProxyclass GetApi:def start(self, t):self.t = tself.get_api()def get_api(self):pp = ProxyPool()proxy_txt = pp.get_out_proxy()for i in proxy_txt:print("ips.txt里面的ip代理有:" + i)pp.get_into_pool(i)with open('ips.txt', 'w', encoding='utf-8') as file:file.write('')  # 清除ips.txt,清除过期无效代理ipip_test = IsProxy(self.t)while True:ip_test.startIsProxy()flag = pp.get_length_pool()if flag == 0:print("退出循环")break  # 退出循环xiaochu = QuChong()  # 去重后,显示代理xiaochu.quchong()if __name__ == '__main__':ga = GetApi()ga.start()

(六)、去重module/QuChong.py

·# -*- coding:utf-8 -*-·# Author:qiuzishanclass QuChong:def quchong(self):f = open('ips.txt', 'r', encoding='utf-8')lines = f.readlines()n = 0lines_clear = []# 列表去重for i in lines:if i not in lines_clear:lines_clear.append(i)n = n+1f.close()# print(lines_clear)f_clear = open("ips.txt", 'w', encoding='utf-8')for i in range(0, n):f_clear.write(lines_clear[i])print("最终有效ip:" + lines_clear[i])f_clear.close()

三、使用方法:

1.命令:python StartApi.py -t 100
开了100个线程,最后把有效ip存在ips.txt(未去重)
效果:

2.命令:python StartApi.py -c api -t 20
再次验证ips.txt的ip,开启20个线程再次去验证有效ip,并去重。最后高效代理ip再次存在ips.txt

3.查看使用方法:python StartApi.py -h

爬取大量的ip进行验证,爬取高效的ip
以上代码看不懂都无所谓,白嫖就可以了。

爬取免费代理,拥有自己的代理池相关推荐

  1. golang爬取免费代理IP

    golang爬取免费的代理IP,并验证代理IP是否可用 这里选择爬取西刺的免费代理Ip,并且只爬取了一页,爬取的时候不设置useAgent西刺不会给你数据,西刺也做反爬虫处理了,所以小心你的IP被封掉 ...

  2. 多线程爬取免费代理ip池 (给我爬)

    多线程爬取免费代理ip池 (给我爬) 文章目录 多线程爬取免费代理ip池 (给我爬) 安装的库 IP 隐藏 代理ip 多线程爬取 读入代理ip 写入代理ip 验证代理ip 解析网页得到代理ip 获取网 ...

  3. Python爬虫:爬取免费代理ip

    之前写的几个爬虫都只能爬取到少量的信息,这是由于一个ip频繁地访问网站,会被认定为非正常的爬虫从而被屏蔽,这时候就需要使用代理ip来访问网站了,具体方法就是在发送request时添加一个proxy参数 ...

  4. 爬取免费代理上网/组建IP代理池

    使用python爬虫对网上公开免费代理网站进行爬取,组件自己的代理池进行代理上网 先找到某公开免费代理网站 程序思路非常清晰明确,直接放到爬虫代码里,就不单独介绍 编写程序脚本进行捕获源码和清洗 im ...

  5. 爬取免费代理IP并测试

    爬取免费代理IP并测试 写在开头:这次总共爬了三个代理ip的网站,前两个网站经过测试,ip并不能访问我真正想爬的网站 Git仓库:https://gitee.com/jiangtongxueya/my ...

  6. python爬去新浪微博_Python爬虫爬取新浪微博内容示例【基于代理IP】

    Python爬虫爬取新浪微博内容示例[基于代理IP] 发布时间:2020-09-07 10:08:14 来源:脚本之家 阅读:120 本文实例讲述了Python爬虫爬取新浪微博内容.分享给大家供大家参 ...

  7. python爬取免费优质IP归属地查询接口

    python爬取免费优质IP归属地查询接口 python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个 ...

  8. python爬取简历模板_python 爬取免费简历模板网站的示例

    代码 # 免费的简历模板进行爬取本地保存 # http://sc.chinaz.com/jianli/free.html # http://sc.chinaz.com/jianli/free_2.ht ...

  9. python爬虫免费代理池_Python爬取免费代理搭建代理池

    我们在做爬虫的过程中经常会遇到这样的情况:最初爬虫正常运行,正常抓取数据,一切看起来都是那么美好,然而一杯茶的功夫可能就会出现错误,比如403Forbidden:这时候网页上可能会出现 "您 ...

最新文章

  1. 在线作图|在线做UMAP降维分析
  2. android:使用Messenger进行进程间通信(一)
  3. 解决小米手机缩放窗口问题
  4. boost::mp11::mp_fold相关用法的测试程序
  5. 复现HITB PHP lover代码审计
  6. 征战蓝桥 —— 2013年第四届 —— C/C++A组第3题——振兴中华
  7. 元组字典集合内置方法与拷贝
  8. java.lang.NoClassDefFoundError: com/android/build/gradle/internal/ToolingRegistryProvider
  9. C++ Primer 小贴士之第一二章
  10. php gd png透明,调整PNG大小并将其放在PHP / GD中较大的透明背景上?
  11. 在密码学研究方面不断创新突破—— 女密码学家的成功密码
  12. Play on Words UVA - 10129 (欧拉回路)
  13. 【CPRI协议v7.0】CPRI 8b/10b编码Scrambling功能
  14. 相见恨晚的5个资源网站 影视音乐资源随你看
  15. 个人博客_温州个人博客_Duing-冬忆个人博客
  16. PL330 DMAC笔记(2) - DMAC接口,状态机,初始化,APB slave接口
  17. 2013江苏计算机二级vfp试题,2008年春季江苏省计算机等级考试二级VFP考试试题(含答案)...
  18. 【笔试题目整理】 网易2018校园招聘数据分析工程师笔试卷
  19. 排名方法可用于分数排名,购买量排名等排名计算
  20. git clone 报错:fatal: unable to access ‘https://github.com/xxxxxxxxx/xxx.git/‘: gnutls_

热门文章

  1. 英语听力采用计算机化考试,一图读懂北京高考英语听力机考流程,附特点及应对建议...
  2. 第2章_7 判断某整数是正整数、负整数还是零 (10 分)
  3. 据说99%的程序猿都不懂得这样表白
  4. 赛程表 (递归调用, 非递归调用)
  5. 科技的成就(二十七)
  6. day2.数据类型的操作和方法
  7. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解
  8. RabbitMQ 6种应用场景
  9. 程序员必备英语单词清单
  10. JS实现PDF文件下载