2017-02-08 3 views
2

Таким образом, есть веб-страница, которую я хочу, чтобы извлечь с python.Requestsесть разница между локон -u и питона запросов

https://ororo.tv/api/v2/episodes/9

который требует базовой аутентификации. Если я делаю это с завитком, как этот

curl -u [email protected]:password https://ororo.tv/api/v2/episodes/9 

Я получаю ответ я хочу, однако, при попытке сделать то же самое в Python с Requests библиотеки, как этот

>>> r = requests.get('https://ororo.tv/api/v2/episodes/9', auth=('[email protected]', 'password')) 
>>> r 
<Response [520]> 

Я всегда получаю 520 ответа , Может ли кто-нибудь сказать мне, что я могу делать неправильно?

+0

Поскольку ваша команда является основной ошибкой отказа вы можете попробовать решение из этого вопроса, когда вы делаете свой запрос: http://stackoverflow.com/questions/635113/python-urllib2-basic-http-authentication-and-trimim –

+0

Есть ли тело ответа? 'print (r.text)' было бы полезно, если бы не пустое. –

+0

Почему ваш запрос Python пытается связаться с ** другим URL **? –

ответ

2

Да, есть тонкие различия. Есть небольшие отличия в отправляемых заголовках, и они, по-видимому, имеют значение для этого API.

Если изменить URL опрашивается использовать http://httpbin.org/get (конечный пункт в онлайн HTTP test service HTTPBin.org, вы можете увидеть разницу в том, что curl и requests отправить:

$ curl -u [email protected]:password http://httpbin.org/get 
{ 
    "args": {}, 
    "headers": { 
    "Accept": "*/*", 
    "Authorization": "Basic dGVzdEBleGFtcGxlLmNvbTpwYXNzd29yZA==", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.51.0" 
    }, 
    "origin": "84.92.98.170", 
    "url": "http://httpbin.org/get" 
} 
$ python -c "import requests; print(requests.get('http://httpbin.org/get', auth=('[email protected]', 'password')).text)" 
{ 
    "args": {}, 
    "headers": { 
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Authorization": "Basic dGVzdEBleGFtcGxlLmNvbTpwYXNzd29yZA==", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.11.1" 
    }, 
    "origin": "84.92.98.170", 
    "url": "http://httpbin.org/get" 
} 

Чтобы подчеркнуть различия:

  • requests посылает один дополнительный заголовок, Accept-Encoding, установите gzip, deflate
  • User-Agent заголовок отличается; оба отражают текущий агент.

Вам нужно будет увидеть, какой из этих заголовков вызывает проблему на сайте https://ororo.tv/api/v2. Когда я исправить URL, чтобы использовать v2 и https, подобно команде curl, и установить заголовок User-Agent затем я получаю правильный ответ:

>>> headers = {'User-Agent': 'curl/7.51.0'} 
>>> r = requests.get('https://ororo.tv/api/v1/episodes/9', 
        auth=('[email protected]', 'password'), headers=headers) 
