提取网页中的所有的链结?

babam 2004-06-30 05:46:01
有很多的链结都是由脚本来生成的。这个有现成的解决方案吗??
还要用多线程。开始愁了。
谢谢了!
...全文
178 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
babam 2004-07-02
  • 打赏
  • 举报
回复
大哥你把所有主机地址后面的字符都删除了,可以不删除吗?
删除的话有很多链结都取得不对啊!
babam 2004-07-02
  • 打赏
  • 举报
回复
查了一下,大哥是牛人谢谢了
babam 2004-07-02
  • 打赏
  • 举报
回复
相对连接是什么??我是菜鸟
yst_killed 2004-07-01
  • 打赏
  • 举报
回复
下载时候你可以用多线程执行 GetHtml()这个函数
当然了,你需要一个不停的输入URL的程序,这个估计你自己能写吧!

以上程序取道的URL都存在一个文本文件里了,url.txt
yst_killed 2004-07-01
  • 打赏
  • 举报
回复
靠,贴出来怎么这样,你调整一下吧

对了,你还需要
再 StdAfx.h里添加

#pragma warning(disable : 4192)
#pragma warning(disable : 4146)
#import <mshtml.tlb> // Internet Explorer 5
#import <shdocvw.dll>
yst_killed 2004-07-01
  • 打赏
  • 举报
回复
这个东西我做了一个
最好的办法就是下载下这个网页
打开他,查询里面的<href>这个标志
取出全部链接~

BOOL CDghttpDlg::GetHtml(CString SavePath, CString UrlStr, CString UrlName)
{
CInternetSession session;
CInternetFile* file = NULL;
try
{
// 试着连接到指定URL
file = (CInternetFile*) session.OpenURL(UrlStr);
}
catch(CInternetException* m_pException)
{
// 如果有错误的话,置文件为空
file = NULL;
m_pException->Delete();
return FALSE;
}

// 用dataStore来保存读取的网页文件
CStdioFile dataStore;
if (file)
{
CString somecode; //也可采用LPTSTR类型,将不会删除文本中的\n回车符
CString UrlNamePath;
UrlNamePath.Format("%s%s",SavePath,UrlName);
BOOL bIsOk = dataStore.Open(UrlNamePath,CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite | CFile::typeText);
if (!bIsOk)
return FALSE;
// 读写网页文件,直到为空
while (file->ReadString(somecode) != NULL) //如果采用LPTSTR类型,读取最大个数nMax置0,使它遇空字符时结束
{
dataStore.WriteString(somecode);
dataStore.WriteString("\n"); //如果somecode采用LPTSTR类型,可不用此句
}

file->Close();
delete file;
}
else
{
dataStore.WriteString(_T("到指定服务器的连接建立失败..."));
return FALSE;
}

return TRUE;
}


取网页的

接下来是去链接的

void CDghttpDlg::GetAllUrl(CString strPath, CString FileName)
{
// UpdateData(true);
CFile file;
CFileException e;
CString url;
CString str;
str.Format("%s%s", strPath, FileName);
if(file.Open(str,CFile::modeReadWrite,&e))
{
// DWORD TCount;
DWORD byte = file.GetLength();
// m_pro.SetRange(0,byte);
while(byte)
{

char buf[100];
UINT count = file.Read(buf,100);
byte -=count; //因为网页类内容很多所以分块取,count为每次取得字符数量,byte为文件总字符量
for(int i=3;i<100;i++)
{
//判断m_url是不是等于url链接标志符href如果是开始采集url
CString m_url1;
m_url1.Format("%c%c%c%c",buf[i-3],buf[i-2],buf[i-1],buf[i]);
if(m_url1 == "href")
{
url="";
int jcount=0;
if(buf[i+2]=='"')
{//判断是不是"
jcount = i+3;
CString gettemphttp;
gettemphttp.Format("%c%c%c%c%c%c%c",buf[jcount],buf[jcount+1],buf[jcount+2],buf[jcount+3],buf[jcount+4],buf[jcount+5],buf[jcount+6]);
if(gettemphttp!="http://")
continue;
}
else
{
jcount = i+2;
CString gettemphttp1;
gettemphttp1.Format("%c%c%c%c%c%c%c",buf[jcount],buf[jcount+1],buf[jcount+2],buf[jcount+3],buf[jcount+4],buf[jcount+5],buf[jcount+6]);
if(gettemphttp1!="http://")
continue;
}
url+="http://";
for(int j=jcount+7;j<100;j++)
{

if(buf[j]==' '||buf[j]=='>'||buf[j]=='"'||buf[j]=='/')
{
//将取道的url存入文件中并换行
CFile writefile;
CFileException e1;
str.Format("%s%s",strPath,"url.txt");
if(writefile.Open(str,CFile::modeReadWrite,&e))
{
url+="\r\n";
writefile.Seek(0L,CFile::end);
char * urlchar =(LPSTR)(LPCTSTR)url;
writefile.Write(urlchar,url.GetLength());
writefile.Close();
//AfxMessageBox(_T("写文件成功!"));
}
else
{
afxDump << "File could not be opened"<<e1.m_cause<<"\n";
}//结束
i=j;
break;
}
url = url+buf[j];

}
}
}

}
file.Close();
}
else
{
afxDump << "File could not be opened"<<e.m_cause<<"\n";
}
}
xdljf 2004-07-01
  • 打赏
  • 举报
回复
跟踪调试呀,不同的环境,不同的机子,下载下来的东东一般都会有问题的。
babam 2004-07-01
  • 打赏
  • 举报
回复
先谢谢大家,这个代码在debug下运行报错!
yst_killed 2004-07-01
  • 打赏
  • 举报
回复
我没有计算相对连接
babam 2004-07-01
  • 打赏
  • 举报
回复
yst_killed(不会游泳的鱼)
您的程序里取到的sina首页页面链结为592
用vckbase取到的sina首页页面链结为852
为什么呢??
babam 2004-07-01
  • 打赏
  • 举报
回复
我原来的程序已经可以把网页保存到本地。我直接用你的第二个函数
但是函数的参数是什么意思呢??
PiggyXP 2004-06-30
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/comtech/ie/GetLinks21.zip

这里有一份源码的,实现了楼主需要的功能

楼主可以参考一下
PiggyXP 2004-06-30
  • 打赏
  • 举报
回复
首先就是要获得网页的代码

然后就是如同楼上所说,提取里面的字符串就好了

不过链接的标记有不少的,都要一一进行处理
yhqs540 2004-06-30
  • 打赏
  • 举报
回复
把网页代码得到。就有<a href>那个标记啊。去里面的地址就好了
xdljf 2004-06-30
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/listcode.asp?mclsid=17&sclsid=1711

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