python 爬虫释放资源相关问题

2016-01-02 15:30:48 +08:00
 fsd010
最近在学习 python 爬虫,写了个爬虫针对服务接口进行请求获取数据(单线程),在请求 1000+次之后服务器资源没有响应数据了,提示服务器连接池均在使用中;是使用 requests 库, post 方法请求之后将请求的内容保存成文件。求解求解
3451 次点击
所在节点    Python
8 条回复
imn1
2016-01-02 15:37:55 +08:00
你先看看这边的机器是否也有大量连接没释放
1000+单线程,很少了,我觉得服务器限制的可能性更大
fsd010
2016-01-02 15:47:21 +08:00
@imn1 服务器那边无法接触到,这边代码上也没有做保持连接的做法,就默认 requests.post 就在这样
imn1
2016-01-02 15:50:10 +08:00
@fsd010
不是审视代码,是在路由器或者其他工具,看看连接数
ratazzi
2016-01-02 16:16:53 +08:00
requests.post 这种用法就是没有使用连接池,并且没有断开,每次新开一个连接
fsd010
2016-01-02 16:42:12 +08:00
@imn1 刚刚试验下, ctrl+c 没有中断连接,还保持,重启进程链接流量继续传输,可能传输的容量有限制,循环累积下很大就报错,线程不多就一个
fsd010
2016-01-02 16:43:23 +08:00
@ratazzi 那是得每次请求后中断连接?还是指一个进程就一个链接?
Daniel65536
2016-01-02 16:53:17 +08:00
用 session , requests.Session()自带连接池,连接复用等等功能。
The Session object allows you to persist certain parameters across requests. It also persists cookies across all requests made from the Session instance, and will use urllib3 ‘ s connection pooling. So if you ’ re making several requests to the same host, the underlying TCP connection will be reused, which can result in a significant performance increase (see HTTP persistent connection).

s = requests.Session()
s.get('http://example.com/aaa')
s.get('http://example.com/bbb')
s.get('http://example.com/ccc')

这么用下去就好,方法、参数和 requests 一样。
fsd010
2016-01-02 17:21:19 +08:00
@Daniel65536 我问一下哈~如果按我原来的写法 requests.post 循环 1000 次,就建立 1000 个链接?如果采用 session 的方法可以复用链接不需重新建立连接?

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

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

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

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

© 2021 V2EX