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