获取网页内容

joanagle 2017-06-02 04:26:34
根据领导要求,抓取某网站的网页内容,我用TIdHTTP 循环来获取网页内容,但是经常在IdHTTP1.Get(url) 这里线程就阻塞了,因为url经常访问不到(有可能是访问的太频繁,被封IP了),程序一直无响应,超崩溃,领导又催的急。
100分跪求各路大侠请问下怎么才能使线程不阻塞,如果url无响应时,能自动不断刷新直到url有响应时继续执行程序;或者说有其他更好的抓网页内容的方法?

代码如下:

ts:=TStringList.Create;
try
for i := 0 to 1000 do
begin
RespData:=TStringStream.Create('');
try
IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';
IdHTTP1.Get(url,RespData);
ts.Add(RespData.DataString);
finally
RespData.Free;
end;
end;
finally
ts.Free;
end;
...全文
1851 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bants 2018-05-07
  • 打赏
  • 举报
回复
不建议用 webbrowser之类的,我以前也用过,效果很烂,还占系统资源。 idhttp的超时设置一下就好了 ReadTimeout := ConnectTimeout :=
喝口水 2017-06-12
  • 打赏
  • 举报
回复
另外你的代码也有点问题, 我给你优化一下

ts:=TStringList.Create;
RespData:=TStringStream.Create('');
IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';
try
  for i := 0 to 1000 do
  begin    
    try      
      IdHTTP1.Get(url,RespData);
      ts.Add(RespData.DataString);
    except      
    end;
  end;
finally
  ts.Free;
  RespData.Free;
end;
修改过后, 你看效果是不是好多了
喝口水 2017-06-12
  • 打赏
  • 举报
回复
给你个建议, 千万别用EWB, 它和webbrower效果没什么两样, 这也会造成网页被频繁的访问, 讲究效率的话, 还是用idhttp好点, 解决网页频繁访问的话, 我给你个思路, 一般网页都是判断客户端IP的, 如果该客户IP频繁访问的话, 会给它出错提示, 解决办法有两个: 1. 使用代理IP, idhttp本身就可以设置, 当一个IP被封后,就换一下IP, 如此就可以长期使用了
  idhttp1.ProxyParams.ProxyServer:='111.11.11.11'; //代理IP
  IdHTTP1.ProxyParams.ProxyPort:=8080;//代理端口
2.伪造IP, 这个比较难一点, 有时间可以研究一下
joanagle 2017-06-07
  • 打赏
  • 举报
回复
引用 11 楼 lyhoo163 的回复:
看到了,你要分步走。EWB打开页面,数据都读完整后,再执行。这样才能读取文本字符。 你的代码,是EWB未读取数据,就获取文本,当然它是空的了。
已经先执行
EmbeddedWB1.Go(url);
然后才读取它的文本字符 所以不太明白你说的“要分步走”的意思?
joanagle 2017-06-06
  • 打赏
  • 举报
回复
引用 9 楼 joanagle 的回复:
[quote=引用 7 楼 lyhoo163 的回复:] [quote=引用 6 楼 joanagle 的回复:] [quote=引用 1 楼 lyhoo163 的回复:] 建议使用EmbeddedWB 获取源码、网页内容:
//  MyList.Add(Tab.EWB.DocumentSource);            // 源码
    MyList.Add(Tab.EWB.DocumentSourceText);        // 文本
我试了这两个,根据拿不到源码和文本呀[/quote] 我的程序中,运行正常。你检查一下,EWB要打开网页后才能通过,这个句获取页面的文本和源码。[/quote] 有打开网页的
 EmbeddedWB1.Go(url);
      Memo1.Lines.Add(EmbeddedWB1.DocumentSourceText);
      ts.Add(EmbeddedWB1.DocumentSourceText);
特意加了MEMO显示,但是执行后MEMO是空的,跟踪检查,EmbeddedWB1.DocumentSourceText显示如下图: [/quote] 我前面说过,主要是因为URL经常访问不到
joanagle 2017-06-06
  • 打赏
  • 举报
回复
引用 7 楼 lyhoo163 的回复:
[quote=引用 6 楼 joanagle 的回复:]
[quote=引用 1 楼 lyhoo163 的回复:]
建议使用EmbeddedWB
获取源码、网页内容:
//  MyList.Add(Tab.EWB.DocumentSource);            // 源码
MyList.Add(Tab.EWB.DocumentSourceText); // 文本


