问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

lua 以表的方式传入一个list 循环访问表中全部网址 并抓去网页内容 怎...

发布网友 发布时间:2024-01-18 11:00

我来回答

1个回答

热心网友 时间:2024-07-28 03:50

将以下代码保存为fetchhtml.lua:

#!/usr/bin/env lua 
socket = require "socket"

-- download() 用来抓取网页内容
function download (host, file)
    local c = assert(socket.connect(host, 80))
    local count = 0
    local h = ""
    -- counts number of bytes read
    c:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
    while true do
        local s, status = receive(c)
        h = h .. s
        count = count + #s
        if status == "closed" then 
            html_page[host .. file] = h
            break 
        end
    end
    c:close()
    print(host, file, count)
end

-- receive() 向远端服务器一次请求接收1k字节网页内容
function receive (connection)
    connection:settimeout(0.5)
    -- do not block
    local s, status, partial = connection:receive(2^10)
    if status == "timeout" then
        coroutine.yield(connection)
    end
    return s or partial, status
end

-- 采用非抢占多任务机制,避免多个下载任务之间出现阻塞
threads = {}
function get (host, file)
    -- create coroutine
    local co = coroutine.create(function ()
        download(host, file)
    end)
    -- insert it in the list
    table.insert(threads, co)
end
function dispatch ()
    local i = 1
    while true do
        if threads[i] == nil then
            if threads[1] == nil then 
                break 
            end
            i = 1
        end
        local status, res = coroutine.resume(threads[i])
        if not res then
            table.remove(threads, i)
        else
            i = i + 1
        end
    end
end

-- 程序主体

-- 打开并读取文件,构造list
f = assert(io.open("html_list.txt", "r"))
lines = {}
for line in f:lines() do 
    lines[#lines + 1] = line 
end
f:close()

-- 循环访问表中全部网址,并获取网页内容
html_page = {}
for i, l in ipairs(lines) do 
    print(i, l) 
    host = l
    file = "/index.html"
    get(host,file)
end
dispatch()

-- 获取结果打印出来
for k,v in pairs(html_page) do
    print(k)
    print(v)
end

编辑文本文件html_list.txt:

www.lua.org
www.debian.org

测试结果:

moose@debian:~/Code/baidu_knowledge/lua_fetchhtml$ ./fetchhtml.lua 
1    www.lua.org
2    www.debian.org
www.debian.org    /index.html    774
www.lua.org    /index.html    591
www.debian.org/index.html
HTTP/1.1 200 OK
Date: Sun, 29 Mar 2015 09:00:27 GMT
Server: Apache
Last-Modified: Wed, 17 Apr 2013 12:05:34 GMT
ETag: "369d5b7f-1d6-4da8d4d9c01c7"
Accept-Ranges: bytes
Content-Length: 470
Vary: Accept-Encoding
X-Clacks-Overhead: GNU Terry Pratchett
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
   <TITLE>Welcome to senfter!</TITLE>
</HEAD>
<BODY>
<H1>Welcome to senfter!</H1>
This is senfter, a system run by and for the <a href="http://www.debian.org/">Debian Project</a>.
She does stuff.
What kind of stuff and who our kind sponsors are you might learn on
<a href="http://db.debian.org/machines.cgi?host=senfter">db.debian.org</a>.
<P>
<HR NOSHADE />
<FONT size="-1">DSA</FONT>
</BODY>
</HTML>
www.lua.org/index.html
HTTP/1.0 302 Moved Temporarily
Connection: close
Date: Sun, 29 Mar 2015 09:00:26 GMT
Server: Cherokee
Location: http://www./index.html
Content-Type: text/plain
URI: http://www./index.html
Content-Length: 348
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>302 Moved Temporarily</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>302 Moved Temporarily</h1>
The document has moved <a href="http://www./index.html">here</a>.
<p><hr>
Cherokee web server, Port 80
</body>
</html>


有关知识点参考《Programming in Lua》第三版中以下章节:
-- 5 Functions
-- 9.4 Non-Preemptive Multithreading
-- 22.1 The Simple I/O Model
-- 22.2 The Complete I/O Model


声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 繁庶的词语繁庶的词语是什么 闹村中村到苍南有多少公里 我的命运是否会有变数? 战地精英无限金币钻石版 西门子MM430变频器,快速调试结束后P3900设不了1,为什么?可能是什么... 天梭力洛克皮表带有哪些类型? 步步惊心十爷和明玉结局 关于教师节感恩的句子 教师节的感恩句子,简短 沉香能和银饰品一齐佩戴吗?? 我的世界超能力模组手机版如何下载 男友让我写一千字检讨是为什么 西门子变频器err04故障怎么解决? 西门子变频器显示no communication什么意思? 珠串练练看之沉香手串,银饰不能和沉香接触,要不沉香会氧化! 绝地枪王中于毅演的是如何下载 Olay大红瓶适合秋冬季用吗? 步步惊心十阿哥扮演者是谁 北极甜虾炸了还能吃吗 tg上传视频好慢 工地主要负责干些什么活? ...白色的状的小豆,用手一挤会出白的,听说叫闭合性油脂拴,我想知道是... 网页链接,list?cid=55 这个是连接在哪里? ETF基金的发行量取决于()A基础指数B投资者的数量C每构造单位净值的高低... 男朋友晚上不要我出去,然后他就生气,他让我写100字检讨书 安全行为观察卡怎么写 和ear相关的英语单词你知道多少? 沉香和银作用对身体好吗 ...水变成水蒸气与属于___变化,电解水属于___变化. 保定有几个大学? 有关于诚信的小故事 观察记录卡怎么画 HSE观察与沟通卡如何填写 1度电转换多少动能? 微风吊扇通电后扇叶转动,此过程中___能转化为动能.拔下插头,在插头处接... 适用于中子的防护材料有 王妍的个姓签名 泰国是免签还是落地签 顶上喷漆线型灯卡槽需要保护么 ...她天天都在发商品信息 我也在那里买过几次鞋 这样的微商可靠吗...