用 Python 撸了个隧道代理程序,拿来给爬虫用,求 star,求提 bug。

2020-02-27 09:51:19 +08:00
 nozer

是这样的,去年写爬虫,被 IP 问题困扰,于是就想写个程序来自动处理代理 IP 的问题。

具体来说思路是这样的:

  1. 提供一个 TCP 服务端,用来接受爬虫发出的请求。
  2. 维护一个代理池,池中存放可用的代理地址。
  3. 服务端接收到爬虫的请求后,从代理池中随机选择一个可用代理,然后进行请求转发。
  4. 代理服务器返回数据后,再将数据返回给爬虫。

后来我就撸了个隧道代理程序,这个程序自动从某些提供代理的网页上获取可用代理,验证可用后放入代理池。

昨天我又重新改造了下,实现了简单的插件机制,试了下其实效果还可以的。不过质量还是受限于代理池中代理的质量。

发上来一方面是想求几个 star。 另一方面是想看看别人的想法,有没有其他质量更高的获取代理的方案。

项目地址:

https://github.com/daoye/goudan

https://github.com/daoye/goudan_plugins

具体用法就是

  1. 启动 main.py ,然后默认会监听本地 0.0.0.0:1991,1992,1993,1994 端口,这四个端口分别对应 http,https,socks4,socks5 协议类型的代理。
  2. 在爬虫程序上设置代理地址为: http://ip:1991 或 sock5:ip:1994 ... 就可以了。
2197 次点击
所在节点    Python
22 条回复
lhx2008
2020-02-27 09:55:44 +08:00
令人迷惑的轮子,玩玩还可以。用代理池最基本的需求就是并发爬取,被网站拉黑之后及时更换。
arcaitan
2020-02-27 10:07:09 +08:00
不怕被抓?
itskingname
2020-02-27 10:10:56 +08:00
实际上就是阿布云的做法。
nozer
2020-02-27 10:22:27 +08:00
@arcaitan 您这话说的,哪有不害怕的。但是你总不能刀的问题,就把生产菜刀的人都抓了吧。。
nozer
2020-02-27 10:26:25 +08:00
@itskingname 以前不知道,我刚才看了下,确实是一样的。
他这个价格跟其他卖 IP 的比起来也不算贵。
长见识了。我现在搞这个估计算是乞丐版。。。。
zhuyuefeng
2020-02-27 10:28:58 +08:00
考虑提供一个代理 ip 获取的接口,然后爬虫接入,这些并发爬取效率会好一些吗🤔
rekulas
2020-02-27 10:38:13 +08:00
我之前给团队项目也写过一个代理池,但不是通俗意义上的隧道代理,而是 web 代理 ,支持加密传输,请求的时候同时开 N 个并发随机获取 ip 一起请求,谁先拿到数据就返回谁,然后可以自定义成功标识符,例如可以定义包含"code":1 才为成功,如果不包含则请求的并发会认为请求失败重试,这样使用起来效果很好,已顺利跑了半年多
nozer
2020-02-27 10:38:20 +08:00
@zhuyuefeng 提供获取 IP 的接口当然是可以的。只是我的本意是封装 IP 切换的过程,让爬虫从切换 IP 的过程中解放出来。如果让爬虫通过接口获取 ip 列表,然后自行切换的话,就感觉有些麻烦了。
nozer
2020-02-27 10:40:52 +08:00
@rekulas 卧槽,大哥你这个思路靠谱,这样子可以增加成功率。 我现在困扰的问题就是代理的质量参差不齐,导致请求失败的概率高居不下。如果加上你这种方案的话,可以极大提高请求的成功率。
rekulas
2020-02-27 10:51:48 +08:00
@nozer 那你可以试试,我用这种方案基本不会遇到失败的情况,当然代理池后台也要加专门线程校验,剔除垃圾代理,按响应时间做排行
nozer
2020-02-27 10:57:36 +08:00
@rekulas 多谢提供思路,我近期看把这个功能加进去,最终效果肯定会好一大截。
zoikhemlab
2020-02-27 12:18:57 +08:00
代码都不带换行啊?
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
qile1
2020-02-27 14:21:52 +08:00
我想问下代理执行时间是怎么结算的,我想到的就是开始执行设置时间变量,结束设置结束时间变量,两个相减就出来时间了
nozer
2020-02-27 16:06:06 +08:00
@qile1 确实可以这样计算。从发起请求开始,到收到数据结束。
locoz
2020-02-27 23:53:59 +08:00
说实在的,免费代理的质量真不行...能用免费代理解决的一般也可以用云服务器按量付费开一批解决😂
yanheqi
2020-02-28 01:18:36 +08:00
请问这是 抓取 什么内容的?
nozer
2020-02-28 09:09:29 +08:00
@yanheqi 这个不是爬虫,这个是给爬虫用的隧道代理。它的作用是帮助爬虫随机更换 IP。
nozer
2020-02-28 09:11:15 +08:00
@locoz 道理我也懂,我就是想不花钱,还能把这事儿给办了。

其实目前这个版本有一定的可用性,但是用起来感觉不是特别好。等我用 @rekulas 大佬提供的方案再改造下,可用性应该就比较强了。
rekulas
2020-02-28 11:34:04 +08:00
@locoz 很多情形并不是开几台 vps 就能解决的,例如我有个业务每天需要 1w+ip,你需要开多少台才能满足需求?就算采用性价比最高的共享 IP 方案,每个 ip 每月成本也在 1 元左右,1w 个就是 1 万元,而且还无法保证每天的 ip 是不同的,而采用代理池方案,只需要微量成本(不到 100 元 /月),我就可以每天获得 1w-10w 的有效 ip 请求,至于响应时间平均大概 2s 左右,但我通过提高并发让请求效率得到保证(目前最高大概只有 20/s 左右因为足够了)
tunecccyyy
2020-03-02 01:53:14 +08:00
获取代理 高质量?很简单啊 自己扫描代理 IP 端口 然后自己自己写一个检测工具 成本也就是 100 来块钱

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647941

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX