忙了一整天研究WebRequest()抓取网页数据,比如myfxbook的OutLook。发现的问题是,
- myfxbook可能发现读取其数据的次数太多了,因此访问http网页自动跳到https网页,
- 更糟糕的是,官方的数据更新是每分钟一次,但编好的ea访问不停报错,错误号5203,意思是http访问失败,经过耐心观察,似乎是每6分钟允许访问一次。
- 可能各地对访问myfxbook网站有限制,一台在常州电信的ea工作正常,一台在东营联通的总是5203,但网页能打开myfxbook网页。
从网上检索到的知识点是,
- WebRequest()只能访问http的80端口或https的443端口,如果对方网站更改了端口号,就访问不了呢。
- MQL访问https经常报错5203,因为不知道如何进行证书认证。
使用官方F1可以看到两个例子,方便对各参数的理解。
在本次访问myfxbook中,其实现流程为,
- 时间间隔检查;
- 使用for循环多次使用WebRequest()访问,获得网页串流;
-
bool 下载数据(char &result[])//1-1 { string Headers; // 服务器响应标头 string referer = NULL; // HTTP 请求标头的推荐页字段 string cookie = NULL; char post[]; // HTTP请求信息数组 int err; ResetLastError(); // 1000ms if(WebRequest("GET", MyFxBookUrl, cookie, referer, Timeout, post, 0, //post[]数组大小 result, //服务器响应数据数组 Headers) < 0) { err = GetLastError(); Print("Error in WebRequest [",err,"]",ErrorDescription(err)); return false; } return true; } - 读取这个串流中的有用信息,使用StringFindInArray()子函数找到关键词的地址;
- 类似火车头,缩小地址范围之后,找第二个关键词,然后再精确定位所要捕获的数据;
- 捕获的数据合规性检查;
- 收尾处理,比如记录最后一次访问时间。
- 将合规数据赋值给全局变量,或者数组予以使用。
发表评论