3

我正在尝试缩短 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
4

1 回答 1

1

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

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

在浪费了很多时间之后,我注意到服务器正在发送一些无效的标题,例如,在一个“慢”页面中,Content-type: text/html它开始以表单形式发送标题Header-name : header-value(注意冒号前的空格)。这以某种方式破坏了 Pythonemail.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)

工作得很好!

于 2015-08-11T02:36:33.477 回答