Python 3:Urllib给出403错误消息

Python 3:Urllib给出403错误消息,python,python-3.x,beautifulsoup,urllib,Python,Python 3.x,Beautifulsoup,Urllib,我想运行一个我不久前创建的Python3程序,它从某个人的特定zipcode从网站检索天气。几个月前我尝试它时,它工作得非常好,但现在我收到一条URLLIB403错误消息 我得到一些建议,有人告诉我该网站不再接受机器人 我的整个项目是这样的: from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as soup # asks about zipcode print("What is your (vali

我想运行一个我不久前创建的Python3程序,它从某个人的特定zipcode从网站检索天气。几个月前我尝试它时,它工作得非常好,但现在我收到一条URLLIB403错误消息

我得到一些建议,有人告诉我该网站不再接受机器人

我的整个项目是这样的:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

# asks about zipcode
print("What is your (valid) US zipcode?")

# turns zipcode into a string
zipcode = str(input())

# adds zipcode to the URL
my_url = 'https://weather.com/weather/today/l/' + zipcode + ':4:US'

#Opening up connection, grabbing the page.
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, "html.parser")

# grabs the temp
weather_data = page_soup.find("div", {"class":"today_nowcard-temp"})

# prints the temp without the extra code
print(weather_data.text)
然后,我被告知在打开连接之前插入以下内容:

headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0'}
这没用

我的错误是403错误。这是全部信息:

Traceback (most recent call last):
  File "c:/Users/natek/Downloads/Test.py", line 14, in <module>
    uClient = uReq(my_url)
  File "C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
回溯(最近一次呼叫最后一次):
文件“c:/Users/natek/Downloads/Test.py”,第14行,在
uClient=uReq(我的url)
urlopen中的文件“C:\Users\natek\AppData\Local\Programs\Python\37\lib\urllib\request.py”,第222行
返回opener.open(url、数据、超时)
文件“C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第531行,处于打开状态
响应=方法(请求,响应)
文件“C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第641行,在http\U响应中
“http”、请求、响应、代码、消息、hdrs)
文件“C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”第569行出错
返回自我。调用链(*args)
文件“C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第503行,在调用链中
结果=func(*args)
文件“C:\Users\natek\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第649行,默认为http\u error\u
raise HTTPError(请求完整的url、代码、消息、hdrs、fp)
urllib.error.HTTPError:HTTP错误403:禁止

我有点不知所措,需要一些帮助。我应该完全选择一个新网站吗?

从你的话来看,这个网站不接受缺少某种身份验证技术的请求。在快速请求日志中,我可以看到发出了以下请求:

https://api.weather.com/v3/location/search?apiKey=d522aa97197fd864d36b418f39ebb323&format=json&language=en-US&locationType=locale&query=[SOMETHING I TYPED]
如果分解查询字符串,可以看到apiKey=d522aa97197fd864d36b418f39ebb323。这意味着您需要在请求上提供一个API密钥,它将按预期工作

我会继续检查网站是否有注册和获取API密钥的方法,允许您直接提出请求,可能是基于一组规则

我在下面提供了一个使用当前提供的API密钥的示例(应该在几个小时内失效,但我将试一试)

const weatherApi='1〕https://api.weather.com/v3/location/search?apiKey=d522aa97197fd864d36b418f39ebb323&format=json&language=en-US&locationType=locale&query=
$(“#构建”)。在('单击',()=>{
常量text=$('#text').val();
const resultEl=$(“#result”);
常量uri=`${weatherApi}${encodeURI(文本)}`;
获取(uri)
.then(r=>r.json())
.then(r=>JSON.stringify(r))
.then(r=>resultEl.html(r))
.捕获(e=>警报(e));
});

搜寻

您可以发布用于设置标题的实际代码吗?您设置了
headers
变量,但我们看不到它在哪里使用。谢谢!Weather.gov上的API(因为Weather.com没有)是否适用于此项目?此特定网站(Weather.com)需要特定的API密钥,并且可能由他们制作和提供。由另一家公司提供的密钥不应该起作用,但在你尝试之前你永远不会知道=)是的,我的意思是用weather.gov重新做整个项目。哦,是的,如果他们允许你按邮政编码查询,它肯定会。