近日,看到某人写了一个下载CSDN博文的软件,输入csdn用户名就可以下载,但却是java写的,在java大行其道的天下,可惜我没学java,连java环境都没有,就想着用c++写一个类似的。
不过没有保存成pdf、doc之类的功能,(没有找到好的API,哈哈),因为我个人平时都是用浏览器直接保存为mht文件,所以直接在codeguru上面找了一个代码,保存一个页面为mht文件。
分析主要完成以下几个功能,
1、页面内容提取。
用CInterenetSession、CHttpConnection、CHttpFile 下载第一个页面,
2、分析blog主要信息,排名,积分等,这里没有用到xml分析(不会用),都是根据页面特点进行字符串扫描,效率有点低。
然后就在时提取里面的博客文章标题和它对应的url (当然如果有下一页就要不断分析了)
3、显示用户的主要blog信息。包括所有文章,以及头像(gdi+),这里还遇到了一个问题困扰了我两天,gdi+在vc6里面的配置问题
4、获取用户选择了的列表里面文章的URL交给 SaveOnePage 来保存。
软件界面
带关键字的文章检索
由关键字8086下载的内容
带头像
下载网页的代码
UINT GetWebText(CString & url,string *content,HWND hWnd=NULL) { CMyInternetSession *pSession = NULL; CHttpConnection *pServer = NULL; CHttpFile *pFile = NULL; bool flag; DWORD dwServiceType; CString strServer; CString strObject; INTERNET_PORT nPort; try{ flag=AfxParseURL( url,dwServiceType,strServer,strObject,nPort ); if(!flag) { AfxMessageBox(_T("打开地址错误")+url ); return false; } pSession=new CMyInternetSession; pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,30000); pSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000); pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES,2); pServer = pSession->GetHttpConnection(strServer,nPort ); pSession->m_pMainWnd=hWnd; pSession->EnableStatusCallback(TRUE); } catch (CInternetException* pEx) { pSession->Close(); pServer->Close(); pEx->Delete(); return false; } /// try { DWORD dwHttpRequestFlags =INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE ; pFile=pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject,NULL, 1,NULL, NULL,dwHttpRequestFlags); pFile->SendRequest(); } catch(CInternetException *pEx) { pSession->Close(); pServer->Close(); pEx->Delete(); return false; } char szBuf[1024]; //缓存 string *in,*out; in=new string; out=new string; char * pText; (*content)=""; while( pFile->ReadString(szBuf,1023)) { in->assign(szBuf); pText=(char *)in->c_str(); UTF_8ToGB2312(*out,pText, strlen(in->c_str())); (*content).append(*out); memset(szBuf,1024,0); } if( string::npos != (*content).find("没找到该页面") ) { return 0; } delete in; delete out; pFile->Close(); pServer->Close(); pSession->Close(); if (pFile != NULL) delete pFile; if (pServer != NULL) delete pServer; if (pSession != NULL) delete pSession ; return 1; }
下面的代码不是很懂,我的想法是可以调用浏览器里面的某个dll里面函数,但是不知道怎么去实现
工程下载地址:http://download.csdn.net/detail/lilien1010/4475758