注册 登录
编程论坛 VFP论坛

如何将《吃喝玩乐之重生1997》全部章节网址和全文爬下来

王咸美 发布于 2025-11-20 10:45, 710 次点击
如何将《吃喝玩乐之重生1997》全部章节网址和全文爬下来?
网页地址为:http://www.
我想将各章节网址存入表文件URL.dbf中  字段有 章节 C(10),标题 C(50),网址 C(60) 最后根据URL.dbf中的 “网址”将小说各章节爬下来,请高手赐教,万分感谢!(前面发过类似帖子,无奈电脑打不开网页,这次小说能在电脑中打开,故再次求助)
只有本站会员才能查看附件,请 登录
19 回复
#2
yiyanxiyin2025-11-20 11:44
问ds嘛:
程序代码:
# 定义小说页面URL
$novelUrl = "http://www./105790648/"

# 设置请求头,模拟浏览器访问
$headers = @{
    "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    "Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
    "Accept-Language" = "zh-CN,zh;q=0.9,en;q=0.8"
}

try {
    Write-Host "正在下载网页内容..." -ForegroundColor Yellow
   
    # 使用Invoke-WebRequest下载网页内容
    $response = Invoke-WebRequest -Uri $novelUrl -Headers $headers -UseBasicParsing
   
    # 获取HTML内容
    $htmlContent = $response.Content
   
    Write-Host "网页下载成功!" -ForegroundColor Green
   
    # 创建HTML文档对象
    $html = New-Object -ComObject "HTMLFile"
    $html.IHTMLDocument2_write($htmlContent)
   
    # 查找所有章节链接
    $chapterLinks = $html.getElementsByTagName("a") | Where-Object {
        $_.href -like "
*/105790648/*.html" -and $_.title -match "^第\d+章"
    }
   
    Write-Host "找到 $($chapterLinks.Count) 个章节链接" -ForegroundColor Cyan
   
    # 提取章节信息
    $chapters = @()
    foreach ($link in $chapterLinks) {
        $chapters += [PSCustomObject]@{
            ChapterNumber = if ($link.title -match "第(\d+)章") { [int]$matches[1] } else { 0 }
            Title = $link.title
            URL = $link.href
        }
    }
   
    # 去重并按照章节号排序
    $uniqueChapters = $chapters | Sort-Object ChapterNumber -Unique
   
    # 输出结果
    Write-Host "《吃喝玩乐之重生1997》章节列表(共 $($uniqueChapters.Count) 章)" -ForegroundColor Green
    Write-Host "=" * 80
   
    # 显示所有章节
    $uniqueChapters | Format-Table -Property ChapterNumber, Title, URL -AutoSize
   
    # 导出到CSV文件
    $csvPath = "吃喝玩乐之重生1997_章节列表.csv"
    $uniqueChapters | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
    Write-Host "章节信息已导出到: $csvPath" -ForegroundColor Yellow
   
    # 显示统计信息
    Write-Host "`n统计信息:" -ForegroundColor Cyan
    Write-Host "总章节数: $($uniqueChapters.Count)" -ForegroundColor White
    Write-Host "第一章: $(($uniqueChapters | Sort-Object ChapterNumber | Select-Object -First 1).Title)" -ForegroundColor White
    Write-Host "最新章: $(($uniqueChapters | Sort-Object ChapterNumber -Descending | Select-Object -First 1).Title)" -ForegroundColor White
   
} catch {
    Write-Host "错误: $($_.Exception.Message)" -ForegroundColor Red
    Write-Host "可能的原因:" -ForegroundColor Red
    Write-Host "1. 网络连接问题" -ForegroundColor Red
    Write-Host "2. 网站访问限制" -ForegroundColor Red
    Write-Host "3. 网页结构发生变化" -ForegroundColor Red
}
  以上为powershell代码, 执行通过
#3
王咸美2025-11-20 12:09
谢谢!windows xp系统,IE浏览器,用VFP代码如何爬下来?

[此贴子已经被作者于2025-11-20 16:25编辑过]

#4
yiyanxiyin2025-11-20 16:57
你这个网页就是纯文本解析就可以了, 完全可以不用解析html, 页面内容下载后直接使用正则分析, 提取文本,  这样更通用高效,  如果那种js动态生成的html, 你需要解析html, 或者分析js的数据源,比如百度文库,微信读书可能都是加了密或者编了码的,解析html是没用的, 文字显示在canvas上,没法从canvas上取到文字, 你还得分析js的数据来源, js代码是如何将文字显示出来的,  这些就不是那么容易了,你要分析清楚不是不可能, 那是相当复杂,  但终极大法就是傻瓜法:截屏ocr, 现在ocr对纯文字的准确度已经非常高了,只是你可能需要GPU

[此贴子已经被作者于2025-11-20 17:11编辑过]

#5
王咸美2025-11-20 21:11
谢谢指点!
#6
foxfans2025-11-20 21:19
一问一答~~
#7
hsfisher7 天前 08:28
种个草,学习学习
#8
王咸美7 天前 08:35
这次要下载的小说《吃喝玩乐之重生1997》与之前下载的小说《仙道九绝》有所不同:
每个章节网址没有规律可循;
每个章节大多有三页,可能还有两页、一页的情况;
另我的浏览器是IE浏览器,系统是windows xp。
不知如何下载? 恳请高手不吝赐教,万分感谢!!!

[此贴子已经被作者于2025-11-21 09:22编辑过]

#9
yiyanxiyin7 天前 10:06
不要管章和一章多少页, 从整本书的第一页开始,每一页都有下一页的链接   (页面中的“下一章”实际上是下一页)
#10
吹水佬7 天前 19:39
回复 8楼 王咸美
哪个章节有多页?
具体问题要准确提出来,怕人家没时间去模糊查找。
#11
王咸美7 天前 20:16
谢谢各位的热心指点!不好意思!章节太多没有仔细看,我怕万一出现这种状况不好处理。如何用老式IE浏览器下载各章节小说?还请高手赐教,再次谢谢🙏
#12
吹水佬7 天前 21:48
回复 11楼 王咸美
什么破网,目录有两套,对应的章节内容也有差别,说不定也是从哪复制来的。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


#13
王咸美7 天前 22:59
不知为何我的电脑上目录页打不开,先结贴吧。

[此贴子已经被作者于2025-11-21 23:20编辑过]

#14
吹水佬7 天前 23:30
没看头,内容缺失、乱码等,如第3章。

只有本站会员才能查看附件,请 登录

简单测试代码,只作参考,不能照抄。
程序代码:

SET DEFAULT TO (ADDBS(JUSTPATH(SYS(16))))
DECLARE long PostMessageA IN user32 long,long,long,long
IF !FILE("吃喝玩乐之重生1997.dbf")
    CREATE TABLE 吃喝玩乐之重生1997 (title C(100), addr C(254), txt M)
    USE
ENDIF
USE 吃喝玩乐之重生1997 ALIAS tu
of = CREATEOBJECT("form1")
of.show(1)
CLOSE TABLES ALL
CLEAR ALL
RETURN

DEFINE CLASS form1 as Form
    width = 800
    height = 600
    AutoCenter = .T.
    AllowOutput = .f.
    ADD OBJECT but as commandbutton WITH left=10,top=10,width=100,height=22,caption="开始"
    ADD OBJECT grd as grid WITH left=10,top=40,width=250,height=550,RecordSource="tu",AllowCellSelection=.f.
    ADD OBJECT edt as editbox WITH left=280,top=40,width=510,height=550
    ADD OBJECT web as Olecontrol with OleClass="Shell.Explorer.2",left=-100

    PROCEDURE Destroy
        UNBINDEVENTS(this.hWnd)
    ENDPROC
   
    PROCEDURE Init
        this.web.Silent = .t.
        BINDEVENT(this.hWnd, 0x401, this, "myMessage")
    ENDPROC

    PROCEDURE but.click
        ZAP IN "tu"
        thisform.edt.value = ""
        thisform.web.navigate("http://www./105790648")
    ENDPROC
   
    PROCEDURE grd.click
        thisform.edt.value = tu.txt
        thisform.edt.SelStart = 0
    ENDPROC

    PROCEDURE web.documentComplete(pdisp, url)
        IF (SYS(3095, pdisp) == SYS(3095, this))
            PostMessageA(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC

    FUNCTION myMessage(hWnd, uMsg, wParam, lParam)
        dom = this.web.document
        IF VARTYPE(dom) != "O"
            this.Enabled = .t.
            RETURN
        ENDIF
        IF EMPTY(tu.addr)
            #if 1   && 0 or 1
                * ie版本高试用
            lis = dom.getElementsByClassName("line3")
            FOR EACH li IN lis
                INSERT INTO tu VALUES (li.firstChild.innertext, li.firstChild.href, "")
            ENDFOR
            #else
                * ie版本低试用
            lis = dom.getElementsByTagName("li")
            FOR EACH li IN lis
                IF li.classname == "line3"
                    INSERT INTO tu VALUES (;
                        li.getElementsByTagName("a").item[0].innertext,;
                        li.getElementsByTagName("a").item[0].href, "";
                    )
                ENDIF
            ENDFOR
            #endif
            GO TOP IN "tu"
            this.grd.setfocus
            this.web.navigate(ALLTRIM(tu.addr))
            RETURN     
        ENDIF
        REPLACE tu.txt WITH ALLTRIM(tu.title)+ 0h0D0A0D0A + dom.getElementById("ad").innertext
        ? ALLTRIM(tu.title)
        SKIP IN "tu"
        IF !EOF("tu")
            this.grd.setfocus
            this.web.navigate(ALLTRIM(tu.addr))
            RETURN
        ENDIF
        GO TOP IN "tu"
        this.grd.setfocus
        this.Enabled = .t.
    ENDFUNC
ENDDEFINE



[此贴子已经被作者于2025-11-21 23:45编辑过]

#15
王咸美6 天前 06:01
谢谢!
#16
王咸美6 天前 08:38
@吹水佬:各章节标题和网址爬下来了,没有见到各章节小说内容!

[此贴子已经被作者于2025-11-24 11:30编辑过]

#17
yiyanxiyin4 天前 10:14
以下vbs代码演示如何不依赖ie, 使用正则提取页面内容:
程序代码:
Set xhr = CreateObject("MSXML2.XMLHTTP.3.0")
xhr.open "GET", "http://www./105790648", false
xhr.send

If xhr.Status = 200 Then
    ' 检测编码并处理UTF-8
    Dim bytes, htmlContent
    bytes = xhr.responseBody
   
   
' 检查是否有BOM标记
    If LenB(bytes) >= 3 Then
        ' 检查UTF-8 BOM: EF BB BF
        If AscB(MidB(bytes, 1, 1)) = &HEF And _
           AscB(MidB(bytes, 2, 1)) = &HBB And _
           AscB(MidB(bytes, 3, 1)) = &HBF Then
            
' 有UTF-8 BOM,去除BOM
            bytes = MidB(bytes, 4)
        End If
    End If
   
    ' 将字节数据转换为UTF-8字符串
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 1
' 二进制类型
    stream.Open
    stream.Write bytes
    stream.Position = 0
    stream.Type = 2 ' 文本类型
    stream.Charset = "UTF-8"
    htmlContent = stream.ReadText
    stream.Close
   
Else
    WScript.Echo "Error: " & xhr.Status
End If


WScript.Echo "文件内容长度: " & Len(htmlContent)

Set regEx = New RegExp
regEx.Global = True
regEx.IgnoreCase = True
regEx.Pattern = "<a\s+[^>]*href=""([^""]*)""[^>]*title=""([^""]*)""[^>]*>"

Set matches = regEx.Execute(htmlContent)

If matches.Count > 0 Then
    For i = 0 To matches.Count - 1
        href = matches(i).SubMatches(0)
        title = matches(i).SubMatches(1)
        WScript.Echo "链接 " & i + 1 & ":"
        WScript.Echo "href: " & href
        WScript.Echo "title: " & title
        WScript.Echo "---"
    Next
Else
    WScript.Echo "未找到任何链接"

End If
请将vbs脚本保存为ansi或者unicode的vbs文件, 不要保存为utf8, 然后以管理员权限在cmd中使用cscript yourvbsfilename.vbs 执行
#18
王咸美4 天前 13:35
可惜不是vfp代码
#19
吹水佬4 天前 13:37
回复 17楼 yiyanxiyin
这个简单,不用解析。
给第一章截图看看?
#20
yiyanxiyin4 天前 14:30
to 王咸美:  任何语言原理都一样, 不要拘泥于某种语言, 关键是方法原理  to 吹水佬: 我没有抓第一章, vbs代码的目的就是提供一个方法
1