RT,为了不给被抓页面造成太大压力或者说为了规避429 error,最合理的做法是什么呢?
几乎没怎么用过多线程,到处搜索没有找到看起来比较好的写法,求教。
1
gateswong 2015-02-03 14:47:54 +08:00
http://bitbucket.gatesice.com/iit-cs579-project/src/f32486eb41571533d881a6a4d63fe97b10706c83/collector/timing.py?at=master
在这个基础上增加一个count统计这个时间段内访问了多少次就好了 |
2
KentY 2015-02-03 16:21:32 +08:00 via Android
这个要看人家服务器是怎么制定的ban规则吧,你的单位时间得在人家范围内。
我也曾有这个麻烦,后来去抓代理,built个代理池,先凑合顶着 |
3
mengskysama 2015-02-03 17:06:02 +08:00
goagent
|
4
ryd994 2015-02-03 17:46:35 +08:00 via Android
每个请求后加一个延时,然后反过来换算频率
|
5
snachx OP |
7
snachx OP @gateswong 其实不加count都行,我觉得只要有一个统一的manager来负责发请求,直接在manager里面限制就行了,可是不知道怎么在多线程情况下实现
|
9
mengskysama 2015-02-03 18:47:15 +08:00
@snachx 令牌桶,啊实现十来行代码?
|
10
zhwei 2015-02-03 18:58:33 +08:00 via iPad
Redis
|
11
clino 2015-02-03 18:58:41 +08:00 via Android
线程池?
|
12
Sylv 2015-02-03 19:42:18 +08:00 via iPhone 1
count 加个锁
每次请求 count + 1 使 count 加到限制次数的线程进行延时,不释放锁 其它线程因为阻塞就一起延时了 延时线程延时结束后 count 置 0,释放锁 |
13
jecrdhs 2015-02-03 20:53:46 +08:00
抓网页是指下载页面中的某些信息还是全部?
|
14
ffffwh 2015-02-03 21:46:24 +08:00
“非计算密集的任务不要另开线程”。
单线程抓网页,这样控制请求频率很容易了。然后异步处理结果。 |
16
ShiehShieh 2015-02-03 21:49:41 +08:00
可以试试使用协程代替线程,都能解决IO阻塞问题,而且理论上协程的内核开销更小。
Gevent,一个基于协程的网络库。 |