|
火车头用户兼一个程序员的建议
再次发表 只希望作者看到!每次采集我都要修改源代码,真希望作者能做出我们需要的软件。
看到第三版的火车头我很心痛。虽然功能越来越多,但是内存暴增,采集遗漏的问题非常突出。作为一个程序员,我实在忍受不了自己动手用delphi做了旅游市场的采集。
采集一定要分步骤。
第一步,目标采集网址最终内容页地址数组的生成。这点火车头做的很好没说的。
第二步。先把目标页下载下来,保存在本地硬盘上,拜托别和我说远程采集,服务器会断网,你自己拨号也会断,在网上什么事情都会发生。老老实实的保存到本地硬盘来吧。别说内存读取,都是没用的,保存到本地看得到的才是最重要的,今天这个数据网上会有,明天就会没得了。
第三步 才是采集。可能我采集要修改参数。每次都要变。改个四五次就要重新读取服务器4 5边,说不定对方看到来源ip异常马上就中断服务了。所以 第二步很重要
火车头每次只能读取3000-5000内容页问题出在这里,得先保存到硬盘!!!别再一边读一边写数据库了。事实证明会出错。
第四步发布到远程数据库上。这点火车头做的很好没说的。
错误就在互联网是不可预测的 一切得先下载下来才是正确之路。
我自己编就是用delphi编一个读取本地文件数据分离的程序。我文件下载用 offline explorer搞定了。offline explorer可以利用ie的cookie登录。 登录问题解决。
我的目的是不能少一篇文章。现在的火车头太不稳定。按照我的方法60000的数据没有出错过
最近又采集了3000多房源信息 真希望作者能看到我的呼声。
网址www.youyou8.com看我的内容是多少 音乐 酒店 机票
附上delphi源代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, ADODB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Query1: TADOQuery;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
function UnicodeEncode(Str:string;CodePage:integer):WideString;
var
Len:integer;
begin
Len:=Length(Str)+1;
SetLength(Result,Len);
Len:=MultiByteToWideChar(CodePage,0,PChar(Str),-1,PWideChar(Result),Len);
SetLength(Result,Len-1); //end is #0
end;
function UnicodeDecode(Str:WideString;CodePage:integer):string;
var
Len:integer;
begin
Len:=Length(Str)*2+1; //one for #0
SetLength(Result,Len);
Len:=WideCharToMultiByte(CodePage,0,PWideChar(Str),-1,PChar(Result),Len,nil,nil);
SetLength(Result,Len-1);
end;
function Big52Gb(Str:string):string;
begin
Result:=UnicodeDecode(UnicodeEncode(Str,cp_utf8),936);
// SetLength(Result,Length(Str));
// LCMapString(GetUserDefaultLCID,LCMAP_SIMPLIFIED_CHINESE,
// PChar(Str),Length(Str),
// PChar(Result),Length(Result));
end;
Function midstr(var jsrc:string;jstart,jend:string):string;
var
jstartlen,jstartpos,jendpos:Integer;
jsrc1,jsrc2:string;
begin
jstartlen:= Length(jstart);
jstartpos:=pos(jstart,jsrc);
if jstartpos>0 then
begin
jsrc1:=copy(jsrc,jstartpos+jstartlen,length(jsrc)-jstartpos);
jendpos:=pos(jend,jsrc1)-1;
jsrc2:=StringReplace(copy(jsrc1,1,jendpos), '''', '', [rfReplaceAll]);
jsrc:=copy(jsrc,pos(jsrc2,jsrc)+Length(jsrc2),Length(jsrc));
//jsrc:='';
result:=jsrc2;
end
else
begin
result:='';
end
end;
var
i:Integer;
txtfile : TStringList;
jdir,jprice,jdescription,jpic,src,f1,jtitle,jname,jmob,jmail,jmsn,jtel,jfax,jaddr,jqq:string;
begin
txtfile := TStringList.Create;
for i:=135 to 4709 do
begin
f1:='d:\y\y\HotelInfo-'+inttostr(i)+'.html';
if fileexists(f1)=false then
else
begin
txtfile.LoadFromFile(f1);
src:=Big52Gb(txtfile.Text);
jtitle:=midstr(src,'<title id="hotelTitle">','预订');
jtitle:=jtitle+' '+midstr(src,'<span id="lblHotelGrade" title="','"');
jpic:=midstr(src,'target=''_blank''><img src=''','''');
jdescription:=midstr(src,'<span id="lblIntro" Display="none" style="DISPLAY: none">','</span>');
jdescription:=jdescription+midstr(src,'<!--酒店位置信息开始-->','<!--酒店位置信息结束-->');
//jdescription:=jdescription+midstr(src,'<!--酒店房型信息开始-->','<!--酒店房型信息结束-->');
jprice:=midstr(src,'协议底价¥','.');
Query1.Sql.Text:='insert into c (url,title,dir,price,pic,description) values('''+f1+''','''+jtitle+''',''2203'','''+jprice+''','''+jpic+''','''+jdescription+''')';
//memo1.Text:=Query1.Sql.Text;
Query1.ExecSQL;
end;
end;
end;
end. |
|