HTTP Error 403: Forbidden, python3 urlllib, http://cbr.ru/scripts/XML_daily.asp

Рейтинг: 3Ответов: 1Опубликовано: 13.11.2014

С локального компьютера скрипт выполняется нормально. xml файл принимается успешно. Но когда выполняю следующий скрипт с хостинга pythonanywhere.com появляется ошибка HTTP Error 403: Forbidden. Кто-нибудь может подсказать в чем проблема и как ее обойти?

Часть кода:

import urllib, os
from xml.etree import ElementTree as ET

def update_currencies():
    url = 'http://cbr.ru/scripts/XML_daily.asp'
    hdr = {}

    hdr['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36  (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36'
    hdr['Accept'] =  'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'

    req = urllib.request.Request(url, headers=hdr)

    content = urllib.request.urlopen(req)

    tree = ET.parse(content)
    root = tree.getroot()
...

Спасибо за внимание.

Ответы

▲ 2

Судя по всему сайт ЦБ РФ очень не любит когда к нему обращаются слишком часто. Добавьте кеш запросов курса интересующей вас валюты (например, сохраняя локально скачанный файл с данными), подождите день и попробуйте ещё раз скачать данные.

Можно также обратиться к какому-то из известных зеркал сервиса ЦБ РФ. У них же можно найти данные по курсам в более удобных для использования формата вроде JSON.

Пример выдачи такого зеркала:

https://www.cbr-xml-daily.ru/daily.xml

Сравните с оригиналом:

http://cbr.ru/scripts/XML_daily.asp

Описание других форматов выдачи на сайте сервиса.

Не факт что любые такие сервисы хорошо отнесутся к тому, что вы будете выкачивать курсы валют при каждом заходе посетителя на сайт. Стоит всегда кешировать полученные курсы валют, хотя бы потому что они обновляются раз в день и только по будним дням.