为爬虫构建代理池

2016-07-15 18:10:31 +08:00
 tikazyq

为了避免爬虫被封 IP ,网上搜索教程说需要建立代理池。但是付费代理都好贵。。。不过好在网上已经有不少免费提供代理的网站了。因此,我打算写个爬虫去获取这些免费 IP ~

策略

难点

  1. 如何去验证维护这些代理地址
  2. 如何知道哪些代理地址适合哪些网站(可用性,响应时间)
  3. 效率问题(之前写过简单的验证脚本,但是效率非常低)

小伙伴们有不有什么好的办法能解决这些问题呢?

13765 次点击
所在节点    Python
49 条回复
techmoe
2016-07-15 22:57:54 +08:00
tor 这个东西有时候感觉真的挺好的 虽然有点杀鸡总宰牛刀的感觉
py 端想控制 tor 可以用 stem 这个库
遗憾的是我暂时没找到在同一环境下开两个 tor tunnel 的办法,拿 stem 的 process 相关方法开启一个再开第二个死活打不开,不知道为什么
Arnie97
2016-07-15 23:14:36 +08:00
如果只是需要不同 IP ,可以通过 PPPoE 重新拨号换 IP
alexapollo
2016-07-15 23:22:11 +08:00
做的时候你会发现很多问题的, LOL
loalj
2016-07-15 23:43:20 +08:00
我最近也在研究这个代理池的问题,写了一个动态管理代理池的程序。 schedule 每隔一段时间去验证代理池中各个 ip 响应时间,计算权重,存到数据库里边。当有 request 进来的时候根据权重值去分配代理,将请求转发给代理。这就相当于在本地开启了一个代理,上游是代理池。

```
requests.get(url, proixes={"http": "http://127.0.0.1:8399"})
```
[github]( https://github.com/loadlj/rzproxy)
代码还在完善中,欢迎一起改进 :)
tikazyq
2016-07-16 00:48:41 +08:00
@loalj 似乎可以作为验证代理的方案~明天空了测试一下
tikazyq
2016-07-16 00:49:16 +08:00
@spikeLIN 有不有什么方法可以借鉴一下嘛?~
tikazyq
2016-07-16 00:52:08 +08:00
@UnisandK 赞👍!感觉是个解决方案,稍微看了一下不是很懂,还需要研究一下~
tikazyq
2016-07-16 01:02:21 +08:00
@techmoe 有不有什么教程可以参考学习一下嘛?
hard2reg
2016-07-16 04:09:55 +08:00
这种事我做过。。。自动挑选出最优的 IP 。。。但是大多数都没卵用,真正能用的没多少,楼主还是放弃吧
g079708
2016-07-16 05:19:43 +08:00
进来学习一下。
kslr
2016-07-16 05:28:26 +08:00
@loalj

性能如何呢?我在考虑用 go 写一套扫描和检查
RqPS6rhmP3Nyn3Tm
2016-07-16 05:50:52 +08:00
如果对速度没啥要求, Tor 真的挺不错的
techmoe
2016-07-16 08:35:19 +08:00
h4x3rotab
2016-07-16 09:08:54 +08:00
用 tor 爬数据对其他用户非常不负责任,如果我发现了这种 ip 池,我会想办法把里面的 ip 找出来然后公布代理黑名单,允许各网站把这些 ip 全 ban 掉
facat
2016-07-16 09:55:50 +08:00
@tikazyq
@hansnow
用多线程可以把带宽用慢。遇到缓存之类的也没办法,这个方法不能保证检查的代理 100%可用。
kohnv
2016-07-16 10:14:35 +08:00
https://github.com/kohn/HttpProxyMiddleware
针对网上的免费代理做的代理池, 解决了 lz 难点中的第一点.
kohnv
2016-07-16 10:16:12 +08:00
不好意思 说到爬虫想当然以为是 scrapy 了.
kohnv
2016-07-16 10:30:42 +08:00
说说当时遇到的一些问题和解决方案吧.

1. 验证代理可不可用可以用这个代理去抓取某个很短的网页, 例如我当时是从百度主页随便找了一个 ajax 请求的 URL, 然后比较爬到的内容是不是正常. 这样可以剔除掉不可用的代理, 并把可用的加到代理池中. 这里所谓的不可用其实有多种可能, 例如超时, 返回 501 等异常状态码, 返回广告页面等. 光测试 ip 响应时间是不行的, 只能检查到超时的情况. 这样做确实验证的速度很慢, 但是实际运行过程中好几小时才需要抓取新代理, 然后验证, 因此对吞吐量的影响并不大. 这里的前提是只在加入到代理池时验证一次, 在使用过程中不再定期验证, 否则的话会极大的影响效率.

2. 网上的免费代理有效时间不长, 例如刚刚验证过能用的代理, 可能过了十几分钟不能用了. 所以哪怕是经过了验证的代理也仍然是不能完全信任的, 代理池中需要在发现代理不能用的时候剔除不可用的代理. 如何发现代理不能用其实是个问题, 对于超时, 501 等状态码可以再代理池中检查, 但是有些代理返回广告页面, 那么代理池在不知道用户想爬什么内容的情况是无法分辨取到的 response 是正常的还是代理返回的广告. 因此这里需要有爬虫在 parse 过程中发现异常之后主动通知代理池代理不可用. 当然你也完全可以假设, 通过第一步中验证的代理哪怕不可用了也只是超时, 不会出现刚开始可用, 后来返回广告这种情况.

3. 有些代理会缓存页面, 导致爬到的内容是旧的, 这个目前我也没想到办法. 不过好在我爬的页面不会频繁更新, 爬到过期的数据也无所谓.
lynnworld
2016-07-16 12:08:20 +08:00
有一种主机叫拨号主机, ip 被封重新拨号就好。网上搜,很多的
qdk0901
2016-07-16 13:06:55 +08:00
用 tor ,贴个我试验过的 nodejs 版,还不错。能应付一小时一个 ip 只能访问 60 次的限制
http://transing.xyz/2016/05/12/using-tor-for-crawler/

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

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

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

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

© 2021 V2EX