网页抓取数据(几天的资料去写一个网页抓取股票实时数据的程序)

优采云 发布时间: 2021-11-28 07:39

  网页抓取数据(几天的资料去写一个网页抓取股票实时数据的程序)

  最近查了好几天的资料,写了一个网页,捕捉实时*敏*感*词*。网上一堆资料都是一遍遍的解释同一个方法,一般不需要时间的网页数据变化。然而,捕捉实时*敏*感*词*的要求是大量的*敏*感*词*每秒钟都在变化。有必要确保程序可以每秒捕获这些变化的数据。嗯,为此,开始网上搜索数据,很多人建议使用libcurl方法。好的,libcurl 非常强大且易于使用。我也想说,libcurl对于不变化的普通网页非常强大,libcurl达不到每秒的刷新率。网页数据速度10倍以上,而libcurl会有读取失败的延迟,延迟是2~3秒,也就是说在这2~3秒内无法抓取到网页上变化的数据。对于股市来说,这会丢失很大一部分数据。所以 libcurl 的方案被否定了。

  但是,股票的实时更新需要如此高的读取次数。一般的方法会造成数据丢失。我能想到的就是将数据丢失降到最低。我再想想,为什么浏览器不会丢失数据?能不能像浏览器一样不丢失数据?(这个问题后面会解决。)我暂时使用的方法是利用WinInet提供的库函数来开发Internet程序。附上以下代码:

  void Get_Http_Data(string Url, string &buffer)

{

try

{

CInternetSession *session = new CInternetSession();

CHttpFile* pfile = (CHttpFile *)session->OpenURL(Url.c_str(),1,INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE);

if( NULL == pfile )

{

LOG(1)("网络连接中断 或 请求连接失败!");

session->Close();

return ;

}

DWORD dwStatusCode;

pfile -> QueryInfoStatusCode(dwStatusCode);

if(dwStatusCode == HTTP_STATUS_OK)

{

CString data;

while (pfile -> ReadString(data))

{

if( !data.IsEmpty())

{

buffer.append(data.GetBuffer(0));

buffer.append("\t\n");

}

}

}

pfile->Close();

delete pfile;

session->Close();

}

catch(CInternetException *pEx) //这里一定要做异常抛出,考虑到如果程序正在运行中突然客户端网络中断,那么做异常抛出就会即使提示错误并终止。

{ //如果不做异常判断的话,程序就会继续运行这样导致buffer为空,记下来的操作万一没有考虑到buffer为空的情况就

pEx->ReportError(); //会导致程序崩溃,因为buffer为空内存无法操作。(比如运行到split函数会崩溃。)

pEx->Delete();

}

}

  使用函数CInternetSession::OpenUrl()实现对服务器网页的持续请求操作。标志:INTERNET_FLAG_RELOAD 是强制重复阅读网页。

  上面的过程就是方法。其他更优化的方法正在研究中。. . 也希望有想法有想法的同事留下自己的打算。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线