>>> r 
<Response [200]> 
>>> from pprint import pprint 
>>> pprint(r.json()) 
{'airdate': '2005-10-13', 
'download_url': 'https://static-uk2.ororo.tv/uploads/video/file/9/Everybody.Hates.Chris.S01E04.DVDRip.Everybody.Hates.Sausage_1480525209.mp4?attachment=true&wmsAuthSign=aWQ9ODAzNDI3Kyt2aWRlbys5JnNlcnZlcl90aW1lPTIvOC8yMDE3IDI6Mjc6MDQgUE0maGFzaF92YWx1ZT1kbEpGM3c1bldSOXBOMUg5V2N1S0NnPT0mdmFsaWRtaW51dGVzPTk2MCZzdHJtX2xlbj05NQ%3D%3D', 
'id': 9, 
'name': 'Everybody Hates Sausage', 
'number': '4', 
'plot': 'When Julius buys a big crate of sausage, he makes everyone eat it ' 
     'with every meal. But Tonya refuses to, causing friction between the ' 
     'her and Rochelle. While at school, Chris is sentenced to 3 days of ' 
     'detention after a rumor goes round about him beating up the school ' 
     'bully, Joey.', 
'resolution': 'SD', 
'season': 1, 
'show_name': 'Everybody hates Chris', 
'subtitles': [{'lang': 'en', 
       'url': 'https://uploads.ororo-mirror.tv/uploads/subtitle/file/4867/Everybody.Hates.Chris.S01E04.DVDRip.Everybody.Hates.Sausage.eng.vtt'}, 
       {'lang': 'ru', 
       'url': 'https://uploads.ororo-mirror.tv/uploads/subtitle/file/28629/Everybody.Hates.Chris.S01E04.DVDRip.Everybody.Hates.Sausage.vtt'}, 
       {'lang': 'es', 
       'url': 'https://uploads.ororo-mirror.tv/uploads/subtitle/file/55744/1x04_EH_Sausage.vtt'}, 
       {'lang': 'pt', 
       'url': 'https://uploads.ororo-mirror.tv/uploads/subtitle/file/124429/Everybody_Hates_Chris_104_-_Everybody_Hates_Sausage.vtt'}, 
       {'lang': 'cs', 
       'url': 'https://uploads.ororo-mirror.tv/uploads/subtitle/file/217213/Everybody_Hates_Chris_104_-_Everybody_Hates_Sausages.vtt'}, 
       {'lang': 'tr', 
       'url': 'https://uploads.ororo-mirror.tv/uploads/subtitle/file/192405/Everybody_Hates_Chris_S01E04_-_Everybody_Hates_Sausages-tur.vtt'}], 
'updated_at': 1480640069, 
'url': 'https://static-gra.ororo.tv/uploads/video/file/9/Everybody.Hates.Chris.S01E04.DVDRip.Everybody.Hates.Sausage_1480525209.smil/playlist.m3u8?wmsAuthSign=aWQ9ODAzNDI3Kyt2aWRlbys5JnNlcnZlcl90aW1lPTIvOC8yMDE3IDI6Mjc6MDQgUE0maGFzaF92YWx1ZT1FajlGK2JPMEd3aU1Lc3lnN1M4NlpBPT0mdmFsaWRtaW51dGVzPTk2MCZzdHJtX2xlbj05Ng%3D%3D'} 
0

Возможно, api, который вы пытаетесь использовать, требует отформатировать ваш запрос определенным образом, возможно, требуя заголовков и кодировки с кодировкой base64 при использовании чего-то вроде запросов Python.

Посмотрите пример, который покажет вам, как и послать заголовок аутентификации base64 закодирован, наряду с некоторыми данными:

import requests 
import base64 

username = "some_username" 
password = "some_password" 

request_url = "https://ororo.tv/api/v2/episodes/9" 

# In this example, I'm passing some data along with the request. 
# these are generally what you would expect to pass along in an encoded url: 
# /api?some_url_param_key=some_url_param_value 

data = {} 
data["some_url_param_key"] = "some_url_param_value" 

# This is an example header, not necessarily what you need, 
# but it should serve as a good starting point. 

headers = {} 
headers["Authorization"] = "Basic " + base64.encodestring(username + ":" + password).replace('\n', '') 
headers["Accept"] = "*/*" 
headers["Content-Type"] = "application/x-www-form-urlencoded" 
headers["User-Agent"] = "runscope/0.1" 

# You can use post() in some cases where you would expect to use get(). 
# Every API is its own unique snowflake and expects different inputs. 
# Try opening up the Chrome console and run the request in the 
# browser, where you know it works. Examine the headers and response 
# in cases where the API you're accessing doesn't provide you 
# with the necessary inputs. 

result = requests.post(request_url, headers=headers, data=data) 
print result 
+0

'auth = (имя пользователя, пароль)' устанавливает для вас заголовок 'Authorization' *, нет необходимости кодировать base64. Тип контента также автоматически устанавливается в точно такое же значение, а заголовок 'accept' точно задан по умолчанию. Единственное эффективное отличие здесь - * заголовок агента пользователя *. –

Смежные вопросы