Python: requests.get, 在循环中迭代URL

12
我试图通过在for循环中迭代requests.get(url)来从stats.nba.com获取信息,其中url在每次迭代时更改。 如果我只迭代一次它可以工作,但两次或更多似乎会出现错误,我不确定为什么。 我是新手所以任何信息都有帮助。 提前致谢。 这是我的代码:
import requests
import json

team_id = 1610612737

def get_data(url):
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        return data
    else:
        print(response.text)
        print(response.status_code)

for i in range(30): # 30 NBA Teams
    base_url = "http://stats.nba.com/stats/teamdetails?teamID="   
    team_url = base_url + str(team_id)
    data = get_data(team_url)

    ## Do stuff ##

   team_id +=1

如果我使用'for i in range(1):',它可以正常工作,但是如果范围大于1,每次迭代都会得到状态码400。感谢您的帮助!


1
有时候我甚至无法通过浏览器获得结果,需要多次刷新页面。到目前为止,我所达到的最远程度是 range(4) - Bahrom
即使使用range(1)或任何ID,我也无法获得可重复的结果。在我的端上似乎相当随机。 - Alex Huszagh
1个回答

10

网站限制每秒请求数,因此您需要包含特定的请求头或在脚本中加入延迟(前者是两种方法中最快且可能最可靠的选项)。

请求头方法:

'''
add under team_id = 1610612737
'''

HEADERS = {'user-agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)'
                          'AppleWebKit/537.36 (KHTML, like Gecko)'
                          'Chrome/45.0.2454.101 Safari/537.36'),
                          'referer': 'http://stats.nba.com/scores/'}

然后将此内容添加到您的响应get中:

response = requests.get(url, headers=HEADERS)

如果您使用此方法,就不需要在脚本中添加延迟。

延迟方法:

import time
time.sleep(10) # delays for 10 seconds (put in your loop)

看起来使用延迟可能会成功,但我不建议除非绝对必要。


啊,是的,这一定就是了 - 我之前尝试使用3秒的延迟但没有帮助。 - Bahrom
@Bahrom:哦,我的错,我没有注意到...非常感谢你的点赞! - l'L'l
1
没问题,非常好的答案 :D - Bahrom
谢谢!headers方法对我有用,但delay方法没用。非常感谢! - pl0222

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接