如何成为一个合格的代理池

其实,在github上我们可以找到好多代理池,说白了都不知道是第几手数据了,都是爬取多个网站然后进行数据清洗,或redis或存库或flask实现http的api,但是,笔者需求很单纯,每日几百个稳定代理即可,然而即使榜首的7Kstar也未能满足笔者的需求,算咯,自己来吧。

经常写爬虫用代理池的小伙伴应该也清楚免费代理的质量之低,首先推荐个大佬的代理服务,而本次的代理池也基于它去完成的。

http://ip.jiangxianli.com

那么开始我们今天的主题,如何成为一个合格的代理池!


代理存活检测模块

def alive(url):
    proxy = {'http': url.replace('https', 'http'),
             'https': url.replace('http', 'https')
             }
    try:
        print("当前检测代理:{}".format(url))
        r = requests.get('https://www.baidu.com/',proxies=proxy,headers=headers,timeout=3)
        if r.status_code==200:
            return 200
    except:
        pass

我们可以借助常见的网站去尝试代理访问来判断代理是否存活,但有些代理可以访问百度但不一定可以访问你的目标站点,所以可以根据自己的需求变更存活检测规则。

数据获取与处理模块

数据获取模块采用了我们刚刚推荐的站点,而且它的机制是每隔10s会刷新一边数据,棒呆!我们根据这个特性每隔十秒获取一次数据。

def getinfo():
    try:
        response1 = requests.get(url1, headers=headers)
        response2 = requests.get(url2, headers=headers)
        response3 = requests.get(url3, headers=headers)
        r=(response1.text+response2.text+response3.text).replace('\n','').replace('\t','').replace(' ','')
        res = re.findall('<buttonclass="btnbtn-smbtn-copy"data-url="(.*?)"', r)
        return res
    except:
        print('网络不稳定,摸鱼ing......')

数据存储模块会对返回结果进行存活判断,然后将有用数据丢到了一个临时文件,为什么要加这一层过渡呢?当然是让它承担日志功能与去重前备份。

def saveinfo(i,q):
    if alive(i):
        print('获得有效代理:{}'.format(i))
        fa=open('proxiestmp.txt','a')
        fa.write(i+'\n')
        fa.close()
    else:
        pass
    q.put(i)

数据梳理模块我们根据刚刚的临时文件进行set处理去重。

def setinfo():
    fw=open('proxies.txt','w')
    fw.writelines(set(open('proxiestmp.txt','r').readlines()))
    fw.close()

最后当然是一个多进程并发的调度,为什么要加入多进程?不是会sleep10s等待么?我们需要考虑到一次拿到数据后存活判断的耗时,如果这10s内没有完成存活检测(因为代理的质量原因网络延时是一定存在的)就会对下次请求造成延误,所以我们的多进程并发就是针对的代理存活检测模块,保证每10s一个单位时间内如期完成任务。

#进程池管理模块
def poolmana(res):
    p = Pool(30)
    q = Manager().Queue()
    for i in res:
        p.apply_async(saveinfo, args=(i,q,))
    p.close()
    p.join()

数据清洗模块

为什么要数据清理,因为一段时间不用,代理极有可能死掉了,那就重新再检测一遍存活咯。

def wash(i,q):
    if alive(i):
        fw = open('proxies.txt', 'a')
        fw.write(i + '\n')
        fw.close()
    q.put(i)

这种东西,谁愿意等呢,多进程安排~

#进程池管理模块
def poolmana(res):
    p = Pool(10)
    q = Manager().Queue()
    print('代理池数据清洗开始......\n耗时取决于当前代理池大小......\n请耐心等待......')
    for i in res:
        i=i.replace('\n','')
        p.apply_async(wash, args=(i,q,))
    p.close()
    p.join()

考虑到某些不可描述的以为,在数据清洗前会帮你们做个备份啦,另外还会重新从临时文件去重一次,防止遗漏。

def run():
    setinfo()
    fr=open('proxies.txt','r+')
    res=fr.readlines()
    fr.truncate()
    fr.close()
    fc=open('proxiesback.txt','w')
    fc.writelines(res)
    fc.close()
    poolmana(res)
    print('代理池清洗完毕......')

API接口

哼哼,希望大家想起它的时候,会认为我做的是轮子而不是成品,所以额外开发了个接口供其它平台调度,将会返回一个极高质量的代理列表。

def run():
    fr=open('proxies.txt', 'r')
    read=fr.readlines()
    fr.close()
    res=[]
    for i in read:
        r=i.replace('\n','')
        res.append(r)
    return res

运行展示

是的,默认采集600次,大家根据自己的需求调整就是。

  ____      _     ____                _
 / ___| ___| |_  |  _ \ _ __ _____  _(_) ___  ___
| |  _ / _ \ __| | |_) | '__/ _ \ \/ / |/ _ \/ __|
| |_| |  __/ |_  |  __/| | | (_) >  <| |  __/\__ \
 \____|\___|\__| |_|   |_|  \___/_/\_\_|\___||___/

                        By Tide_RabbitMask | V 1.0

代理池拓展开始......
预计等待时间100分钟......
预计采集有效去重代理数量600-600000+......

当前第1次采集
当前检测代理:http://127.0.0.1:80

跑出的结果以日志形式存放在tmp文件,然后去重后存入proxies.txt。

然后,使用刚刚的api模块调用即可,这毕竟是个轮子,如果你想的话,花五分钟丢flask做个http接口亦可,而我这里的需求是用来给爬虫平台做调度的,所以如此设计。

GetProxies项目地址:
https://github.com/rabbitmask/GetProxies

那么,玩的开心。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345