lua脚本爬网页数据

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=&currentpage=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=&currentpage=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=&currentpage=%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。
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值