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