2017-03-17 92 views
2

下面是與自己相關的代碼的最高位:閱讀JSON文件有時工作,有時不工作(Python)的

url1 = "https://www.reddit.com/r/todayilearned/new/.json" 
response = urllib.urlopen(url1) 
data = json.loads(response.read()) 
tiloriginal = [] 

    for post in data["data"]["children"]: 
     tilfact = post["data"]["title"] 

那麼奇怪的是,我的代碼工作正常。但我想喜歡的2/5時間,它給了我下面的錯誤:

for post in data["data"]["children"]: 
KeyError: 'data' 

當我運行該腳本,雖然再次,它工作正常。但是當我再次運行它時,它會再次出現錯誤。

這是完全相同的代碼正在運行每一次,但只有有時它是否給我這個錯誤。

任何幫助,爲什麼這是這種情況?我的代碼有問題嗎?我的互聯網?

+0

也許你查詢服務器的那一刻,那個服務器把你的迴應弄錯了,首先檢查它是否爲200好,然後檢查數據是否存在於字典中 – MrJomp

回答

2

您應該經常檢查響應代碼。

In [44]: url1 = "https://www.reddit.com/r/todayilearned/new/.json" 

In [45]: requests 
Out[45]: <module 'requests' from '.../env/lib/python3.6/site-packages/requests/__init__.py'> 

In [46]: requests.get(url1) 
Out[46]: <Response [429]> 

In [47]: requests.get(url1) 
Out[47]: <Response [200]> 

In [48]: requests.get(url1) 
Out[48]: <Response [200]> 

In [49]: requests.get(url1) 
Out[49]: <Response [429]> 

In [50]: 

在這裏,你可以看到有一些200的(成功)和一些429的(太多請求)。

如果使用請求第三方lib下,這是很容易:

In [52]: r=requests.get(url1) 

In [53]: r 
Out[53]: <Response [429]> 

In [54]: r.status_code 
Out[54]: 429 

所以,你會做什麼,然後就是一個while循環,檢查(說)3倍或5倍?

喜歡:

r = requests.get(url1) 
status_count = 0 
while r.status_code == 429 and status_count < 3: 
    r = requests.get(url1) 
    status_count += 1 

例如

(我只檢查429 - 在這種情況下,太多的要求,因爲我不想掩蓋其他代碼,如404或500等)

噢,還有一件事 - 考慮到這些是429的 - 在這個while語句的開頭放置一個import time; time.sleep(1)類型的東西可能很明智。

+0

你能解釋一下In [46] Out [46]事情好嗎?我是新來的:你是否把它寫入你的代碼? – chemo

+0

不,這是終端的輸出。我使用了一個ipython終端 - 這是非常方便的。它有像Tab完成和其他漂亮的功能,使生活作爲開發者更容易,你可以通過安裝ipython來安裝ipython(如果你已經安裝了pip),如果你不確定pip是什麼,那就問。 –