| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 358 人关注过本帖
标题:再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
只看楼主 加入收藏
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2347
专家分:4863
注 册:2012-2-29
收藏
得分:0 
学习啦,谢谢!
3 天前 06:08
王咸美
Rank: 1
等 级:新手上路
帖 子:893
专家分:3
注 册:2018-1-4
收藏
得分:0 
谢谢!但对于windows xp系统、低版本IE无法正常运行,不知对于这种情况,代码如何修改?
3 天前 12:35
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10925
专家分:43569
注 册:2014-5-20
收藏
得分:0 
以下是引用王咸美在2025-12-7 12:35:35的发言:

谢谢!但对于windows xp系统、低版本IE无法正常运行,不知对于这种情况,代码如何修改?

使用 IE 的东西,现在 windows 10 也不好玩,还用 XP ?

3 天前 12:49
foxfans
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:127
专家分:342
注 册:2021-10-23
收藏
得分:5 
图片附件: 游客没有浏览图片的权限,请 登录注册

WinHttp.WinHttpRequest.5.1组件就可以。算法可以用二个数组分别存储文章列表和对应序号数组进行对应提取,最后拼接即可。
3 天前 12:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10925
专家分:43569
注 册:2014-5-20
收藏
得分:0 
以下是引用王咸美在2025-12-7 12:35:35的发言:

谢谢!但对于windows xp系统、低版本IE无法正常运行,不知对于这种情况,代码如何修改?

没有XP测试不了,应该是可以运行的。
可以将运行出现的异常问题细说一下,逐个问题探讨解决,有弹出异常提示时截图看看。
3 天前 20:49
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:335
专家分:2327
注 册:2023-6-29
收藏
得分:0 
这个跟写外挂一个道理,只是技术上更简单
首页原理:每一行顺序由这个数组来重定:21,33,60,52,29,48,30,31,22,58,38,36,24,35,28,21,45,61,54,32,39,53,55,25,23,50,34,51,26,56,41,59,46,27,37,40,49,47,43,44,42,57 第一个数为基数, 后面的每个数都会减这个基数, 然后形成新的顺序
后面每一页这个数组的数据都会变, 但逻辑不变,  得到了这个数组并知道了这个逻辑, 可以用vpf来实现文本重排(不需要vpf里面签入js, atob在ie8及以下浏览器中好像是不支持的, vfp解码Base64应该没问题吧),那xp是绝对没问题的

这种动态js形成的类容就是反爬的典型方式,  以后稍微改一下这个算法, 你又要调整代码, 但这个都没啥用, 直接解析html和js, 等js执行完了,再去取内容就行了, 但你的编程组件要能解析js, 纯文本分析才需要分析他的js逻辑.
还有, 做得好一点的, 直接将小说内容输出到canvas里面, 你根本不能直接取到文本, 你得深入分析小说内容是怎么显示出来得, 就跟上面的分析js一样, 但最直接简单的方法是使用ocr

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

昨天 11:05
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10925
专家分:43569
注 册:2014-5-20
收藏
得分:0 
核心就几句:
chapter = html.getElementById("chapter").innerText
chapter = STRTRAN(chapter, STREXTRACT(chapter, "[","]",1,4), "")
content = STRCONV(ALLTRIM(html.getElementById("ad").innerText, "_ii_rr('", "');"), 14)
ALINES(arrays, content, 5, ",")
lines = ALINES(aDatas, chapter, 5)
code1 = VAL(arrays[1])
chapter = ""
FOR i=2 TO lines+1
    chapter = chapter + aDatas[VAL(arrays[i]) - code1 + 1] + 0h0D0A0D0A
ENDFOR
昨天 12:11
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:335
专家分:2327
注 册:2023-6-29
收藏
得分:0 
以下是引用吹水佬在2025-12-9 12:11:04的发言:

核心就几句:
chapter = html.getElementById("chapter").innerText
chapter = STRTRAN(chapter, STREXTRACT(chapter, "[","]",1,4), "")
content = STRCONV(ALLTRIM(html.getElementById("ad").innerText, "_ii_rr('", "');"), 14)
ALINES(arrays, content, 5, ",")
lines = ALINES(aDatas, chapter, 5)
code1 = VAL(arrays[1])
chapter = ""
FOR i=2 TO lines+1
    chapter = chapter + aDatas[VAL(arrays) - code1 + 1] + 0h0D0A0D0A
ENDFOR
对就这个意思, 不需要任何js支撑, 直接vfp代码倒腾纯文本
昨天 13:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10925
专家分:43569
注 册:2014-5-20
收藏(1)
得分:0 
章节有点多,试了几章没耐心试下去。
图片附件: 游客没有浏览图片的权限,请 登录注册

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

程序代码:
** 从第一章开始
cUrl = "http://www./6780946/3664234966.html"
http = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
html = CREATEOBJECT("htmlfile")
html.designmode = "on"
html.write(".")
outFile = "C:\_temp\仙道九绝.dbf"
CREATE TABLE (outFile) (标题 V(50), 网址 V(50), 内容 M)
getHtmlText(cUrl)
SELECT * FROM 仙道九绝
CLOSE TABLES ALL 
CLEAR ALL 
RETURN

