版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
最近一直在做一个爬虫的程序,老大分配让我爬天气预报,无奈什么都不懂,只熟悉c语言和了解一些c++我是从零开始学起,刚开始时一头雾水,不知道爬虫是什么,虽然去年的时候在web搜索一课中知道这个名词,可是具体的过程一点也不了解,学习了一周,看了看其他人的代码,才慢慢了解。
总结起来,我自己的一点很肤浅的理解,什么是“爬虫”,从网上爬取所需要的有用的信息并且以一定的方式保存起来,例如,一个人经常国外旅游,那么他就需要知道国外城市的天气,风力,温度,日期等状况,他会选择一个网址,打开一个页面,但是网页上呈现给他的东西很多,那么爬虫,就是要爬取这些天气信息,滤除其他的对他来说没有用的信息,有针对性的。爬下来以后的信息,可以是某种图片形式保存,或者是一些文本形式保存的。
所以“爬虫”分为几步骤:
1.找到URL,打开一个网页;
2。分析网页,找到下一个链接;
以上两步循环,目前是针对一个特定的网页爬取特定的东西来写的,所以没有考虑太多,例如像其他网上说的开辟多线程,将打开和解析页面作为两个独立的进程来写代码,以及搜索的算法复杂度等深层次的问题。
编译环境:vc.net 2003,在win console project下新建工程,并且支持MFC;
部分代码如下:
// ttt.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "ttt.h"
#include "Afxinet.h"
#include
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
struct city
{
CString value;
CString name;
CString cityid;
};
city b[250];
BOOL UTF8ToGB(CString &szOut ,CString str)
{
ASSERT(str);
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
strSrc = new WCHAR[i+1];
MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new TCHAR[i+1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
szOut = szRes;
delete []strSrc;
delete []szRes;
return TRUE;
}
CString openurl(CString m_strUrlBegin) //open the net waiting for loading;
{
CHttpFile *m_pHttpFile;
CString myData;
CString strShow;
CString m_SiteInfo;
CInternetSession m_pSession = NULL;
//根据url读取源文件;
m_pHttpFile = (CHttpFile*)m_pSession.OpenURL(m_strUrlBegin);
while(m_pHttpFile->ReadString(myData))
{
m_SiteInfo += "/r/n";
m_SiteInfo += myData;
}
m_SiteInfo.MakeLower();
//Unicode transfer
UTF8ToGB(strShow,m_SiteInfo);
return strShow;
}
。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
CString findtext;
CString sourid="http://www.weatherchannel.com.au/Main-Menu/More-Weather/World-Weather.aspx";
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed/n"));
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
ofstream ofile("pagesource6.txt"); //打开一个天气预报的网页并保存;
findtext=openurl(sourid);
ofile