腳本可以在許多地方使用,以定制Visual Web Ripper 行為或擴(kuò)展標(biāo)準(zhǔn)功能。Visual Web Ripper 腳本為.NET功能可用C#,VB.Net, 或正則表達(dá)式。
腳本可以分為三類:
-
轉(zhuǎn)換腳本
Transformation scripts
: 用于轉(zhuǎn)換一段文本鸣皂。例如恢准,如果你從一個(gè)網(wǎng)頁(yè)中提取一個(gè)地址戳气,但是只需要郵政編碼句各,你就可以把地址轉(zhuǎn)換成郵政編碼吸占。您還可以將此過程視為提取子文本,但有時(shí)您可能不僅僅是提取子文本凿宾。這就是我們稱之為變換的原因旬昭。 -
等待腳本
Wait Script
: 在處理動(dòng)態(tài)內(nèi)容時(shí),在異步加載到網(wǎng)頁(yè)上是很重要的菌湃。當(dāng)AJAX回調(diào)完成時(shí),Visual Web Ripper 無法自動(dòng)確定遍略,因此它等待頁(yè)面上的內(nèi)容發(fā)生變化惧所。您可以使用等待腳本來指定要完成的AJAX回調(diào)需要多長(zhǎng)時(shí)間。 -
擴(kuò)展腳本
Extension Script
: 用于擴(kuò)展 Visual Web Ripper的功能绪杏。后處理腳本是一個(gè)擴(kuò)展腳本的示例下愈,該腳本可以用于將一些定制的業(yè)務(wù)邏輯應(yīng)用到提取的數(shù)據(jù)中。
腳本工具Script Utilities
腳本工具類使在Visual Web Ripper 腳本中訪問數(shù)據(jù)庫(kù)變得更容易蕾久。您可以定義一個(gè)共享腳本數(shù)據(jù)庫(kù)連接势似,該數(shù)據(jù)庫(kù)連接將為項(xiàng)目中的所有腳本提供訪問。在運(yùn)行腳本之前僧著,Visual Web Ripper 會(huì)自動(dòng)打開共享數(shù)據(jù)庫(kù)連接履因,并在腳本完成運(yùn)行后關(guān)閉連接。
您可以通過單擊腳本編輯器中的database按鈕來定義一個(gè)新的腳本數(shù)據(jù)庫(kù)連接或編輯現(xiàn)有的數(shù)據(jù)庫(kù)連接盹愚。
如果您已經(jīng)定義了一個(gè)共享腳本數(shù)據(jù)庫(kù)栅迄,那么Visual Web Ripper 將會(huì)將一個(gè)類WrSharedDatabase的實(shí)例傳遞給所有的腳本函數(shù)。WrSharedDatabase類有以下方法皆怕,不管您訪問的數(shù)據(jù)庫(kù)類型如何毅舆,它們都是相同的。
public void SetSql(string sql)
public void PrepareSql()
public void SetParameterTextValue(string parameterName, string value)
public void SetParameterDateTimeValue(string parameterName, DateTime value)
public void SetParameterIntValue(string parameterName, int value)
public void SetParameterDoubleValue(string parameterName, double value)
public void SetParameterNullValue(string parameterName)
public object ExecuteNonQuery()
public object ExecuteScalar()
public DataSet ExecuteDataSet()
public MySqlDataReader ExecuteMySqlDataReader()
public OleDbDataReader ExecuteOleDbDataReader()
public SqlDataReader ExecuteSqlDataReader()
如果想直接在數(shù)據(jù)庫(kù)連接或命令對(duì)象上工作愈腾,可以使用WrSharedDatabase類的以下屬性憋活。
public SqlConnection SqlConnection;
public MySqlConnection MySqlConnection;
public OleDbConnection OleDbConnection;
public SqlCommand SqlCommand;
public MySqlCommand MySqlCommand;
public OleDbCommand OleDbCommand;
下面的代碼片段顯示了一個(gè)后處理腳本,該腳本使用一個(gè)共享腳本數(shù)據(jù)庫(kù)將提取的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)虱黄。
using System;
using mshtml;
using VisualWebRipper;
public class Script
{
//See help for a definition of WrPostprocessArguments.
public static bool Postprocess(WrPostprocessArguments args)
{
try
{
//First we set the SQL we'll use to insert data into the database table.
//The Database connection has already been set by defining a shared script
//database. Visual Web Ripper will automatically open and close the
//database connection.
args.Database.SetSql
("insert into properties (type,fors,title,description,area)
values (@type,@fors,@title,@description,@area)");
args.Database.PrepareSql();
//The first table contains the start URL. We only have one start URL in
//this project. ChildTableRows returns all rows in the first child table
foreach(WrDataRow finditRow in args.DataTable.ChildTableRows)
{
//The next child table is the page navigation data table
foreach(WrDataRow pageRow in finditRow.ChildTableRows)
{
//The last child table is where the property data is located
foreach(WrDataRow propertyRow in pageRow.ChildTableRows)
{
args.Database.SetParameterTextValue( "@type" ,
finditRow[ "type" ]);
args.Database.SetParameterTextValue( "@fors" ,
finditRow[ "fors" ]);
args.Database.SetParameterTextValue( "@title" ,
propertyRow[ "title" ]);
args.Database.SetParameterTextValue( "@description" ,
propertyRow[ "description" ]);
args.Database.SetParameterTextValue( "@area" ,
propertyRow[ "area" ]);
args.Database.ExecuteNonQuery();
}
}
}
return true ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return false ;
}
}
}
導(dǎo)出腳本Export Script
導(dǎo)出腳本可以用來定制數(shù)據(jù)導(dǎo)出過程悦即。可以使用導(dǎo)出腳本將提取的數(shù)據(jù)導(dǎo)出到數(shù)據(jù)庫(kù)中的自定義數(shù)據(jù)結(jié)構(gòu),也可以將數(shù)據(jù)導(dǎo)出到自定義數(shù)據(jù)源盐欺。
從數(shù)據(jù)導(dǎo)出屏幕中選擇導(dǎo)出腳本赁豆。
當(dāng)您單擊export script按鈕時(shí),導(dǎo)出腳本編輯器會(huì)打開冗美。
The ExportData Method
一個(gè)導(dǎo)出腳本必須有一個(gè)方法魔种,如下所示。
public static bool ExportData(WrExportArguments args)
{
try
{
//Place your export code here.
return true;
}
catch(Exception exp)
{
args.WriteDebug(exp.Message);
return true;
}
}
public static bool ExportData(WrExportArguments args)
ExportData()腳本方法必須有這個(gè)確切的名稱和簽名粉洼,所以只修改方法體节预,而不是方法簽名。該方法返回true属韧,表示成功或false表示失敗安拟。
Name | Type | Description |
---|---|---|
Project | WrProject | The current Visual Web Ripper project. |
ExportData | WrExportData | The extracted data. |
Database | WrSharedDatabase | An open database connection. * See Script Utilities for more information about shared script databases. |
InputDataRow | WrDataRow | The current input data row if an input data source has been defined. * See Using an Input Data Source for more information about input data sources. |
InputParameters | WrInputParameters | Input parameters for the current project. * See Using Input Parameters for more information about input parameters. |
WrExportArguments Properties
Name | Type | Description |
---|---|---|
Project | WrProject | The current Visual Web Ripper project. |
ExportData | WrExportData | The extracted data. |
Database | WrSharedDatabase | An open database connection. * See Script Utilities for more information about shared script databases. |
InputDataRow | WrDataRow | The current input data row if an input data source has been defined. * See Using an Input Data Source for more information about input data sources. |
InputParameters | WrInputParameters | Input parameters for the current project. * See Using Input Parameters for more information about input parameters. |
當(dāng)在調(diào)試模式下運(yùn)行一個(gè)項(xiàng)目時(shí),您可以使用它來將信息寫入調(diào)試窗口中宵喂。
Debugging an Export Script
調(diào)試一個(gè)導(dǎo)出腳本是很困難的糠赦,因?yàn)槟荒茉O(shè)置斷點(diǎn)并通過您的代碼。您可以通過在WrExportArguments類中使用WriteDebug方法來執(zhí)行簡(jiǎn)單的調(diào)試锅棕,返回false表示失敗拙泽。如果單擊數(shù)據(jù)導(dǎo)出屏幕上的Export Existing Data
按鈕,腳本返回false裸燎,則消息框?qū)@示最后的調(diào)試消息顾瞻。
編寫一個(gè)復(fù)雜的導(dǎo)出腳本需要一個(gè)更好的調(diào)試環(huán)境,在這個(gè)環(huán)境中德绿,您可以遍歷代碼并查看變量的內(nèi)容荷荤。您可以創(chuàng)建一個(gè)簡(jiǎn)單的。在您的正常開發(fā)環(huán)境中移稳,例如Visual Studio中蕴纳,NET測(cè)試應(yīng)用程序。當(dāng)配置秒裕。使用Visual Web Ripper API的NET應(yīng)用程序袱蚓,遵循以下步驟:
- 添加對(duì)Visual Web Ripper API DLLs的引用,它位于Visual Web Ripper安裝文件夾中几蜻。您應(yīng)該至少包括WebRipper.dll文件喇潘。
- 平臺(tái)目標(biāo)必須是x86。
- 應(yīng)用程序必須使用 .NET framework v4
.NET 測(cè)試應(yīng)用程序應(yīng)該為您的項(xiàng)目加載導(dǎo)出數(shù)據(jù)梭稚,然后調(diào)用ExportData方法颖低,如下所示。當(dāng)您的測(cè)試應(yīng)用程序工作時(shí)弧烤,您可以直接將ExportData方法復(fù)制到Visual Web Ripper 腳本編輯器中忱屑。
using System;
using System.Collections.Generic;
using System.Text;
using VisualWebRipper;
namespace DataExport
{
class Program
{
static void Main(string[] args)
{
WrProject project = WrProject.LoadByName("projectName");
WrExportData data = project.OpenExportedData();
WrExportArguments exportArgs = new WrExportArguments(data, project);
ExportData(exportArgs);
}
public static bool ExportData(WrExportArguments args)
{
try
{
//First we set the SQL we'll use to insert data into the database table.
//The Database connection has already been set by defining a shared script
//database. Visual Web Ripper will automatically open and close the
//database connection.
args.Database.SetSql("insert into properties (type,fors,title,description,area) values (@type,@fors,@title,@description,@area)");
args.Database.PrepareSql();
//Loop htough all eth export tables
foreach (WrExportTableDefinition table in args.ExportData.TablesDefinitions.Tables)
{
//Open a data reader for the current table
WrExportTableReader reader = args.ExportData.GetTableReader(table.TableName);
try
{
//Loop though all rows in the current data table and write them to the target database.
while (reader.Read())
{
args.Database.SetParameterTextValue("@type",
reader.GetStringValue("type"));
args.Database.SetParameterTextValue("@fors",
reader.GetStringValue("fors"));
args.Database.SetParameterTextValue("@title",
reader.GetStringValue("title"));
args.Database.SetParameterTextValue("@description",
reader.GetStringValue("description"));
args.Database.SetParameterTextValue("@area",
reader.GetStringValue("area"));
args.Database.ExecuteNonQuery();
}
}
finally
{
reader.Close();
}
}
return true;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return false;
}
}
}
}