1、通过Fiddler获取要爬取的页面的相关参数,并记录该URL
(“https://www.letpub.com.cn/index.php?page=dict&level1=%E5%8C%BB%E5%AD%A6&level2=%E5%BF%83%E8%A1%80%E7%AE%A1%E7%97%85%E5%AD%A6&k=¤tpage=2”)
2、具体步骤:
1、SearchByString 检索
2、输出“任务”检索式
3、输出检索到的数据
4、检索结束
5、GetRows 输出每页条数
6、再检索
7、输出“任务”检索式
8、输出检索到的数据
9、检索结束
10、GetResult 输出数据
11、Analyse 分析切割数据
12、ConvertToXML 将数据转为XML格式
13、转XML结束
14、分析结束
15、输出最终XML数据
3、大致流程:
4、相关代码:
SITE_ID = 0x8000 --任务ID
SITE_DESCRIPTION = "SCI"
Flag_IsDebug = 1 --是否记录Debug标志位
Flag_RecordPerPage = 10 --记录数
Flag_PageNum = 1 --页数
Home_Url = "http://www.letpub.com.cn/" --主页
My_Task = "" --任务
Get_TaskStr1 = "" --任务中的前一个字符串
Get_TaskStr2 = "" --任务中的后一个字符串
Get_Data = "" --服务器返回的数据
Final_XmlData = "" --切割解析完的最终XML数据
--[[
*****************************
--将信息打印到debug
--DataName:数据名
--DataValue:数据的值
****************************
]]--
function DebugToFile(DataName,DataValue,...)
if Flag_IsDebug ~= 1 then --判断标志位,是否要写入debug
return
end
local file = io.open(".\\debug.log","ab+") --打开文件(追加、二进制)
if DataValue == nil then --若值为空,用换行代替
DataValue = "\r\n"
end
if type(DataValue) == "table" then --若值为表类型,需要解析拿出表内val
file:write(DataName .. ":====")
file:write("===The following is a table value===\r\n")
file:write("===Table start===")
for i,j in pairs(DataValue) do
file:write(i .. ":===" .. j .. "\r\n")
end
file:write("===Table end===\r\n")
file:write("\r\n")
else
file:write(DataName .. ":===" .. DataValue .. "\r\n") --若值不为表类型,直接赋值
file:write("\r\n")
end
local len = #arg --多余传参个数
if len ~= 0 then --如果个数不为0,则记录在debug中
for i,j in pairs(arg) do
file:write(j .. " ")
end
file:write("\r\n\r\n")
end
file:close() --关闭文件
end
--[[
**************************
--将参数转为XML格式
--number:序号
--name:中文名
--ename:英文名
--Type:类型
**************************
]]--
local function ConvertToXML(number,name,ename,subType)
if number==nil or name==nil or ename==nil or subType==nil then --如果有一个数据为空,则返回
return ""
end
xmltemp = "<data seq_no=\"" .. tostring(number) .. "\">\r\n" --拼接序号
xmltemp = xmltemp .. "<subject subject_name=\"" .. name .. "\" " --拼接中文名
xmltemp = xmltemp .. "subject_ename=\"" .. ename .. "\" " --拼接英文名
xmltemp = xmltemp .. "subject_type=\"" .. subType .. "\"/>\r\n" --拼接类型
xmltemp = xmltemp .. "</data>\r\n"
return xmltemp --返回拼接的字符串
end
--[[
******************************
--对特殊字符进行转义
--str:需要转义的字符串
******************************
]]--
local function ReplaceSign(str)
if str==nil then
return nil
end
str = string.gsub(str,"%%","%%%%")
str = string.gsub(str,"%.","%%.")
str = string.gsub(str,"%?","%%?")
str = string.gsub(str,"%*","%%*")
str = string.gsub(str,"%+","%%+")
str = string.gsub(str,"%-","%%-")
str = string.gsub(str,"%^","%%^")
str = string.gsub(str,"%$","%%$")
str = string.gsub(str,"%[","%%[")
str = string.gsub(str,"%(","%%(")
str = string.gsub(str,"%)","%%)")
return str
end
--[[
*********************************
--获取str中startStr和endStr之间的字符串(先切出startStr之后的字符串,再在该基础上切出endStr之前的字符串)
--str:原字符串
--startStr:起始字符串
--endStr:终止字符串
*********************************
]]--
local function GetTextValue(str,startStr,endStr)
if str==nil or startStr==nil or endStr==nil then --如果有一个数据为空,则返回
return ""
end
local i,j=0,0
startStr = ReplaceSign(startStr) --先转义
i,j = string.find(str,startStr) --查找startStr的起始下标和结束下标
if i==nil or j==nil then --若查找失败,记录到debug中
DebugToFile("GetTextValue find startStr failed")
return ""
end
str = string.sub(str,j+1,-1) --切割获取startStr之后的字符串
if str==nil then
return ""
end
local x,y=0,0
endStr = ReplaceSign(endStr)
x,y = string.find(str,endStr)
if x==nil or y==nil then
DebugToFile("GetTextValue find endStr failed")
return ""
end
str =string.sub(str,1,x-1) --获取endStr之前的字符串
if str==nil then
return ""
end
return str
end
--[[
************************************
--检索网页,返回检索到的记录数
************************************
]]--
function SearchByString()
DebugToFile("===SearchByString start===")
Flag_IsByString = 1
local search = luaParseSingleParmeter() --从本地任务文件中获取相关字段(在C当中)
My_Task = luaConvertANSIToUTF8(search) --转换编码为UTF8(在C当中)
DebugToFile("SearchByString-My_Task",My_Task) --输出任务到debug
Get_TaskStr1,Get_TaskStr2 = string.match(search,"(.+)@type@(.+)")
luaCloseSession() --(在C当中)
luaConnect(Home_Url) --连接主页(在C当中)
--向服务器发起请求,获取服务器返回的数据(在C当中)
Get_Data = luaFetchGet("https://www.letpub.com.cn","/index.php?page=dict&level1=%E5%8C%BB%E5%AD%A6&level2=%E5%BF%83%E8%A1%80%E7%AE%A1%E7%97%85%E5%AD%A6&k=¤tpage=2")
Final_XmlData = Get_Data
DebugToFile("SearchByString-HTMLdata",Get_Data) --将返回的数据输出到debug
DebugToFile("===SearchByString end===")
return 10 --返回指定的数据条数
end
--[[
*************************************
--从获取的数据中切割出指定数据(中文名、英文名、类别),并转成XML格式
--返回值:
--1:最终的XML字符串数据
--2:A_ID,对处理后的Html数据转xml的,A_ID为5,否则保持不变
--3:处理结果
*************************************
]]--
function Analyse()
DebugToFile("===Analyse Data Start===")
local count = string.match(Get_Data,"<span class=\"red\">(%d+)</span>") --获取数据总数
xmlTitle = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<scholarWorks>\r\n" --XML标题
local num=0
local xmlData = ""
local usefulData = GetTextValue(Get_Data,"<div class=\"results\">","</div>") --从服务器返回的数据中切割出需要的字符串范围
DebugToFile("===ConvertToXML start===")
for val in usefulData:gmatch("</tr><tr><td>(.-)<td><a") do --从上一步切割的字符串中再切割取出符合条件的迭代器(即一条条数据段)
num = num+1 --序号
name = val:match("(.-)</td>") --中文名
ename = val:match("<td>(.-)</td><td>") --英文名
subType = GetTextValue(val,ename .. "</td><td>","</td>") --类型
xmlData = xmlData .. ConvertToXML(num,name,ename,subType) --转成XML格式,并拼接起来几条数据
end
Final_XmlData = xmlTitle .. xmlData .. "</scholarWorks>"
DebugToFile("===ConvertToXML end===")
DebugToFile("===Analyse Data end===")
return Final_XmlData,0,0 --返回最终的XML数据
end
function GetResult()
DebugToFile("===GetResult start===")
DebugToFile("GetResult-Final_XmlData",Final_XmlData)
if Final_XmlData ~= "" and Final_XmlData ~= nil then
return Final_XmlData
end
DebugToFile("===GetResult end===")
return ""
end
function GoPage()
DebugToFile("===GoPage start===")
local currentPage = 0
currentPage = luaParseSingleParmeter()
DebugToFile("GoPage-currentPage",currentPage)
Flag_PageNum = currentPage
NextUrl = string.format("index.php?page=dict&level1=%s&level2=%s&k=¤tpage=%d",Get_TaskStr1,Get_TaskStr2,Flag_PageNum)
Get_Data = luaFetchGet("https://www.letpub.com.cn/",NextUrl)
DebugToFile("GoPage-NextUrl",NextUrl)
DebugToFile("===GoPage end===")
return Final_XmlData,0
end
function GetRows()
DebugToFile("GetRows-Flag_RecordPerPage",Flag_RecordPerPage)
return Flag_RecordPerPage
end
function PageDown()
return Final_XmlData, 0
end
function PageUp()
return Final_XmlData, 0
end
5、脚本文件放在script目录下,使用db2.exe,系统从ph.csv中读取“任务”并调试。生成的xml数据在data目录下,相关日志在log目录下,输出debug文件为debug.log。