2013-07-19 144 views
2

我試圖解開很多我在urlSet中使用的URL。以下代碼大部分時間都適用。但有時需要很長時間才能完成。例如,我在urlSet中有2950。 stderr告訴我2900完成了,但getUrlMapping沒有完成。python grequests需要很長時間才能完成

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 

回答

0

也許這不會幫助你,因爲它已經傳了很久,但仍然..

我是有要求,類似於您遇到的那些一些問題。對我來說,問題是,請求花了很長時間來下載一些頁面,但使用任何其他軟件(瀏覽器,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) 

工作太棒了!

相關問題