| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 207 人关注过本帖
标题:再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
只看楼主 加入收藏
王咸美
Rank: 1
等 级:新手上路
帖 子:893
专家分:3
注 册:2018-1-4
结帖率:97.52%
收藏
已结贴  问题点数:20 回复次数:14 
再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
下列代码能将《仙道九绝》小说各章节的当前页爬下来,但各章节小说有的有三页,有的有两页,怎样完善下列代码将各章节小说完整的爬下来?请高手赐教,万分感谢!!!(不喜勿喷,全当路过)

SET DEFAULT TO (ADDBS(JUSTPATH(SYS(16))))
DECLARE long PostMessageA IN user32 long,long,long,long
IF !FILE("仙道九绝.dbf")
    CREATE TABLE 仙道九绝 (title C(100), addr C(254), txt M)
    USE
ENDIF
USE 仙道九绝 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.)
    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)
        
            * 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
         
            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("chapter").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-12-5 21:35编辑过]

搜索更多相关主题的帖子: top web IF WITH this 
3 天前 21:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
大家帮找找,哪章节有三页、有两页。
3 天前 22:39
王咸美
Rank: 1
等 级:新手上路
帖 子:893
专家分:3
注 册:2018-1-4
收藏
得分:0 
第1章3页,第2章2页
3 天前 23:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
我这看不到有翻页
截个图看看

3 天前 23:20
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1065
专家分:1637
注 册:2021-10-13
收藏
得分:5 
win7+vfp9 下编译通过。。。

程序代码:
LOCAL loHtml, lcUrl, lcContent
DECLARE integer Sleep IN WIN32API integer

lcUrl = "http://www./6780946/3664234966.html"
loHtml = CREATEOBJECT("htmlfile")

* 打开HTML文件对象
loHtml.open()

* 创建XMLHTTP请求对象
*loXmlHttp = loHtml.parentwindow.XMLHTTP
loXmlHttp=CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
* 发送GET请求获取内容
loXmlHttp.open("GET", lcUrl, .F.)
loXmlHttp.send("")
=sleep(8000) &&确保下载完成,如果网速慢,适当加长时间。
lcContent = loXmlHttp.responseText

* 将获取的内容写入到HTML文件对象中
loHtml.write(lcContent)

* 关闭HTML文件对象
loHtml.close()
RELEASE loXmlhttp

* 现在可以使用loHtml对象操作文档了
* ? "文档内容:", loHtml.body.innerHTML
* 获得章节内容
lochapter=lohtml.getElementById("chapter")
lcContent=lochapter.innerHTML
lcContent=STRTRAN(lcContent,"<br>","")
lcContent=STRTRAN(lcContent,"&nbsp;","") 
*?lcContent
STRTOFILE(lcContent,"wanglaoshi.txt")
*MODIFY FILE wanglaoshi.txt

* 查看分几篇
lapage=ohtml.getElementsByClassName("m-page")
lopage=lapage.item(0)
lcnext=lopage.innerhtml
lcnext=STREXTRACT(lcnext,"<A","</A>",3)
lcnext=JUSTSTEM(lcnext) &&下一章文件名
lccurrent=JUSTSTEM(lcurl) &&当前文件名
IF STREXTRACT(lcnext,"","_")==IIF(EMPTY(STREXTRACT(lccurrent,"","_")),;
    lccurrent,STREXTRACT(lccurrent,"","_"))
    
    MESSAGEBOX("下一页网址:"+STRTRAN(lcurl,lccurrent,lcnext))
    *继续爬,代码略。。。
ELSE 
    MESSAGEBOX("下一章网址:"+STRTRAN(lcurl,lccurrent,lcnext))    
ENDIF
RELEASE lohtml

MODIFY FILE wanglaoshi.txt
* 查看下载的html文件内容
*STRTOFILE(lcContent,"wanglaoshi.html")
*MODIFY FILE wanglaoshi.html
前天 00:17
王咸美
Rank: 1
等 级:新手上路
帖 子:893
专家分:3
注 册:2018-1-4
收藏
得分:0 
谢谢各位高手的热心指导!各章节小说网页上虽没有“下一页”,但是点击“下一章”会进入当前章节的第二页第三页。假如当前页为...4966.html(当前页),点击“下一章”,会出现 ...4966_2.html(第二页),再次点击“下一章”,会出现 ...4966_3.html(第三页),直到本章节完毕,再次点击“下一章”才真正跳转进入下一章页面。

[此贴子已经被作者于2025-12-6 04:02编辑过]

前天 03:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
回复 5楼 sam_jiang
内容不对
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

<div id="chapter"> 的 innerTEXT 看似是“误导”的
图片附件: 游客没有浏览图片的权限,请 登录注册


正确的在 <div id="ad"> 动态的

图片附件: 游客没有浏览图片的权限,请 登录注册




前天 10:29
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1065
专家分:1637
注 册:2021-10-13
收藏
得分:0 
没检查,爬到内容就以为是成功了
前天 20:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏(1)
得分:10 
以下是引用sam_jiang在2025-12-6 20:54:09的发言:

没检查,爬到内容就以为是成功了

动态用脚本生成的,那就偷懒照模照样做好了。
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
DECLARE long URLDownloadToFileA  IN urlmon  long,string,string,long,long
DECLARE long DeleteUrlCacheEntry IN wininet string
url = "http://www./6780946/3664234966.html"
outFile = "C:\_temp\tmp.html"
dom = CREATEOBJECT("htmlfile")
STRTOFILE(getText(getHtml(url, outFile)), outFile)
MODIFY FILE (outFile)
CLEAR ALL 
RETURN

FUNCTION getText(html)
    html = STRCONV(html, 11)
    content = STREXTRACT(html, [rr('], [')])
    TEXT TO jsCode TEXTMERGE NOSHOW PRETEXT 15
        var content = "<<content>>";
        content = window.atob(content);
        var arrays = new Array();    
        arrays = content.split(',');    
        var $chapter = document.getElementById("chapter").innerHTML;    
        document.getElementById("chapter").innerHTML = $chapter.replace(new RegExp(/\[(.*?)\]/), '$1');    
        $chapter = $chapter.replace(new RegExp(/\[.*?\]/), '');    
        var datas = [];    
        datas = $chapter.split('<br><br>');    
        var $html = '';    
        var el = arrays[0];    
        var len = datas.length;    
        for (var i = 1; i <= len; i++) {        
            $html += datas[arrays[i] - el] + '<br/><br/>';    
        }    
        document.getElementById("ad").innerHTML = $html;   
    ENDTEXT
    html = STRTRAN(html, "<script", "<soript")
    dom.write(html)
    dom.parentWindow.execScript(jsCode)
    content = dom.getElementById("ad").innerTEXT
    dom.close
    RETURN content
ENDFUNC

FUNCTION getHtml(url, outFile)
    IF URLDownloadToFileA(0, url, outFile, 0, 0)==0
        DeleteUrlCacheEntry(url)
        RETURN FILETOSTR(outFile)
    ENDIF
    RETURN ""
ENDFUNC




[此贴子已经被作者于2025-12-6 23:46编辑过]

前天 23:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
那段文本内容按行打乱顺序,每行按行号动态编码。
那段脚本就是解码整理各行顺序后写入 <div id='ad'> 。
解码算法好像是,按顺序取(某行编码 - 第一行编码) = 乱序文本行的行号。  
前天 23:28
快速回复:再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022348 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved