Я несколько дней пытался (используя другие ответы на этом сайте и MathWorks ), чтобы обойти crumb
, которые Yahoo Finance добавляет в конце ссылкичтобы загрузить файл CSV, например, для CSV с данными Nasdaq100 в браузере Chrome, вы получите ссылку: https://query1.finance.yahoo.com/v7/finance/download/%5ENDX?period1=496969200&period2=1519513200&interval=1d&events=history&crumb=dnhBC8SRS9G (нажав на кнопку «Загрузить данные» на этой странице Yahoo Finance).
Очевидно, что crumb=dnhBC8SRS9G
изменяется в зависимости от файлов cookie и агента пользователя, поэтому я попытался настроить MATLAB соответствующим образом, чтобы замаскировать себя под браузер Chrome (копирование файла cookie / агента пользователя, найденного в Chrome):
useragent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36';
cookie ='PRF=t%3D%255ENDX; expires=Thu, 11-Jun-2020 09:06:31 GMT; path=/; domain=.finance.yahoo.com';
opts = weboptions('UserAgent',useragent,'KeyName','WWW_Authenticate','KeyValue','dnhBC8SRS9G','KeyName','Cookie','KeyValue',cookie)
url = 'https://query1.finance.yahoo.com/v7/finance/download/^NDX?period1=496969200&period2=1519513200&interval=1d&events=history&crumb=dnhBC8SRS9G' ;
response = webread(url,opts)
Но независимо от того, что я делаю (используя webread
или дополнительную функцию urlread2
), я получаю ответ, что я "не авторизован".Приведенный выше код MATLAB дает мне ответ:
Error using readContentFromWebService (line 45)
The server returned the status 401 with message "Unauthorized" in response to the request to URL
https://query1.finance.yahoo.com/v7/finance/download/%5ENDX?period1=496969200&period2=1519513200&interval=1d&events=history&crumb=dnhBC8SRS9G.
Error in webread (line 122)
[varargout{1:nargout}] = readContentFromWebService(connection, options);
Error in TEST2 (line 22)
response = webread(url,opts)
Любая помощь будет принята с благодарностью, я просто хочу заставить работать основы, даже если это означает, что мне нужно вручную скопировать crumb
из Chrome-браузер в MATLAB перед первым запросом.(Я видел, что они решили это в Python, C # и т. Д., И я следовал этим решениям в максимально возможной степени, так что это должно быть выполнимо и в MATLAB, верно?)
РЕДАКТИРОВАТЬ: Если это поможетКогда я запускаю urlread2
вместо webread
в конце моего кода, то есть:
[output,extras] = urlread2(url,'GET');
extras.firstHeaders
Я получаю следующий вывод из MATLAB:
ans =
struct with fields:
Response: 'HTTP/1.1 401 Unauthorized'
X_Content_Type_Options: 'nosniff'
WWW_Authenticate: 'crumb'
Content_Type: 'application/json;charset=utf-8'
Content_Length: '136'
Date: 'Tue, 12 Jun 2018 13:07:38 GMT'
Age: '0'
Via: 'http/1.1 media-router-omega4.prod.media.ir2.yahoo.com (ApacheTrafficServer [cMsSf ]), http/1.1 media-ncache-api17.prod.media.ir2.yahoo.com (ApacheTrafficServer [cMsSf ]), http/1.1 media-ncache-api15.prod.media.ir2.yahoo.com (ApacheTrafficServer [cMsSf ]), http/1.1 media-router-api12.prod.media.ir2.yahoo.com (ApacheTrafficServer [cMsSf ]), https/1.1 e3.ycpi.seb.yahoo.com (ApacheTrafficServer [cMsSf ])'
Server: 'ATS'
Expires: '-1'
Cache_Control: 'max-age=0, private'
Strict_Transport_Security: 'max-age=15552000'
Connection: 'keep-alive'
Expect_CT: 'max-age=31536000, report-uri="http://csp.yahoo.com/beacon/csp?src=yahoocom-expect-ct-report-only"'
Public_Key_Pins_Report_Only: 'max-age=2592000; pin-sha256="2fRAUXyxl4A1/XHrKNBmc8bTkzA7y4FB/GLJuNAzCqY="; pin-sha256="2oALgLKofTmeZvoZ1y/fSZg7R9jPMix8eVA6DH4o/q8="; pin-sha256="Gtk3r1evlBrs0hG3fm3VoM19daHexDWP//OCmeeMr5M="; pin-sha256="I/Lt/z7ekCWanjD0Cvj5EqXls2lOaThEA0H2Bg4BT/o="; pin-sha256="JbQbUG5JMJUoI6brnx0x3vZF6jilxsapbXGVfjhN8Fg="; pin-sha256="SVqWumuteCQHvVIaALrOZXuzVVVeS7f4FGxxu6V+es4="; pin-sha256="UZJDjsNp1+4M5x9cbbdflB779y5YRBcV6Z6rBMLIrO4="; pin-sha256="Wd8xe/qfTwq3ylFNd3IpaqLHZbh2ZNCLluVzmeNkcpw="; pin-sha256="WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18="; pin-sha256="cAajgxHlj7GTSEIzIYIQxmEloOSoJq7VOaxWHfv72QM="; pin-sha256="dolnbtzEBnELx/9lOEQ22e6OZO/QNb6VSSX2XHA3E7A="; pin-sha256="i7WTqTvh0OioIruIfFR4kMPnBqrS2rdiVPl/s2uC/CY="; pin-sha256="iduNzFNKpwYZ3se/XV+hXcbUonlLw09QPa6AYUwpu4M="; pin-sha256="lnsM2T/O9/J84sJFdnrpsFp3awZJ+ZZbYpCWhGloaHI="; pin-sha256="r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E="; pin-sha256="uUwZgwDOxcBXrQcntwu+kYFpkiVkOaezL0WYEZ3anJc="; includeSubdomains; report-uri="http://csp.yahoo.com/beacon/csp?src=yahoocom-hpkp-report-only"'
И мой weboptions
вывод:
opts =
weboptions with properties:
CharacterEncoding: 'auto'
UserAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
Timeout: 5
Username: ''
Password: ''
KeyName: ''
KeyValue: ''
ContentType: 'auto'
ContentReader: []
MediaType: 'application/x-www-form-urlencoded'
RequestMethod: 'auto'
ArrayFormat: 'csv'
HeaderFields: {'Cookie' 'PRF=t%3D%255ENDX; expires=Thu, 11-Jun-2020 09:06:31 GMT; path=/; domain=.finance.yahoo.com'}
CertificateFilename: '/opt/matlab/r2017a/sys/certificates/ca/rootcerts.pem'