在实际渗透测试工作中经常会被动不动封ip,很影响工作效率,于是我便在自家服务器上搭建了一个免费代理池项目:https://github.com/jhao104/proxy_pool/,搭建过程不多说了,详情请见下面链接的搭建过程,这篇主要讲下利用。
搭建教程:https://blog.csdn.net/wjwqp/article/details/124014484
搭建完成后,访问网页服务器ip:5010,会看到一些json数据,访问/get可以获得一个随机的代理ip,访问/all可以看到所有代理ip,/count看到代理的总数,/delete删除代理
说实话,我一开始没搞明白这个代理池的功能,也不知道代理的数量是固定的,甚至不知道/all可以显示所有的代理,以为是实时随机对那些免费代理去进行爬取,结果就搞出了一个乌龙,我甚至还去写了个异步爬取脚本对/get的内容去进行批量爬取一万条,最后发现好像去重以后就五十几条代理,代码如下,看个乐。
import asyncio
import aiohttp
import time
import os
start = time.time()
if not os.path.exists('proxy.txt'):
    f = open('proxy.txt', 'a')
else:
    os.remove('proxy.txt')
    f = open('proxy.txt', 'a')
proxy_ip = []
list_ip = []
async def request(session):
    resp = await session.get('http://192.168.31.143:5010/get', timeout=8)
    result = await resp.json()
    ip = result['proxy']
    print(ip)
    if ip in proxy_ip:
        pass
    else:
        proxy_ip.append(ip)
async def main():
    async with aiohttp.ClientSession() as session:
        task_list = []
        shu = 0
        while shu < int(jishu):
            req = request(session)
            task = asyncio.create_task(req)
            task_list.append(task)
            shu += 1
        await asyncio.gather(*task_list)
        end = time.time()
if __name__ == '__main__':
    jishu = input("请输入要爬取的代理数量(注意输入的数值会乘10,如果想爬取1000个请输入100,建议50,免费的代理大多重复):")
    for i in range(10):
        asyncio.run(main())
    print(f"去重完毕,还有{len(proxy_ip)}个地址,开始写入文件")
    for j in proxy_ip:
        f.write(j + '\n')
    print(f"写入完毕!!!\n总耗时:{round(time.time() - start,2)}秒")
    f.close()
用了一段时间才发现原来翻来覆去还是那几个代理,然后去详细看了下代理池的介绍才发现/all这个参数可以显示所有的代理。
于是幡然醒悟的我又编写了新的脚本来读取所有代理
import requests
import os
import random
# 检测proxy_http.txt是否存在,如果存在删除重新创建一个
if not os.path.exists('proxy_http.txt'):
    f = open('proxy_http.txt', 'a')
else:
    os.remove('proxy_http.txt')
    f = open('proxy_http.txt', 'a')
# 检测proxy_https.txt是否存在,如果存在删除重新创建一个
if not os.path.exists('proxy_https.txt'):
    f1 = open('proxy_https.txt', 'a')
else:
    os.remove('proxy_https.txt')
    f1 = open('proxy_https.txt', 'a')
# 请求服务器爬取所有代理ip
def request():
    url = "http://192.168.31.143:5010/all/"
    response = requests.get(url=url)
    response_text = response.json()
    for i in response_text:
        ip = i['proxy']
        http_true = i['https']
        if str(http_true) == 'True':
            ip = f'https://{ip}'
            globals()['https_num'] += 1
            f1.write(ip + '\n')
        else:
            ip = f'http://{ip}'
            globals()['http_num'] += 1
            f.write(ip + '\n')
if __name__ == '__main__':
    list = ['挟取笔端风雨,快写胸中丘壑,不肯下樊笼。\n大笑了今古,乘兴便西东。\n——张元干《水调歌头·赠汪秀才》', '抬眸四顾乾坤阔,日月星辰任我攀。\n——苏轼《失题》',
            '笔底烟云飞走,胸次乾坤吐纳,议论总纵横。\n——京镗《水调歌头·次卢漕韵呈茶漕二使》', '黄河落天走东海,万里写入胸怀间。\n——李白《赠裴十四》',
            '孰知不向边庭苦,纵死犹闻侠骨香。\n——王维《杂曲歌辞·少年行四首》', '自信人生二百年,会当水击三千里。\n——毛泽东《七古·残句》',
            '他日卧龙终得雨,今朝放鹤且冲天。\n——刘禹锡《刑部白侍郎谢病长告...》',
            '我欲穿花寻路,直入白云深处,浩气展虹霓。\n——黄庭坚《水调歌头·游览》', '出门一笑,月落江横,数峰天远。\n——张炎《烛影摇红·隔窗闻歌》', '一剑横空星斗寒,甫随平北复征蛮。\n——戚继光《题武夷》',
            '问近来,铛脚许何人,吾其一。\n——赵磻老《满江红·用前韵》', '三峡江声流笔底,六朝帆影落樽前。\n——米芾《望海楼》', '岂堪久蔽苍苍色,须放三光照九州。\n——杜荀鹤《山中对雪有作》',
            '好借食间前箸,尽吐胸中奇计,指顾静烟尘。\n——曾协《水调歌头·送史侍郎》', '十步杀一人,千里不留行。\n事了拂衣去,深藏身与名。\n——李白《杂曲歌辞·侠客行》']
    daying = random.choice(list)
    print('\n' + daying + '\n')
    print('开始爬取代理!!!')
    http_num = 0
    https_num = 0
    request()
    f.close()
    f1.close()
    print(f'爬取结束,http协议的代理有{http_num}个,https协议的代理有{https_num}个')这个事情告诉我们借用别人的项目一定要看清使用文档啊
行,这篇先写到这里,下个文章写下利用爬取到的代理去跑脚本
        
评论 (1)