【问题标题】:Python grequests takes a long time to finishPython grequests 需要很长时间才能完成
【发布时间】:2013-07-18 13:39:49
【问题描述】:

我正在尝试对 urlSet 中的许多 URL 进行缩短。以下代码大部分时间都有效。但有时需要很长时间才能完成。例如,我在 urlSet 中有 2950。 stderr 告诉我 2900 完成了,但是 getUrlMapping 没有完成。

def getUrlMapping(urlSet):
# get the url mapping
urlMapping = {}
#rs = (grequests.get(u) for u in urlSet)
rs = (grequests.head(u) for u in urlSet)
res = grequests.imap(rs, size = 100)
counter = 0
for x in res:
    counter += 1
    if counter % 50 == 0:
        sys.stderr.write('Doing %d url_mapping length %d \n' %(counter, len(urlMapping)))
    urlMapping[ getOriginalUrl(x) ]  =   getGoalUrl(x) 
return urlMapping

def getGoalUrl(resp):
url=''
try:
    url = resp.url
except:
    url = 'NULL'
return url

def getOriginalUrl(resp):
url=''
try:
    url = resp.history[0].url
except IndexError:
    url = resp.url
except:
    url = 'NULL'
return url

【问题讨论】:

    标签: python python-requests


    【解决方案1】:

    它可能对你没有帮助,因为它已经过去了很长时间,但仍然......

    我在请求方面遇到了一些问题,类似于您遇到的问题。对我来说,问题是 Requests 需要很长时间才能下载一些页面,但是使用任何其他软件(浏览器、curl、wget、python 的 urllib)一切都很好......

    在浪费了很多时间之后,我注意到服务器正在发送一些无效的标头,例如,在“慢”页面之一中,在Content-type: text/html 之后它开始以Header-name : header-value 的形式发送标头(注意冒号前的空格)。这以某种方式破坏了 Python 的 email.header 用于通过请求解析 HTTP 标头的功能,因此 Transfer-encoding: chunked 标头没有被解析。

    长话短说:在请求内容之前手动将 chunked 属性设置为 Response 对象的 True 解决了问题。例如:

    response = requests.get('http://my-slow-url')
    print(response.text)
    

    花了很长时间,但是

    response = requests.get('http://my-slow-url')
    response.raw.chunked = True
    print(response.text)
    

    效果很好!

    【讨论】: