【发布时间】:2016-01-16 12:18:25
【问题描述】:
我不知道如何让这个示例代码正常工作,我希望是否有人能够审查和评估我关于什么是错误的假设。
问题:我想使用 Matlab 访问受登录屏幕保护的网页。我可以使用 wget 并且它工作正常,但是正如我们所知,wget 不会加载页面中嵌入的 ajax/javascript 等。因此,我转而使用 Matlab File Exchange 提供的urlread2 函数。以后所有的例子都基于这个函数。
示例:
我正在尝试登录金融网站,但是在使用其他网站进行测试时,我得到了同样的错误。因此,对于我的示例,我将使用 fitbit.com。为了模仿浏览器的行为,我将以下组合标题传递给urlread2(我已拆分代码以便更容易看到我在做什么):
value = 'https://www.fitbit.com';
header = http_createHeader('Host',value);
value = 'keep-alive';
header2 = http_createHeader('Connection',value);
value = '278';
header3 = http_createHeader('Content-Length',value);
value = 'max-age=0';
header4 = http_createHeader('Cache-Control',value);
value = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
header5 = http_createHeader('Accept',value);
value = 'https://www.fitbit.com';
header6 = http_createHeader('Origin',value);
value = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36';
header7 = http_createHeader('User-Agent',value);
value = 'application/x-www-form-urlencoded';
header8 = http_createHeader('Content-Type',value);
value = 'https://www.fitbit.com/login';
header9 = http_createHeader('Referer',value);
value = 'gzip, deflate';
header10 = http_createHeader('Accept-Encoding',value);
value = 'en-US,en;q=0.8';
header11 = http_createHeader('Accept-Language',value);
%Generate a combined header as required by urlread2
combined_header = [header header2 header3 header4 header5 header6 header7 header8 header9 header10 header11];
定义了头信息后,我生成了所需的查询字符串(这是用于post操作的):
queryString = 'email=myemail&password=mypassword&login=Log+In';
最后,为urlread2 函数整合所有内容:
[output,extras] = urlread2('https://www.fitbit.com/login','post',queryString,combined_header);
以下响应嵌入在 HTML 中:
'The owner of this website (www.fitbit.com) has banned your access based on your browser''s signature (2659bb18cf10354e-ua21).'
可能的问题1:
很可能是我错误地传递了标题,但是当我通过 FireFox 模仿标题时,页面可以正常工作。对此的任何建议将不胜感激。
可能的问题2:
我认为问题可能出在 cookie 上,urlread2(也不是 Matlab 中的任何其他函数)支持 cookie。如果是这种情况,是否有人对如何解决这个问题有任何建议?
【问题讨论】:
-
您是否在 Google 上搜索过您的错误消息? This question/answer 似乎表明问题出在您的用户代理字符串上。
-
我不认为它与用户代理有关 - 我通过 FireFox 在开发人员模式下验证的代理设置。
-
将其称为用户代理字符串的问题是对链接问题的简单解释,这应该会给您关于该问题的其他想法。从根本上说,CloudFlare 拒绝采用您在表面上声明的用户代理,这是正确的,因为那不是您正在使用的 UA。根据他们的确切策略,您可能能够更改您的请求,使其更可信地模拟 Firefox,或者声明不同的用户代理被接受,或者您可能无法在不运行基于 JavaScript 的检查的情况下访问该站点
-
@Dan - 如果您使用
urlread2并尝试访问使用 HTTPS 的站点,您可能必须处理我自己遇到的问题。我刚刚发布了一个question/answer,描述了我如何设法让urlread2使用HTTPS。
标签: matlab cookies cloudflare