WebRequest()抓取网页数据

忙了一整天研究WebRequest()抓取网页数据,比如myfxbook的OutLook。发现的问题是,

  • myfxbook可能发现读取其数据的次数太多了,因此访问http网页自动跳到https网页,
  • 更糟糕的是,官方的数据更新是每分钟一次,但编好的ea访问不停报错,错误号5203,意思是http访问失败,经过耐心观察,似乎是每6分钟允许访问一次。
  • 可能各地对访问myfxbook网站有限制,一台在常州电信的ea工作正常,一台在东营联通的总是5203,但网页能打开myfxbook网页。

从网上检索到的知识点是,

  • WebRequest()只能访问http的80端口或https的443端口,如果对方网站更改了端口号,就访问不了呢。
  • MQL访问https经常报错5203,因为不知道如何进行证书认证。

使用官方F1可以看到两个例子,方便对各参数的理解。

在本次访问myfxbook中,其实现流程为,

  1. 时间间隔检查;
  2. 使用for循环多次使用WebRequest()访问,获得网页串流;
  3. 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;
    }
  4. 读取这个串流中的有用信息,使用StringFindInArray()子函数找到关键词的地址;
  5. 类似火车头,缩小地址范围之后,找第二个关键词,然后再精确定位所要捕获的数据;
  6. 捕获的数据合规性检查;
  7. 收尾处理,比如记录最后一次访问时间。
  8. 将合规数据赋值给全局变量,或者数组予以使用。


本博客所有文章如无特别注明均为原创。作者:天泓评测
分享到:更多

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)