Почему я получаю другой ответ от сервера с URL, переданным из списка в requests.get(), по сравнению с жестко запрограммированной строкой?

#python #python-3.x #python-requests

#python #python-3.x #python-запросы

Вопрос:

Я пытаюсь очистить предварительно обработанный JSON из нескольких URL-адресов с определенного сервера.

Когда я использую requests.get() с жестко запрограммированным URL-адресом или переменной строкового типа, содержащей жестко запрограммированный URL-адрес, я получаю нужный JSON с сервера.

 requests.get("https://example.url/example.cgi/example")
  

.headers свойство объекта ответа возвращает:

 {'Server': 'nginx', 'Date': 'Wed, 28 Oct 2020 00:49:22 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Confex-Backend': 'es-director', 'Content-Encoding': 'gzip'}
  

Но, когда я передаю точно такой же URL-адрес из списка в requests.get() :

     url_list = ['https://example.url/example.cgi/example']    
    
    for url in url_list:
        requests.get(url)
  

Я не получаю ответ JSON от сервера. Вместо этого я получаю HTML без нужного мне JSON, показанного здесь заголовком объекта ответа (не могу опубликовать содержимое или URL-адрес сервера здесь):

 {'Server': 'nginx', 'Date': 'Wed, 28 Oct 2020 00:49:22 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache,no-store', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'X-Confex-Backend': 'weba13', 'Content-Encoding': 'gzip'}
  

Я в тупике. Я попытался преобразовать переменную элемента списка в строку, перекодировать ее и т.д… Я даже пытался изменить порядок get запросов в своем тестировании, и я получаю те же результаты. Что происходит с requests.get() тем, что URL-адрес, переданный в качестве элемента списка методу, получает от сервера совсем другой ответ, чем тот же URL-адрес, когда он жестко запрограммирован в методе или в переменную, переданную методу? Чего мне не хватает? Достаточно сказать, что по очевидным причинам было бы здорово requests.get() перебирать список URL-адресов для этой конкретной цели…

Комментарии:

1. Я согласен. Это не имеет смысла. Вы абсолютно на 100% уверены, что это один и тот же URL-адрес оба раза? (Поместите MY_URL = "https:/...../example" в начало вашего файла и используйте MY_URL вместо того, чтобы записывать его дважды.).

2. Ага… Я потратил целый час, чтобы убедиться в своем тестировании… даже .url свойство объекта ответа при использовании элемента списка является точно такой же строкой, что и жестко запрограммированный html, точно такой же, как передача URL-адреса через переменную (не волнуйтесь, я все об определении своих параметров в верхней части файла… приведенный выше код является чисто иллюстративным).

3. Ах, вы были правы… оказывается, URL-адреса были отключены на один символ в середине URL-адреса. Объяснение в ответе ниже…

4. Вот почему я предложил поместить URL-адрес в переменную . . . . Это действительно хороший способ поиска ладоней. Это гарантирует, что вещи, которые должны быть одинаковыми, на самом деле.

5. Если вы прочтете мой вопрос более внимательно, вы можете заметить «в переменной строкового типа» во 2-м предложении. Тем не менее, спасибо за вашу помощь!

Ответ №1:

Я понял это. -Facepalm-

Итак, в данном конкретном случае я скомпилировал URL-адреса в объектах списка из scraping HTML на том же сайте. Оказывается, что эти URL-адреса на один символ отличаются от жестко запрограммированных URL-адресов, которые я видел, как запросы XHR GET используют для получения JSON. app.cgi vs api.cgi в середине URL. Теперь я знаю, как выполнять проверки такого рода в будущем.