Python3随爬虫启动代理池(引用外部Python代码项目并实现多进程并行执行)

最近在写某网站爬虫的过程中,遇到了异常访问封禁IP的问题。而且不只是爬虫访问会触发封禁,网页端一次浏览太多页面也会触发反爬保护。

为了解决这个问题,在Github上找到了一个不错的免费IP代理池程序,这个作者通过爬虫爬取了几个免费的IP代理源,并且定期循环对节点进行监测,删除失效代理,将有效代理存储于redis库中。而且,通过向本地特定端口发送请求,即可获取和操作本地IP代理池的代理,配置完成后非常方便。

然而,在使用过程中也发现,每次手动启动代理非常麻烦,所以就想在主爬虫进程启动前,先调用该代理池程序,在爬虫程序完成后,退出前再kill掉相关进程。

经过一段时间的尝试,发现使用subprocessmultiprocessing下的Process两个库可以较为方便地实现在程序内调用另一.py文件,并实现多进程并行,互补影响。

主要代码如下:

if __name__ == '__main__':
    print("启动IP代理池...")
    p_schedule = Process(target=subprocess.call, args=(['python', './ip_pool/proxyPool.py', 'schedule'],))
    p_schedule.start()
    time.sleep(2)
    p_server = Process(target=subprocess.call, args=(['python', './ip_pool/proxyPool.py', 'server'],))
    p_server.start()
    time.sleep(2)
    # ...后续爬虫程序
    # ...后续爬虫程序
    print('程序执行完毕,结束代理池')
    p_schedule.terminate()
    p_server.terminate()
    p_schedule.join()
    p_server.join()

这段代码首先调用了ip_pool中的proxyPool.py文件,启动IP代理池的调度程序,抓取代理源的可用代理,并存储于Redis;

随后,调用ip_pool中的proxyPool.py文件,启动IP代理池的webAPI服务,这样就可以在后续爬虫中方便地调用和切换代理;

执行爬虫相关代码,爬取所需数据;

爬虫结束后,需要使用terminate()方法终止掉两个Process对象,结束子进程,使用join()方法结束程序并退出。(此处需要注意terminate()join()调用的次序)

该方法不仅适用于爬虫,也适用于别的情况,如启动程序前启动数据库服务啊之类的,这里抛砖引玉,希望能给大家一点帮助^ _ ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值