Python 3: Urllib дает сообщение об ошибке 403 - PullRequest
0 голосов
/ 28 сентября 2019

Я хотел запустить программу на python 3, которую я создал некоторое время назад, где она получает информацию о погоде с веб-сайта по чьему-то конкретному почтовому индексу.Он работал отлично, когда я попробовал его несколько месяцев назад, но теперь я получаю сообщение об ошибке urllib 403.

Я получил несколько советов, и кто-то сказал мне, что веб-сайт больше не принимает ботов.

Весь мой проект выглядел так:

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

Я немного озадачен и мог бы помочь.Стоит ли выбирать новый сайт целиком?

1 Ответ

0 голосов
/ 28 сентября 2019

Судя по тому, что вы говорите, этот веб-сайт не принимает запросы, в которых отсутствует какая-либо техника аутентификации.В быстром журнале запросов я мог видеть, что этот запрос выполняется:

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 = 'https://api.weather.com/v3/location/search?apiKey=d522aa97197fd864d36b418f39ebb323&format=json&language=en-US&locationType=locale&query='

$('#build').on('click', () => {
  const text = $('#text').val();
  const resultEl = $('#result');
  const uri = `${weatherApi}${encodeURI(text)}`;
  fetch(uri)
    .then(r => r.json())
    .then(r => JSON.stringify(r))
    .then(r => resultEl.html(r))
    .catch(e => alert(e));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <input id='text' type='text'><button id='build'>Search</button>
</div>
<p id='result'></p>
...