FUNCTION getHtmlText(cUrl)
    PRIVATE cHtml, host, purl, chapters, title, pages, n, m
    cHtml = ""
    host  = "http://" + STREXTRACT(cUrl, "http://", "/")
    purl  = host+"/6780946/"
    pages = getPages(purl)
    IF pages == 0
        RETURN
    ENDIF
    chapters = ""
    chapterUrl = cUrl
    title = ""
    wait = CREATEOBJECT("wait_form")
    wait.show
    n = 1                            && 章节计数
    m = wait.statbox.width / pages   && 进度条单位
    DO WHILE !(cUrl==purl) AND getHtmlTextByUrl(cUrl,@cHtml)
        cUrl = getChapter(cHtml, cUrl)
        #if 0    && 调试用
        IF n>10
            exit
        ENDIF
        #endif
    ENDDO
    wait.release
ENDFUNC

FUNCTION getChapter(cHtml, cUrl)
    html.getElementsByTagName("body").item[0].innerHTML = cHtml
    LOCAL chapter, content
    title   = STREXTRACT(html.getElementsByTagName("title").item[0].innerText, "_", "_")
    chapter = html.getElementById("chapter").innerText
    chapter = STRTRAN(chapter, STREXTRACT(chapter, "[","]",1,4), "")
    content = STRCONV(ALLTRIM(html.getElementById("ad").innerText, "_ii_rr('", "');"), 14)
    ALINES(arrays, content, 5, ",") 
    lines = ALINES(aDatas, chapter, 0h0D0A0D0A)
    code1 = VAL(arrays[1])
    chapter = ""
    FOR i=2 TO lines+1    && 取一页
        chapter = chapter + aDatas[VAL(arrays[i]) - code1 + 1] + 0h0D0A0D0A
    ENDFOR
    chapters = chapters + RTRIM(chapter,0h0D0A)    && 每章各页
    page = html.getElementsByClassName("m-tpage").item[0].getElementsByTagName("a").item[2].getAttribute("href")
    IF !(LEFT(page,AT("_",page)-1) $ cUrl)
        INSERT INTO 仙道九绝 VALUES (title, chapterUrl, chapters)
        chapters = ""
        chapterUrl = host + page  && 下一章
        wait.msg.caption = title+0h0D0D+chapterUrl
        wait.statbar.width = m * n
        n = n+1
    ENDIF
    RETURN host + page    && 下一页
ENDFUNC

FUNCTION getHtmlBodyByUrl(cUrl, pHtml)
    RETURN getHtmlByUrl(cUrl, @pHtml, 0)
ENDFUNC

FUNCTION getHtmlTextByUrl(cUrl, pHtml)
    RETURN getHtmlByUrl(cUrl, @pHtml, 1)
ENDFUNC

FUNCTION getHtmlByUrl(cUrl, pHtml, nFlags)
  TRY
    pHtml = ""
    LOCAL err
    err = .f.
    http.open("GET", cUrl, 0)
    http.send()
    IF http.status == 200
        IF nFlags == 0
            pHtml = http.ResponseBody
        ELSE
            pHtml = http.ResponseText
        ENDIF 
    ENDIF
  CATCH
    err = .t.       
  ENDTRY
    IF err
        MESSAGEBOX("获取网页失败"+0h0D+cUrl)  
    ENDIF 
    RETURN !err
ENDFUNC

FUNCTION getPages(purl)
    LOCAL pHtml
    IF getHtmlTextByUrl(purl, @pHtml)
        html.getElementsByTagName("body").item[0].innerHTML = pHtml
        RETURN VAL(STREXTRACT(html.getElementById("play_0").getElementsByTagName("li").item[0].innerText,"第","章"))
    ENDIF
    RETURN 0 
ENDFUNC

DEFINE CLASS wait_form as Form
    width = 500
    height = 150
    AutoCenter = .t.
    showwindow = 0
    windowtype = 0
    titlebar = 0
    movable = .f.
    borderstyle = 2
    alwaysontop = .t.
    ADD OBJECT msg as label WITH left=20,top=20,width=460,height=60,;
        caption="请稍候......",alignment=2,fontsize=12
    ADD OBJECT statbox as shape WITH left=20,top=100,width=460,height=22,;
        SpecialEffect=1,BackColor=0x00FFFFFF,BorderColor=0x00C0C0C0
    ADD OBJECT statbar as shape WITH left=20,top=100,width=0,height=22,;
        SpecialEffect=1,BackColor=0x00C08000,BorderColor=0x00C0C0C0
    PROCEDURE DblClick
        this.Release
    ENDPROC
ENDDEFINE




[此贴子已经被作者于2025-12-10 11:47编辑过]

15 小时前
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:335
专家分:2327
注 册:2023-6-29
收藏
得分:0 
既然使用了WinHttp.WinHttpRequest.5.1就不要使用htmlfile这个组件了,用winhttp的目的就是不解析html, 而htmlfile会解析html和js, 因为htmlfile的功能更强大,当然会很慢,
另外, 必须加入防反爬机制(1.模拟浏览器请求头,2.随机时间间隔的请求,不能太频繁),最好做到类似人类行为, 否则ip很容易被封,还应该加入错误处理机制,如果一个页没下载成功,那需要反复下载直到成功才继续下一页,否则爬取的内容没法用

[此贴子已经被作者于2025-12-10 10:19编辑过]

5 小时前
快速回复:再次求助:如何将《仙道九绝》各章节内容完整地爬下来?
数据加载中...
 
   



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

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