#python #python-3.x #python-requests
#python #python-3.x #python-запросы
Вопрос:
Мне нужно проверить CSV-файл на сайте, руководство CSVLint по использованию API можно найти здесь.
Проблема в том, что когда я запрашиваю файл JSON с сайта, я не получаю надлежащего ответа, я получаю пустой список. Когда я захожу на сайт из браузера по ссылке аутентификации, я получаю полные результаты аутентификации. Что я делаю не так?
Мой код:
import requests
data = {
'urls[]': 'https://www.wien.gv.at/statistik/ogd/vie_104.csv'
}
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
header={'User-Agent' : user_agent }
response = requests.post('http://csvlint.io/package.json', data=data,headers=header)
first=response.json()
csvid=first['package']['url'] '.json'
#link='https' csvid[5:]
request=requests.get(csvid).text
print(request)
Цель состоит в том, чтобы получить содержимое csvid
ссылки JSON.
В Python, в print(request)
я получаю:
{"version":"0.1","licence":"http://opendatacommons.org/licenses/odbl/","package":{"validations":[]}}
В браузере я получаю:
{"version":"0.1","licence":"http://opendatacommons.org/licenses/odbl/","package":{"validations":[{"url":"https://csvlint.io/validation/5c937a85b1b6fc0004000047","source":"https://www.wien.gv.at/statistik/ogd/vie_104.csv","state":"warnings"}]}}
Ответ №1:
Попробуйте просто отложить ваш запрос вот так:
import time
import requests
data = {
'urls[]': 'https://www.wien.gv.at/statistik/ogd/vie_104.csv'
}
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
header={'User-Agent' : user_agent }
response = requests.post('http://csvlint.io/package.json', data=data,headers=header)
first=response.json()
csvid=first['package']['url'] '.json'
time.sleep(5)
request=requests.get(csvid).text
print(request)
Я получаю правильный вывод с этой модификацией:
{«версия»:»0.1″,»лицензия»:»http://opendatacommons.org/licenses/odbl /«,»package»:{«проверки»:[{«url»:»https://csvlint.io/validation/5c937a85b1b6fc0004000047 «,»источник»:»https://www.wien.gv.at/statistik/ogd/vie_104.csv «,»состояние»:»предупреждения»}]}}
Это связано с тем, как пакет обрабатывается с помощью их API, как указано в другом ответе:
Обратите внимание, что в настоящее время пакет создается в фоновом режиме, поэтому может быть недоступен немедленно. Это изменится в будущем.
Комментарии:
1. Большое вам спасибо за разъяснения, я не понял, что имелось в виду, говоря, что пакет недоступен немедленно.
Ответ №2:
В руководстве по API есть строка, в которой говорится:
Обратите внимание, что в настоящее время пакет создается в фоновом режиме, поэтому может быть недоступен немедленно. Это изменится в будущем.
Это как раз на том этапе, когда вы получаете пустой результат возврата. Действительно, даже с selenium для отображения информации требуется обновление.
Возможно, в настоящее время вам нужен метод, подобный selenium, для этого шага и, возможно, для последнего. По крайней мере, задержка для готовности пакета.
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json
d = webdriver.Chrome()
data = {
'urls[]': 'https://www.wien.gv.at/statistik/ogd/vie_104.csv'
}
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
header={'User-Agent' : user_agent }
with requests.Session() as s:
response = s.post('http://csvlint.io/package.json', data=data,headers=header)
first = response.json()
csvid = first['package']['url'] '.json'
d.get(csvid)
d.refresh()
data = WebDriverWait(d, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, "pre"))).text
validationUrl = json.loads(data)['package']['validations'][0]['url']
final = s.get(validationUrl '.json').json()
print(final)
d.quit()