网上有 grequests 库 但是有限制 。只能把所有的 url 拉出来一起请求、 我们的项目里要请求各种 url 并且是在不同代码块儿。 做不到拉出来一块儿请求 请问各位 python 网络编程的大佬 能不能支支招。
梦想中的场景 -- > 像 requests 一样的简单 但是是异步的。(就开开玩笑)
1
Morriaty 2017-06-30 16:57:37 +08:00
本地单独起个 tornado 服务
每次都请求 localhost:10000/fetch/{ip}/,代码里用 AsyncHttpClient |
2
ldbC5uTBj11yaeh5 2017-06-30 16:57:59 +08:00
gevent + httplib2
|
3
BiggerLonger 2017-06-30 17:07:44 +08:00
直接 gevent spawn 然後 joinall 吧, 要不然直接 python3.6
|
4
tonghuashuai 2017-06-30 17:13:59 +08:00
gevent celery 都可以解决
|
5
Kilerd 2017-06-30 17:30:14 +08:00
在异步的前提下用 aiorequests
|
6
dbow 2017-06-30 17:34:45 +08:00
要不试试我的库 https://github.com/maliubiao/simple_http
还能控制并发量, 超时时间 ### 异步方式 ```shell In [21]: def print_it(x): import pprint ....: pprint.pprint(x) ....: In [22]: async_http.repeat_tasks([{"url": "http://www.baidu.com", "parser": print_it}]) {'chain': None, 'chain_idx': 0, 'con': <socket._socketobject object at 0x2812bb0>, 'fd': 5, 'header_only': False, 'parser': <function print_it at 0x283da28>, 'proxy': '', 'random': '60804c2a0b053fbd', 'recv': <cStringIO.StringO object at 0x283a3e8>, 'redirect': 0, 'res_cookie': {'BAIDUID': {'domain': '.baidu.com', 'expires': 'Thu, 31-Dec-37 23:55:55 GMT', 'max-age': '2147483647', 'path': '/', 'value': 'BCB0BBBB4312D00C88BCDC9EEAAE3726:FG=1'}, 'BD_LAST_QID': {'Max-Age': '1', 'path': '/', 'value': '16069052107084303783'}, 'BIDUPSID': {'domain': '.baidu.com', 'expires': 'Thu, 31-Dec-37 23:55:55 GMT', 'max-age': '2147483647', 'path': '/', 'value': 'BCB0BBBB4312D00C88BCDC9EEAAE3726'}}, 'res_header': {'Connection': 'Keep-Alive', 'Content-Length': '215', 'Content-Type': 'text/html', 'Date': 'Thu, 21 May 2015 15:50:43 GMT', 'Location': 'https://www.baidu.com/', 'P3P': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=BCB0BBBB4312D00C88BCDC9EEAAE3726:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nBIDUPSID=BCB0BBBB4312D00C88BCDC9EEAAE3726; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nBD_LAST_QID=16069052107084303783; path=/; Max-Age=1', 'X-UA-Compatible': 'IE=Edge,chrome=1'}, 'res_status': {'message': 'Moved Temporarily', 'protocol': 'HTTP/1.1', 'status': 302}, 'retry': 0, 'send': <cStringIO.StringO object at 0x25fb8f0>, 'ssl': False, 'start': 1432223278.489937, 'status': 512, 'text': '<html>\r\n<head><title>302 Found</title></head>\r\n<body bgcolor="white">\r\n<center><h1>302 Found</h1></center>\r\n<hr><center>pr-nginx_1-0-221_BRANCH Branch\nTime : Wed May 20 10:35:46 CST 2015</center>\r\n</body>\r\n</html>\r\n', 'url': 'http://www.baidu.com'} async_http Thu May 21 23:47:58 2015: 'acnt: 1, fcnt: 0, time: 0' ``` |
7
AnyISalIn 2017-06-30 17:39:46 +08:00 via iPhone
要么用多线程,要么用协程咯
|
8
kkeybbs 2017-06-30 17:45:11 +08:00 via Android
如果同一个域名的比较多,再用上连接池特性来加速
|
9
takato 2017-06-30 17:55:22 +08:00
看看 treq 这个包?
|
10
yov123456 2017-06-30 18:37:12 +08:00 via iPhone
request_future ?
|
11
ryd994 2017-06-30 20:37:42 +08:00
gevent monkey patch 试试?
|
12
libook 2017-06-30 23:22:43 +08:00 via Android
去状态化+分布式负载均衡
|
13
nightstart OP @Morriaty 哇 真的是好想法....崭新的思路!
|
14
Ge4Los 2017-07-01 01:10:27 +08:00
如果后端是 url 是同一个域名的,用 requests 的 session 长连接,性能会快一点点。
要不然就用 gevent 和 celery |
15
lxml 2017-07-01 08:49:54 +08:00 via Android
@Ge4Los 实测这个真是聊胜于无,感觉就是每次帮你把 cookie 自动带上的语法糖而已,可能是我使用的方式不对,如果知道具体运作原理还请指教。
|
16
wwqgtxx 2017-07-01 09:36:12 +08:00 via iPhone
@lxml 你要是开启过 debug 日志的话就知道如果是同一个 session 下会保持 keepalive,不会每次访问一个 url 都重新开一个新的短链接
|
18
Ge4Los 2017-07-01 11:02:50 +08:00
@lxml requests 的 session 不仅仅是 cookie 保存。 还有个特性是 keepalive 长连接,不用每次都重新建立 tcp 连接。
|
19
110male 2017-07-01 13:08:22 +08:00
少年,请起,站起来吧
|
20
Huozic 2017-07-01 16:52:38 +08:00
requests 的 session 是 keepalive 的,通过传递 session 的方式可以多个请求共享 TCP 连接。
其次,文档就有提到: http://docs.python-requests.org/en/master/user/advanced/#blocking-or-non-blocking 最后,现在问 Python 的问题已经不用带上 Python 的版本了吗???🤔 |
21
PythonAnswer 2017-07-01 22:01:53 +08:00 via Android
requests 周边生态是 23 兼容的
|
22
nightstart OP @110male 本来跪一下就想起来了 但是看到这么多大神的回复以后。 我已经起不来了
|