如何整个网站的所有超链接,大家讨论一下。。。。

mytion 2011-05-31 09:03:07
如何整个网站的所有超链接,大家讨论一下。。。。
我的思路有两种:
1。webbrowser
2。HTTP
3。socket

不知道大家有何好的想法?欢迎讨论,提出想法。
...全文
249 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
youyidianmimang 2011-07-22
  • 打赏
  • 举报
回复
不太实际吧 用href?;很多用 action 等后台直接返回一个动态网页来;而且地址栏都不变动的;怎么搞?
lankii 2011-07-18
  • 打赏
  • 举报
回复
刚好在实现了这样的功能,我的是还要查找里面的Email地址
初步测试成功

r,e:TRegExpr;
link:string;
begin
idp.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; TheWorld)';
memo1.Text:=idp.Get(trim(edit1.text));
r:=TRegExpr.Create;
e:=TRegExpr.Create;


//HTTP: '^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^\"\"])*$'
//href="*[A-Za-z0-9\.\/\/=\?%\-&_\\\':+!]*[email|abort|contact|serv|sendmessage]+
r.Expression:='(http://)*[0-9a-zA-Z\/=\?%\-&_\\\.:]*(contact|about|lianxi|email|service|support|send)+[0-9a-zA-Z\/=\?%\-&_\\\.]*';
e.Expression:='[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';

if not connDB then showmessage('数据库链接失败!');
if r.Exec (memo1.text) then begin

repeat
if pos('http',r.Match[0])=0 then
link:=trim(edit1.text)+'/'+r.Match[0]
else
if pos('https',r.Match[0])=0 then
link:=r.Match[0]
else
r.ExecNext;

link:=stringreplace(link,'//','/',[rfreplaceall]);
if pos('http://',link)=0 then
link:=stringreplace(link,'http:/','http://',[rfreplaceall]);
memo2.Lines.Add(link);



with dm.query do begin
Close;
sql.Clear;
sql.Add('select * from linkList where link='+quotedstr(link));
open;
if recordcount=0 then begin
Append;
FieldByName('link').value:=link;
FieldByName('addTime').value:=now();
FieldByName('lKeyId').value:='0';
post;
end;

end;
until not r.ExecNext;
end;

r.Expression:='[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';
with dm.query do begin
close;
sql.Clear;
sql.Add('select lid,link from linkList where sendTime is null');
open;
showmessage(fieldbyname('link').asstring);
while not eof do begin
try
if r.Exec(idp.Get(trim(fieldbyname('link').AsString))) then begin
with Tadoquery.create(nil) do begin
connection:=dm.conn;
repeat;
Close;
sql.Clear;
sql.Add('select * from linkList where link='+quotedstr(link));
open;
if recordcount=0 then begin
Append;
FieldByName('link').value:=link;
FieldByName('addTime').value:=now();
FieldByName('lKeyId').value:='0';
post;
end;
until not r.ExecNext;
free;
end;


end else begin
//link:='delete from linkList where lid='+fe;

end;
except
r.ExecNext;
end;
end;

end;
r.free;
end;

procedure TEmail.CheckBox6Click(Sender: TObject);
begin
showmessage('因为google经常给墙,所以不建议使用,用yahoo!');
end;
zhuang_bx 2011-06-11
  • 打赏
  • 举报
回复
用socket,占用资源低,速度快,如果只是提取各网页中的A 链接,还是可以的
ADSLAN 2011-06-01
  • 打赏
  • 举报
回复
对于一些没有主域名的类似 /u/20110531/09/2d4b51cf-f7c5-498e-bb04-b878e4ffa47b.html 这样的正则方便提取吗?
用webbrowser 遍历又感觉太费资源。
Frank.WU 2011-06-01
  • 打赏
  • 举报
回复
自己搞个网络爬虫对指定网站抓呀抓。。。
haitao 2011-05-31
  • 打赏
  • 举报
回复
还要考虑有些url是js动态生成的。。。。。。。。。
SQLDebug_Fan 2011-05-31
  • 打赏
  • 举报
回复
可以先获取网站的所有页面,然后分析每个页面的链接地址。
god00 2011-05-31
  • 打赏
  • 举报
回复
使用com接口,

ihtmldocument2(webbrowser.documnet).documentelement.innerhtml; // 获取源码;

IHTMLElementCollection(ihtmldocument2(webbrowser.documnet).all.tags('A')); //获取A标签合集;

后面的,你自己搞定了,也是用com接口完成,追加 for 循环判断。

一如当初 2011-05-31
  • 打赏
  • 举报
回复
同意3楼,Get到源码,再用正则提取
dropme 2011-05-31
  • 打赏
  • 举报
回复
用idhttp.get出源码,用正则或者pos找<a herf= 开头的, </a>结束的行不?
bdmh 2011-05-31
  • 打赏
  • 举报
回复
webbrowser,遍历里面的href,然后对每一个链接后台在打开,依次递归
sharebei 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 mytion 的回复:]
如何整个网站的所有超链接,大家讨论一下。。。。
我的思路有两种:
1。webbrowser
2。HTTP
3。socket

不知道大家有何好的想法?欢迎讨论,提出想法。
[/Quote]

整个?????

神马意思.
独醒子 2011-05-31
  • 打赏
  • 举报
回复
找的方法上面都说了 ,就不多说了

哈 就说2个问题:

1、网站都是动态的,完全获取整个,不可能的。
比如flash里的链接,就不好获取。

2、另外,大多数网站都有外部链接到其他网站。
比如你抓新浪网,上面有个链接是到腾讯网站的,腾讯网站有个是到搜狐网站的。。。。
如果你这么找下去,啥时候能结束呢?
呵呵
估计这么一直爬下去,你有可能抓出所有互联网链接。

嘿,这些数据,你可以做个简单搜索引擎啦 哈哈

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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