python 多线程用 requests 抓网页的话,限制单位时间的总请求数有没有什么好的写法呢?

2015-02-03 14:42:50 +08:00
 snachx

RT,为了不给被抓页面造成太大压力或者说为了规避429 error,最合理的做法是什么呢?
几乎没怎么用过多线程,到处搜索没有找到看起来比较好的写法,求教。

6817 次点击
所在节点    Python
21 条回复
gateswong
2015-02-03 14:47:54 +08:00
http://bitbucket.gatesice.com/iit-cs579-project/src/f32486eb41571533d881a6a4d63fe97b10706c83/collector/timing.py?at=master

在这个基础上增加一个count统计这个时间段内访问了多少次就好了
KentY
2015-02-03 16:21:32 +08:00
这个要看人家服务器是怎么制定的ban规则吧,你的单位时间得在人家范围内。

我也曾有这个麻烦,后来去抓代理,built个代理池,先凑合顶着
mengskysama
2015-02-03 17:06:02 +08:00
goagent
ryd994
2015-02-03 17:46:35 +08:00
每个请求后加一个延时,然后反过来换算频率
snachx
2015-02-03 17:53:43 +08:00
@KentY
@mengskysama

我是想知道自己主动遵守限制具体应该怎么做,而不是说怎么绕过限制
snachx
2015-02-03 17:55:41 +08:00
@ryd994 每个请求加延时感觉只在单线程情况下有效吧?
snachx
2015-02-03 18:00:26 +08:00
@gateswong 其实不加count都行,我觉得只要有一个统一的manager来负责发请求,直接在manager里面限制就行了,可是不知道怎么在多线程情况下实现
ryd994
2015-02-03 18:07:35 +08:00
@snachx 多线程也可以啊,只要你线程数有限制。
平均一下差不多
mengskysama
2015-02-03 18:47:15 +08:00
@snachx 令牌桶,啊实现十来行代码?
zhwei
2015-02-03 18:58:33 +08:00
Redis
clino
2015-02-03 18:58:41 +08:00
线程池?
Sylv
2015-02-03 19:42:18 +08:00
count 加个锁
每次请求 count + 1
使 count 加到限制次数的线程进行延时,不释放锁
其它线程因为阻塞就一起延时了
延时线程延时结束后 count 置 0,释放锁
jecrdhs
2015-02-03 20:53:46 +08:00
抓网页是指下载页面中的某些信息还是全部?
ffffwh
2015-02-03 21:46:24 +08:00
“非计算密集的任务不要另开线程”。
单线程抓网页,这样控制请求频率很容易了。然后异步处理结果。
snachx
2015-02-03 21:49:15 +08:00
@jecrdhs 提取部分信息
ShiehShieh
2015-02-03 21:49:41 +08:00
可以试试使用协程代替线程,都能解决IO阻塞问题,而且理论上协程的内核开销更小。
Gevent,一个基于协程的网络库。
snachx
2015-02-03 21:53:02 +08:00
@clino 线程池只能控制同时请求的数量吧,如果每个线程非抓取任务的处理很快,还是会超。
clino
2015-02-03 21:59:28 +08:00
@snachx 要不就用一个网站一个线程的做法好了,这样线程这里可以自己控制频度如果频度太高就自己sleep下,如果怕开太多线程开销太大可以改用协程,开大量协程的开销比线程小很多
snachx
2015-02-03 22:00:50 +08:00
@Sylv 你说的这样好像可以,我去试一下
gateswong
2015-02-04 04:47:43 +08:00
@snachx 用multiprocessing

这个库里的Manager可以创建进程间的共享变量

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

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

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

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

© 2021 V2EX