网页抓取数据(几天的资料去写一个网页抓取股票实时数据的程序)
优采云 发布时间: 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 是强制重复阅读网页。
上面的过程就是方法。其他更优化的方法正在研究中。. . 也希望有想法有想法的同事留下自己的打算。