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

优采云 发布时间: 2022-04-01 11:10

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

  最近查了几天资料,想写一个程序来捕捉网络上的实时*敏*感*词*。网上一堆资料翻来覆去解释同一种方法,都是抓取不改变、不需要时间的通用网络数据。然而,实时*敏*感*词*的捕获需要每秒大量的*敏*感*词*变化。有必要确保程序可以每秒捕获这些变化的数据。好吧,为此,开始网上搜索资料,很多人建议使用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人工客服


线