订制一些WEB数据抓取项目时,会遇到需要先登录网站系统,这时候我们通常会做成由系统自动登录的方式。
分析网页
要完成这项功能,首先需要对项目的网页进行分析,找到关键数据项的ID。如下图中的。
1、用户名的ID名称;
2、密码对应的ID名称;
3、登录按钮对应的ID名称。
完成自动登录
我们在Delphi中使用WebBrowser控件来显示处理网页,控件怎么使用暂不在本文中讲述。
直接上内容:
本次项目是在DocumentComplete事件中去处理自动登录的,你也可以自己建一个按钮,通过按钮去登录。
当页面加载完成后,会触发DocumentComplete事件,我们首先使用string(URL).StartsWith 判断是否是登录页面,StartsWith只判断字符串前面部分是否相同,因为有时候URL后面可能会有不同的参数,所以只需要判断前面重要部分就可以。
其次用了CheckBox1.Checked来选择是否需要自动登录,如果需要,则执行自动登录代码
在代码中先创建了一个匿名线程,执行线程内部工作时,DocumentComplete事件代码已执行完成,在线程中,我们先等待400毫秒,用于让浏览器处理完网页页面的其他初始工作。
之后是使用线程同步方式在WebBrowser控件内执行一段JS代码,用JS代码来完成登录工作。
JS代码主要有三条,填写用户名、填写密码、触发登录按钮的点击事件。
主要代码内容
procedure TForm5.WebBrowser1DocumentComplete(ASender: TObject;const pDisp: IDispatch; const URL: OleVariant);
const//用于自动登录JScriptLog = '$(''#username'').val(''%S'');' + #13#10 + //用于填写用户名'$(''#password'').val(''%S'');' + #13#10 + //用于填写密码'$(''#login'').click();'; //触发登录
varBDoc: IHTMLDocument2;BDoc3: IHTMLDocument3;vEFormTime,vEtoTime: IHTMLElement;
beginif WebBrowser1.Application = pDisp thenbeginBDoc := WebBrowser1.Document as IHTMLDocument2;if string(URL).StartsWith('http://XXXX/index.html')then //检查URL是否是监控系统的登录页面beginif CheckBox1.Checked thenbeginTThread.CreateAnonymousThread(procedurebeginsleep(400);TThread.Synchronize(nil,procedurebeginBDoc := WebBrowser1.Document as IHTMLDocument2;//如果是监控系统的登录页面 完成自动登录BDoc.parentWindow.execScript(Format(JScriptLog,[Edit1.Text, Edit4.Text]), 'JavaScript');end);end).Start;end;endelse if string(URL).StartsWith('http://XXXXXX/pages/MainInfo.html') thenbegin//处理其他页面的工作时使用end;end;
end;
其他说明
使用WebBrowser处完成一些指定网页数据提取(或填写)的功能,需要对WebBrowser控件本身的使用比较了解,更重要的是需要针对等处理的网页进行分析,所以必须熟悉HTML、JS(jquery,现在的网站基本会使用到,当然还有一些其他UI框架),还需要了解如何进行网页本地调试与跟踪,某些工作需要在调试中去找内容的。
很多工作会是一些分析与尝试,最后Delphi的实现代码其实会很少的。
转自:https://www.51sjk.com/b194b258947/