我试了这两个,根据拿不到源码和文本呀[/quote]
我的程序中,运行正常。你检查一下,EWB要打开网页后才能通过,这个句获取页面的文本和源码。[/quote]

有打开网页的
 EmbeddedWB1.Go(url);
Memo1.Lines.Add(EmbeddedWB1.DocumentSourceText);
ts.Add(EmbeddedWB1.DocumentSourceText);


特意加了MEMO显示,但是执行后MEMO是空的,跟踪检查,EmbeddedWB1.DocumentSourceText显示如下图:
lyhoo163 2017-06-06
  • 打赏
  • 举报
回复
看到了,你要分步走。EWB打开页面,数据都读完整后,再执行。这样才能读取文本字符。 你的代码,是EWB未读取数据,就获取文本,当然它是空的了。
joanagle 2017-06-05
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
建议使用EmbeddedWB 获取源码、网页内容:
//  MyList.Add(Tab.EWB.DocumentSource);            // 源码
    MyList.Add(Tab.EWB.DocumentSourceText);        // 文本
我试了这两个,根据拿不到源码和文本呀
大肚肥肥 2017-06-05
  • 打赏
  • 举报
回复
我以前抓小说的代码


procedure TGlobHttpThread.Execute;
var
  URLHTML: TStringStream;
begin
  ConCount := ConCount + 1;
  ResultStr := '';
  Idhttp1 := TIdHTTP.Create(nil);
  Idhttp1.HandleRedirects := True;
  Idhttp1.Request.UserAgent := 'Mozilla/3.0 (compatible)';
  Idhttp1.ProtocolVersion := pv1_1;
  Idhttp1.ReadTimeout := 10000;
  URLHTML := TStringStream.Create('', TEncoding.GetEncoding(936));
  try
    if SearchRes.NeedStream then
    begin
      Idhttp1.Get(GoURL, URLHTML);
      ResultStr := URLHTML.DataString;
    end
    else
      ResultStr := Idhttp1.Get(GoURL);

     // sendmessage 或者 OnTerminate 进行处理

  except
    Idhttp1.Free;
    ResultStr := '';
    if ConCount < 3 then
      Execute;
    Exit;
  end;
  Idhttp1.Free;
  URLHTML.Free;
end;


joanagle 2017-06-05
  • 打赏
  • 举报
回复
引用 2 楼 ckc 的回复:
设置超时 不过你这样搞访问就更频繁,被封也更厉害的 你要设置定时,过一阵子扫描一次就好了,不要频繁去扫
有设置的,成功获取一条,就休眠3分钟
joanagle 2017-06-05
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
建议使用EmbeddedWB 获取源码、网页内容:
//  MyList.Add(Tab.EWB.DocumentSource);            // 源码
    MyList.Add(Tab.EWB.DocumentSourceText);        // 文本
是三方控件吗?谢谢,我试试
lyhoo163 2017-06-05
  • 打赏
  • 举报
回复


效果图。
lyhoo163 2017-06-05
  • 打赏
  • 举报
回复
引用 6 楼 joanagle 的回复:
[quote=引用 1 楼 lyhoo163 的回复:] 建议使用EmbeddedWB 获取源码、网页内容:
//  MyList.Add(Tab.EWB.DocumentSource);            // 源码
    MyList.Add(Tab.EWB.DocumentSourceText);        // 文本
我试了这两个,根据拿不到源码和文本呀[/quote] 我的程序中,运行正常。你检查一下,EWB要打开网页后才能通过,这个句获取页面的文本和源码。
ckc 2017-06-04
  • 打赏
  • 举报
回复
设置超时 不过你这样搞访问就更频繁,被封也更厉害的 你要设置定时,过一阵子扫描一次就好了,不要频繁去扫
lyhoo163 2017-06-03
  • 打赏
  • 举报
回复
建议使用EmbeddedWB 获取源码、网页内容:
//  MyList.Add(Tab.EWB.DocumentSource);            // 源码
    MyList.Add(Tab.EWB.DocumentSourceText);        // 文本

1,593

社区成员

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

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