狗蛋是一个用Python实现的隧道代理程序,接下来我们来看看该用什么样的姿势来使用它。
狗蛋可以开箱即用,它已经集成了部分免费代理(从互联网上获取的公开代理)。
项目名称:goudan(狗蛋)
项目地址:https://github.com/daoye/goudan
用途
在需要随机切换代理的场景下都可以使用。
比如,爬虫爬取某些网站时需要随机更换访问网站的IP,以防止网站将您的爬虫列入黑名单。
通常的做法是爬虫自己维护了一个代理池,在爬虫爬取目标页面时,随机从池中选取一个代理并使用该代理访问目标网站。
这种方法是可行的,不过美中不足的是每个爬虫都需要自己去维护一套代理池,虽然不困难但也挺麻烦。
狗蛋的作用是,将维护代理池这些工作从爬虫中剥离出来,由一个独立的程序来维护这些代理,爬虫只需要设置一个代理:即狗蛋的服务地址就可以了,狗蛋在截获到流量之后,随机从池中选取一个代理并将流量转发出去,这样爬虫就可以专注于自己的业务,而不再需要关注这些琐碎的事情了。
狗蛋的架构
架构图
Dispatcher:核心角色,负责运行Spider,并协调Spider、Pipline、Pool这三个组件进行工作。
Rproxy:核心角色,负责流量转发。
Pipline:处理程序内部的数据流转、协调中间件的调用。
Middleware:挂接在Pipline上,处理由Pipline传输过来的数据。
Proxy Pool:代理池,用来存储可用的代理。
Spider:爬虫,用来从网页(或其它地方)获取代理。
用法
通过Docker运行(推荐)
以默认参数运行:
使用自定义的参数运行:
查看帮助:
通过源代码运行(需要python3.7)
推荐使用virtualenv创建一个虚拟环境,并在该虚拟环境下运行狗蛋。
狗蛋默认运行在1991号端口上、选用可以同时支持http和https的代理。
狗蛋启动一段时间以后(通常只需要30秒左右),你可以通过命令来验证是否可以开始正常使用。
使用时只需要将代理地址设置为:,就可以达到不断更换IP的目的了。
创建自定义的Spider
如果你已经有一些可用的代理,并且想把这些代理加入代理池,那么你需要通过编写一个自定义的Spider来实现,示例:
在“Spiders”目录中,创建一个名为”mySpider.py”的文件,文件内容如下:
这个Spider没有去爬取任何一个网站,而是直接返回了一个包含代理地址的数组字典。
然后打开“setting.py”这个文件,找到变量“spiders”,将自定义的spider加入该数组中即可,狗蛋在启动后会自动加载“spiders”中配置的爬虫,然后定期运行它们。
再来看一个复杂一些的例子:
这个Spider将会从某个网站上去获取代理,因此它声明了它需要访问的目标地址(通过urls变量定义),基类BaseSpider封装了网络访问的相关细节,因此MySpider只需实现函数,从返回的内容中解析出可用的代理地址就可以了。
如果你想自己实现网络访问的相关操作,那么也可以不从BaseSpider继承,只需要定义一个run方法就行,run方法的原型为:
属性“idle”定义了爬虫休息的间隔(默认的,Dispatcher会每隔一分钟运行一下所有的爬虫,对于某些网站来说太过频繁的访问可能会导致被ban掉),你可以通过这个属性来定义爬虫两次运行期间的时间间隔,单位是分钟。
每一项代理都用一个字典表来描述,它包含下面这些属性:
host: 代理的Ip地址。
port: 代理的端口,必须是一个整数。
type: 代理类型,可选值有:http, https, http/https,socks,如果你不知道是什么类型可以设置成“http”。
loc: 代理所在区域,暂时没有用上。不过,在下一个版本里面实现不同区域使用不同的代理时会用上。
提示
狗蛋的代理池(即所有可用代理的集合)来源于公开的免费代理,这些代理的质量参差不齐。时效性也有很大限制。即便狗蛋在获取到这些代理之后进行了可用性验证,也无法保证存在于池中的代理在任何一个时刻都是可用的。
程序启动后,要等到爬虫至少获取一个可用代理之后才可以正常使用。
代理池没有进行持久化存储,因为这些代理的时效性都非常短暂,完全没有持久化的价值,目前的策略是:定期重新爬取、定期对池中的代理进行验证并剔除不可用代理。
领取专属 10元无门槛券
私享最新 技术干货