即时通讯编写一个简单的网络爬虫。问题在于链接提取。webcrawler链接提取问题
我使用cpp-netlib和boost。这里有几行CLink Class。
CLink::CLink(const CLink& father, const std::string& relUrl)
{
uri = relUrl;
boost::network::uri::uri instance(relUrl);
boost::network::uri::uri instanceFather(father.uri);
if ((valid = boost::network::uri::is_valid(instance)) == 1)
{
scheme = boost::network::uri::scheme(instance);
user_info = boost::network::uri::user_info(instance);
host = boost::network::uri::host(instance);
port = boost::network::uri::port(instance);
path = boost::network::uri::path(instance);
query = boost::network::uri::query(instance);
fragment = boost::network::uri::fragment(instance);
uri = scheme;
uri += "://";
uri += host;
uri += path;
}
else
{
if ((valid = boost::network::uri::is_valid(instanceFather)) == 1)
{
scheme = boost::network::uri::scheme(instanceFather);
user_info = boost::network::uri::user_info(instanceFather);
host = boost::network::uri::host(instanceFather);
port = boost::network::uri::port(instanceFather);
path = boost::network::uri::path(instance);
query = boost::network::uri::query(instance);
fragment = boost::network::uri::fragment(instance);
uri = scheme;
uri += "://";
uri += host;
uri += path;
}
}
};
CLink::CLink(const std::string& _url)
{
uri = _url;
boost::network::uri::uri instance(_url);
if ((valid = boost::network::uri::is_valid(instance)) == 1)
{
scheme = boost::network::uri::scheme(instance);
user_info = boost::network::uri::user_info(instance);
host = boost::network::uri::host(instance);
port = boost::network::uri::port(instance);
path = boost::network::uri::path(instance);
query = boost::network::uri::query(instance);
fragment = boost::network::uri::fragment(instance);
uri = scheme;
uri += "://";
uri += host;
uri += path;
}
else
std::cout << "err " << std::endl;
};
从我用htmlcxx库获取的网页的链接。我拿了HTML :: Node并且用boost文件系统对它们进行了标准化。
if (url.find("http://") == std::string::npos)
{
std::string path = link.get_path() + url;
url = link.get_host() + path;
boost::filesystem::path result;
boost::filesystem::path p(url);
for(boost::filesystem::path::iterator it=p.begin(); it!=p.end(); ++it)
{
if(*it == "..")
{
if(boost::filesystem::is_symlink(result))
result /= *it;
else if(result.filename() == "..")
result /= *it;
else
result = result.parent_path();
}
else if(*it == ".")
{
// Ignore
}
else
{
// Just cat other path entries
result /= *it;
}
}
url = "http://" + result.string();
}
return ret;
现在的问题是。
我尝试获取http://www.wikipedia.de/
和我得到的URL像
性能 http://wikimedia.de/wiki/Vereinszeitung ......
,并在网站上http://wikimedia.de/wiki/Vereinszeitung
有经常喜欢/wiki/vereinsatzung
链接我得到的链接像
http://wikimedia.de/wiki/Vereinszeitung/wiki/Freies_Wissen
有人有一个idee?
THX的答案。但get_path正在返回像/rob/index.html那样的填充路径,所以它的快速然后是/rob/index.html/blaaa ... das suxx :( – Roby 2011-05-16 06:19:53
但作品:) thx – Roby 2011-05-16 06:28:58