Запросы Python занимают много времени, чтобы закончить

Я пытаюсь сократить множество URL-адресов, которые у меня есть в urlSet. Следующий код работает большую часть времени. Но иногда это занимает очень много времени, чтобы закончить. Например у меня 2950 в urlSet. 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

person gstar2002    schedule 19.07.2013    source источник


Ответы (1)


Возможно, это вам не поможет, так как прошло много времени, но все же..

У меня были некоторые проблемы с запросами, подобные тем, которые у вас есть. Для меня проблема заключалась в том, что запросы загружали некоторые страницы целую вечность, но при использовании любого другого программного обеспечения (браузеры, curl, wget, urllib python) все работало нормально...

Потратив ОЧЕНЬ много времени, я заметил, что сервер отправляет некоторые неверные заголовки, например, на одной из «медленных» страниц, после Content-type: text/html он начал отправлять заголовок в виде Header-name : header-value (обратите внимание на пробел перед двоеточием). Это каким-то образом нарушает функциональность email.header Python, используемую для анализа заголовков HTTP запросами, поэтому заголовок Transfer-encoding: chunked не анализировался.

Короче говоря: ручная установка свойства chunked на True объектов Response, прежде чем запрашивать содержимое, решила проблему. Например:

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

потребовались годы, но

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

работал отлично!

person llekn    schedule 11.08.2015