Project1

标题: [RM脚本] 部分文学站点列表获取器 + 成品 [打印本页]

作者: 柳柳    时间: 2006-12-13 23:42
标题: [RM脚本] 部分文学站点列表获取器 + 成品
这几天想找一些文章读,本想从起点上面找,结果发现起点实际上是不支持按字数搜索的——可能支持,但是至少就我看到的不是很方便,没有找到。

所以想,干脆把起点文学所有完结版作品的文章列表下载一份回来自己找……

于是就有了这么个脚本:

  1. #---------------------------------------------------
  2. # 本脚本来自www.66rpg.com = =b
  3. #---------------------------------------------------

  4. $allartsnumber = 9304 # 总文章数,手动输入

  5. #------------------------------------------------------------------------------
  6. # Moonlight INN
  7. # http://cgi.members.interq.or.jp/aquarius/rasetsu/
  8. # RaTTiE
  9. # [email protected]
  10. #------------------------------------------------------------
  11. # EasyConv::s2u(text) : S-JIS -> UTF-8
  12. # EasyConv::u2s(text) : UTF-8 -> S-JIS
  13. #==============================================
  14. module EasyConv
  15. # API梡掕悢掕媊
  16.    CP_ACP = 0
  17.    CP_UTF8 = 65001

  18. #--------------------------------------------------------------------------
  19. # 仠 S-JIS -> UTF-8
  20. #--------------------------------------------------------------------------
  21. def s2u(text)
  22. # API掕媊
  23.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  24.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  25. # S-JIS -> Unicode
  26.    len = m2w.call(CP_ACP, 0, text, -1, nil, 0);
  27.    buf = "\0" * (len*2)
  28.    m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2);

  29. # Unicode -> UTF-8
  30.    len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
  31.    ret = "\0" * len
  32.    w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  33.    
  34.    return ret
  35. end
  36. # module_function偲偟偰岞奐
  37. module_function :s2u
  38. #--------------------------------------------------------------------------
  39. # 仠 UTF-8 -> S-JIS
  40. #--------------------------------------------------------------------------
  41. def u2s(text)
  42. # API掕媊
  43.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  44.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  45. # UTF-8 -> Unicode
  46.    len = m2w.call(CP_UTF8, 0, text, -1, nil, 0);
  47.    buf = "\0" * (len*2)
  48.    m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2);

  49. # Unicode -> S-JIS
  50.    len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil);
  51.    ret = "\0" * len
  52.    w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil);
  53.    
  54.    return ret
  55. end
  56. # module_function偲偟偰岞奐
  57. module_function :u2s
  58. end

  59. #========================================
  60. # 本脚本来自www.66rpg.com
  61. #========================================


  62. class Get_Http_Info
  63.   
  64.   AGENT = "RGSS PLAYER"
  65.   INTERNET_OPEN_TYPE_PRECONFIG = 0 # IEの設定を仕様
  66.   INTERNET_OPEN_TYPE_DIRECT    = 1 # プロキシを使用しない
  67.   def Get_Http_Info.InternetOpen()
  68.     io = Win32API.new('wininet', 'InternetOpen', %(p, l, p, p, l), 'l')
  69.     hInternet = io.call(AGENT, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0)
  70.     return hInternet
  71.   end

  72.   def Get_Http_Info.InternetOpenUrl(hSession, url)
  73.     iou = Win32API.new('wininet', 'InternetOpenUrl', %(l, p, p, l, l, l), 'l')
  74.     hService = iou.call(hSession, url, nil, 0, 0, 0)
  75.     return hService
  76.   end

  77.   def Get_Http_Info.InternetReadFile(hService)
  78.     content = ""
  79.     read_size = 1024 # 一次读入文件的尺寸
  80.     irf = Win32API.new('wininet', 'InternetReadFile', %(l, p, i, p), 'i')
  81.     while(true)
  82.       buf = "\0" * read_size
  83.       red = [0].pack('L')
  84.       irf.call( hService, buf, read_size, red )
  85.       if(red.unpack('L') == [0])
  86.         #读到文件末端
  87.         break
  88.       end
  89.       buf.delete!("\0")
  90.       content += buf
  91.     end

  92.     return content
  93.   end

  94.   HTTP_QUERY_STATUS_CODE = 19
  95.   
  96.   def Get_Http_Info.HttpQueryInfo(hService)
  97.     read_size = 1024
  98.     buf = "\0" * read_size
  99.     red = [read_size-1].pack('L')
  100.     hqi = Win32API.new('wininet', 'HttpQueryInfo', %(l, l, p, p, p), 'i')
  101.     isOk = hqi.call( hService, HTTP_QUERY_STATUS_CODE, buf, red, nil)
  102.     buf.delete!("\0")
  103.     return buf
  104.   end

  105.   def Get_Http_Info.InternetCloseHandle(hInternet)
  106.     ich = Win32API.new('winInet', 'InternetCloseHandle', %(l), 'i')
  107.     isOk = ich.call(hInternet)
  108.     return isOk
  109.   end

  110.   HTTP_CODE_OK = "200"
  111.    
  112.   def Get_Http_Info.get_info(url)
  113.     info = nil
  114.     begin
  115.       hInternet = InternetOpen()
  116.       if(hInternet != 0)
  117.         hService = InternetOpenUrl(hInternet, url)
  118.         if(hService != 0)
  119.           status_code = HttpQueryInfo(hService)
  120.           if(status_code == HTTP_CODE_OK)
  121.             info = InternetReadFile(hService)
  122.           end
  123.           InternetCloseHandle(hService)
  124.         end
  125.         InternetCloseHandle(hInternet)
  126.       end
  127.     rescue
  128.       # 例外发生
  129.       return nil
  130.     end
  131.    
  132.       
  133.     $ary = ""
  134.         
  135.     info.each_line do |line|
  136.       $ary += EasyConv.s2u(line)
  137.     end
  138.    
  139.     for i in 2..60
  140.       a = $ary.split(/putlist/)[i]
  141.       a = a[1, a.size - 3]
  142.       $fr.write(a + "\n")
  143.     end
  144.     Graphics.update
  145.    
  146.     $next_page = "http://www.cmfu.com/listbookqb.asp?pageid=" + $ary.split(/listbookqb.asp\?pageid=/)[1].split(/'/)[0]
  147.    
  148.   end
  149.   
  150.   def Get_Http_Info.sendAnswers
  151.     a = ""
  152.     a = $game_variables[5].to_s + $game_variables[4].to_s + $game_variables[3].to_s + $game_variables[2].to_s + $game_variables[1].to_s
  153.     b = ""
  154.     b = $game_variables[10].to_s + $game_variables[9].to_s + $game_variables[8].to_s + $game_variables[7].to_s + $game_variables[6].to_s
  155.    
  156.     c = "http://rpg.blue/friends66as.asp?a=#{a}&b=#{b}"
  157.     $bb_66rpg = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i')
  158.     $bb_66rpg.call(0, 'open', c ,0, 0, 1)
  159.   end
  160. end
  161. $ary = nil

  162. $now_page = 1
  163. $sprite = Sprite.new
  164. $sprite.bitmap = Bitmap.new(320,240)

  165. $all_ys = $allartsnumber / 60

  166. $sprite.bitmap.draw_text(0,0,256,32,"正在获得起点文章列表……")
  167. $sprite.bitmap.draw_text(0,32,256,32,"第 "+$now_page.to_s+" 页,共 " + $all_ys.to_s + " 页")

  168. $next_page = "http://www.cmfu.com/listbookqb.asp?status=down"

  169. $fr = File.open("alltext.txt","wb")
  170. $fr.write("'地址编号','作者','书名','日期','最后章节','字数','作者ID','类别','章节地址'" + "\n")

  171. for $now_page in 1..$all_ys
  172.   ver = Get_Http_Info.get_info($next_page)
  173.   $sprite.bitmap.clear
  174.   $sprite.bitmap.draw_text(0,0,256,32,"正在获得起点文章列表……")
  175.   $sprite.bitmap.draw_text(0,32,256,32,"第 "+$now_page.to_s+" 页,共 " + $all_ys.to_s + " 页")
  176.   Graphics.update
  177. end


  178. $fr.close

  179. p "文章读取完毕,请查看alltext.txt","处理方法:使用excel打开,然后再去调整和排序即可"," ","找到想要看的书的地址编号,然后输入:","http://www.cmfu.com/showbook.asp?bl_id=编号"

复制代码


运行之后的结果:

1、文本文件:http://rpg.blue/web/ftppic/web3/200701/alltexttxt.rar

2、EXCEL文档:http://rpg.blue/web/ftppic/web3/200701/alltextxls.rar

由于起点是在不断更新的,这个小脚本可能过一段时间后会失效,故保留地球村区好了。上面可以下载的两个列表是截止发帖时候的全部列表。
作者: 柳柳    时间: 2006-12-13 23:42
标题: [RM脚本] 部分文学站点列表获取器 + 成品
这几天想找一些文章读,本想从起点上面找,结果发现起点实际上是不支持按字数搜索的——可能支持,但是至少就我看到的不是很方便,没有找到。

所以想,干脆把起点文学所有完结版作品的文章列表下载一份回来自己找……

于是就有了这么个脚本:

  1. #---------------------------------------------------
  2. # 本脚本来自www.66rpg.com = =b
  3. #---------------------------------------------------

  4. $allartsnumber = 9304 # 总文章数,手动输入

  5. #------------------------------------------------------------------------------
  6. # Moonlight INN
  7. # http://cgi.members.interq.or.jp/aquarius/rasetsu/
  8. # RaTTiE
  9. # [email protected]
  10. #------------------------------------------------------------
  11. # EasyConv::s2u(text) : S-JIS -> UTF-8
  12. # EasyConv::u2s(text) : UTF-8 -> S-JIS
  13. #==============================================
  14. module EasyConv
  15. # API梡掕悢掕媊
  16.    CP_ACP = 0
  17.    CP_UTF8 = 65001

  18. #--------------------------------------------------------------------------
  19. # 仠 S-JIS -> UTF-8
  20. #--------------------------------------------------------------------------
  21. def s2u(text)
  22. # API掕媊
  23.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  24.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  25. # S-JIS -> Unicode
  26.    len = m2w.call(CP_ACP, 0, text, -1, nil, 0);
  27.    buf = "\0" * (len*2)
  28.    m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2);

  29. # Unicode -> UTF-8
  30.    len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
  31.    ret = "\0" * len
  32.    w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  33.    
  34.    return ret
  35. end
  36. # module_function偲偟偰岞奐
  37. module_function :s2u
  38. #--------------------------------------------------------------------------
  39. # 仠 UTF-8 -> S-JIS
  40. #--------------------------------------------------------------------------
  41. def u2s(text)
  42. # API掕媊
  43.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  44.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  45. # UTF-8 -> Unicode
  46.    len = m2w.call(CP_UTF8, 0, text, -1, nil, 0);
  47.    buf = "\0" * (len*2)
  48.    m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2);

  49. # Unicode -> S-JIS
  50.    len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil);
  51.    ret = "\0" * len
  52.    w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil);
  53.    
  54.    return ret
  55. end
  56. # module_function偲偟偰岞奐
  57. module_function :u2s
  58. end

  59. #========================================
  60. # 本脚本来自www.66rpg.com
  61. #========================================


  62. class Get_Http_Info
  63.   
  64.   AGENT = "RGSS PLAYER"
  65.   INTERNET_OPEN_TYPE_PRECONFIG = 0 # IEの設定を仕様
  66.   INTERNET_OPEN_TYPE_DIRECT    = 1 # プロキシを使用しない
  67.   def Get_Http_Info.InternetOpen()
  68.     io = Win32API.new('wininet', 'InternetOpen', %(p, l, p, p, l), 'l')
  69.     hInternet = io.call(AGENT, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0)
  70.     return hInternet
  71.   end

  72.   def Get_Http_Info.InternetOpenUrl(hSession, url)
  73.     iou = Win32API.new('wininet', 'InternetOpenUrl', %(l, p, p, l, l, l), 'l')
  74.     hService = iou.call(hSession, url, nil, 0, 0, 0)
  75.     return hService
  76.   end

  77.   def Get_Http_Info.InternetReadFile(hService)
  78.     content = ""
  79.     read_size = 1024 # 一次读入文件的尺寸
  80.     irf = Win32API.new('wininet', 'InternetReadFile', %(l, p, i, p), 'i')
  81.     while(true)
  82.       buf = "\0" * read_size
  83.       red = [0].pack('L')
  84.       irf.call( hService, buf, read_size, red )
  85.       if(red.unpack('L') == [0])
  86.         #读到文件末端
  87.         break
  88.       end
  89.       buf.delete!("\0")
  90.       content += buf
  91.     end

  92.     return content
  93.   end

  94.   HTTP_QUERY_STATUS_CODE = 19
  95.   
  96.   def Get_Http_Info.HttpQueryInfo(hService)
  97.     read_size = 1024
  98.     buf = "\0" * read_size
  99.     red = [read_size-1].pack('L')
  100.     hqi = Win32API.new('wininet', 'HttpQueryInfo', %(l, l, p, p, p), 'i')
  101.     isOk = hqi.call( hService, HTTP_QUERY_STATUS_CODE, buf, red, nil)
  102.     buf.delete!("\0")
  103.     return buf
  104.   end

  105.   def Get_Http_Info.InternetCloseHandle(hInternet)
  106.     ich = Win32API.new('winInet', 'InternetCloseHandle', %(l), 'i')
  107.     isOk = ich.call(hInternet)
  108.     return isOk
  109.   end

  110.   HTTP_CODE_OK = "200"
  111.    
  112.   def Get_Http_Info.get_info(url)
  113.     info = nil
  114.     begin
  115.       hInternet = InternetOpen()
  116.       if(hInternet != 0)
  117.         hService = InternetOpenUrl(hInternet, url)
  118.         if(hService != 0)
  119.           status_code = HttpQueryInfo(hService)
  120.           if(status_code == HTTP_CODE_OK)
  121.             info = InternetReadFile(hService)
  122.           end
  123.           InternetCloseHandle(hService)
  124.         end
  125.         InternetCloseHandle(hInternet)
  126.       end
  127.     rescue
  128.       # 例外发生
  129.       return nil
  130.     end
  131.    
  132.       
  133.     $ary = ""
  134.         
  135.     info.each_line do |line|
  136.       $ary += EasyConv.s2u(line)
  137.     end
  138.    
  139.     for i in 2..60
  140.       a = $ary.split(/putlist/)[i]
  141.       a = a[1, a.size - 3]
  142.       $fr.write(a + "\n")
  143.     end
  144.     Graphics.update
  145.    
  146.     $next_page = "http://www.cmfu.com/listbookqb.asp?pageid=" + $ary.split(/listbookqb.asp\?pageid=/)[1].split(/'/)[0]
  147.    
  148.   end
  149.   
  150.   def Get_Http_Info.sendAnswers
  151.     a = ""
  152.     a = $game_variables[5].to_s + $game_variables[4].to_s + $game_variables[3].to_s + $game_variables[2].to_s + $game_variables[1].to_s
  153.     b = ""
  154.     b = $game_variables[10].to_s + $game_variables[9].to_s + $game_variables[8].to_s + $game_variables[7].to_s + $game_variables[6].to_s
  155.    
  156.     c = "http://rpg.blue/friends66as.asp?a=#{a}&b=#{b}"
  157.     $bb_66rpg = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i')
  158.     $bb_66rpg.call(0, 'open', c ,0, 0, 1)
  159.   end
  160. end
  161. $ary = nil

  162. $now_page = 1
  163. $sprite = Sprite.new
  164. $sprite.bitmap = Bitmap.new(320,240)

  165. $all_ys = $allartsnumber / 60

  166. $sprite.bitmap.draw_text(0,0,256,32,"正在获得起点文章列表……")
  167. $sprite.bitmap.draw_text(0,32,256,32,"第 "+$now_page.to_s+" 页,共 " + $all_ys.to_s + " 页")

  168. $next_page = "http://www.cmfu.com/listbookqb.asp?status=down"

  169. $fr = File.open("alltext.txt","wb")
  170. $fr.write("'地址编号','作者','书名','日期','最后章节','字数','作者ID','类别','章节地址'" + "\n")

  171. for $now_page in 1..$all_ys
  172.   ver = Get_Http_Info.get_info($next_page)
  173.   $sprite.bitmap.clear
  174.   $sprite.bitmap.draw_text(0,0,256,32,"正在获得起点文章列表……")
  175.   $sprite.bitmap.draw_text(0,32,256,32,"第 "+$now_page.to_s+" 页,共 " + $all_ys.to_s + " 页")
  176.   Graphics.update
  177. end


  178. $fr.close

  179. p "文章读取完毕,请查看alltext.txt","处理方法:使用excel打开,然后再去调整和排序即可"," ","找到想要看的书的地址编号,然后输入:","http://www.cmfu.com/showbook.asp?bl_id=编号"

复制代码


运行之后的结果:

1、文本文件:http://rpg.blue/web/ftppic/web3/200701/alltexttxt.rar

2、EXCEL文档:http://rpg.blue/web/ftppic/web3/200701/alltextxls.rar

由于起点是在不断更新的,这个小脚本可能过一段时间后会失效,故保留地球村区好了。上面可以下载的两个列表是截止发帖时候的全部列表。
作者: 小徐    时间: 2006-12-14 13:41
果然RPGXP除了做游戏还可以编程用.....(啊啊啊!我想学RGSS啊!!)
作者: 金圭子    时间: 2006-12-16 17:26
Oh yeah,帅呆了………………

这个正是我一直想找的东西啊,我呜呜呜~~~居然没想过去自己写个程序去搜索一下,罪过啊罪过…………
大概看了一下,原理是不是在:
http://www.cmfu.com/listbookqb.asp?status=down

这个页面里面把主体那块读下来的?
不过没找得怎么搜索“下一页”的方法,起点的那个翻页可是按照时间的…………



我再看看…………看懂了自己写一个对起点所有小说读取信息的方法,除了已经有的这些外加总点击、总推荐、小类等等…………(用Webbrower做可能要容易点)
作者: 金圭子    时间: 2006-12-16 17:30
另外,起点的“排行榜”里面是有个按照字数倒序排行的:
http://www.cmfu.com/topten.asp?topvalue=8

不过有几个问题:
·只有400个,大概差不多是90w字以上的
·写完没写完的都有
·还有一个就是起点字数最大的问题了:他这个字数只是公众版的,有些人书写完没多久就把公众版都更新了(比如随波逐流、哈贝达斯这种好人),但有人几年过去了还是不更(这个就不指名了);很多人vip是公众版的几倍(特别是写的非常快的那几个)
·还有一个小问题:这个“已完结”是作者自己设置的,有些书写完了但是作者还忘了设的也有,不过不多……
作者: 柳柳    时间: 2006-12-16 20:08
呵呵,这是第一次尝试干之中搜索蜘蛛的工作,下面继续实验……
作者: 金圭子    时间: 2006-12-16 20:34
搜索蜘蛛是什么意思………………
这个说法是从“网”(Web)来的么?
作者: 柳柳    时间: 2006-12-16 23:44
  1. #------------------------------------------------------------------------------
  2. # Moonlight INN
  3. # http://cgi.members.interq.or.jp/aquarius/rasetsu/
  4. # RaTTiE
  5. # [email protected]
  6. #------------------------------------------------------------
  7. # EasyConv::s2u(text) : S-JIS -> UTF-8
  8. # EasyConv::u2s(text) : UTF-8 -> S-JIS
  9. #==============================================
  10. module EasyConv
  11. # API梡掕悢掕媊
  12.   CP_ACP = 0
  13.   CP_UTF8 = 65001

  14. #--------------------------------------------------------------------------
  15. # 仠 S-JIS -> UTF-8
  16. #--------------------------------------------------------------------------
  17. def s2u(text)
  18. # API掕媊
  19.   m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  20.   w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  21. # S-JIS -> Unicode
  22.   len = m2w.call(CP_ACP, 0, text, -1, nil, 0);
  23.   buf = "\0" * (len*2)
  24.   m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2);

  25. # Unicode -> UTF-8
  26.   len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
  27.   ret = "\0" * len
  28.   w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  29.   
  30.   return ret
  31. end
  32. # module_function偲偟偰岞奐
  33. module_function :s2u
  34. #--------------------------------------------------------------------------
  35. # 仠 UTF-8 -> S-JIS
  36. #--------------------------------------------------------------------------
  37. def u2s(text)
  38. # API掕媊
  39.   m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  40.   w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  41. # UTF-8 -> Unicode
  42.   len = m2w.call(CP_UTF8, 0, text, -1, nil, 0);
  43.   buf = "\0" * (len*2)
  44.   m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2);

  45. # Unicode -> S-JIS
  46.   len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil);
  47.   ret = "\0" * len
  48.   w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil);
  49.   
  50.   return ret
  51. end
  52. # module_function偲偟偰岞奐
  53. module_function :u2s
  54. end

  55. #========================================
  56. # 本脚本来自www.66rpg.com
  57. #========================================
  58. #---------------------------------------------------
  59. # 本脚本来自www.66rpg.com = =b
  60. #---------------------------------------------------
  61. class Get_Http_Info

  62. AGENT = "RGSS PLAYER"
  63. INTERNET_OPEN_TYPE_PRECONFIG = 0 # IEの設定を仕様
  64. INTERNET_OPEN_TYPE_DIRECT    = 1 # プロキシを使用しない
  65. def Get_Http_Info.InternetOpen()
  66.    io = Win32API.new('wininet', 'InternetOpen', %(p, l, p, p, l), 'l')
  67.    hInternet = io.call(AGENT, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0)
  68.    return hInternet
  69. end

  70. def Get_Http_Info.InternetOpenUrl(hSession, url)
  71.    iou = Win32API.new('wininet', 'InternetOpenUrl', %(l, p, p, l, l, l), 'l')
  72.    hService = iou.call(hSession, url, nil, 0, 0, 0)
  73.    return hService
  74. end

  75. def Get_Http_Info.InternetReadFile(hService)
  76.    content = ""
  77.    read_size = 1024 # 一次读入文件的尺寸
  78.    irf = Win32API.new('wininet', 'InternetReadFile', %(l, p, i, p), 'i')
  79.    while(true)
  80.      buf = "\0" * read_size
  81.      red = [0].pack('L')
  82.      irf.call( hService, buf, read_size, red )
  83.      if(red.unpack('L') == [0])
  84.        #读到文件末端
  85.        break
  86.      end
  87.      buf.delete!("\0")
  88.      content += buf
  89.    end

  90.    return content
  91. end

  92. HTTP_QUERY_STATUS_CODE = 19

  93. def Get_Http_Info.HttpQueryInfo(hService)
  94.    read_size = 1024
  95.    buf = "\0" * read_size
  96.    red = [read_size-1].pack('L')
  97.    hqi = Win32API.new('wininet', 'HttpQueryInfo', %(l, l, p, p, p), 'i')
  98.    isOk = hqi.call( hService, HTTP_QUERY_STATUS_CODE, buf, red, nil)
  99.    buf.delete!("\0")
  100.    return buf
  101. end

  102. def Get_Http_Info.InternetCloseHandle(hInternet)
  103.    ich = Win32API.new('winInet', 'InternetCloseHandle', %(l), 'i')
  104.    isOk = ich.call(hInternet)
  105.    return isOk
  106. end

  107. HTTP_CODE_OK = "200"
  108.    
  109. def Get_Http_Info.get_info(url)
  110.    info = nil
  111.    begin
  112.      hInternet = InternetOpen()
  113.      if(hInternet != 0)
  114.        hService = InternetOpenUrl(hInternet, url)
  115.        if(hService != 0)
  116.          status_code = HttpQueryInfo(hService)
  117.          if(status_code == HTTP_CODE_OK)
  118.            info = InternetReadFile(hService)
  119.          end
  120.          InternetCloseHandle(hService)
  121.        end
  122.        InternetCloseHandle(hInternet)
  123.      end
  124.    rescue
  125.      # 例外发生
  126.      return nil
  127.    end
  128.    
  129.       
  130.    $ary = ""
  131.       
  132.    info.each_line do |line|
  133.      $ary += EasyConv.s2u(line)
  134.    end
  135.    

  136. end

  137. end
  138. begin
  139.   $ary = nil
  140.   
  141.   $now_page = 110
  142.   $sprite = Sprite.new
  143.   $sprite.bitmap = Bitmap.new(320,240)
  144.   $sprite.x = 150
  145.   $sprite.y = 150
  146.   
  147.   $all_ys = 110
  148.   
  149.   $sprite.bitmap.draw_text(0,0,256,32,"正在获得文章列表……")
  150.   $sprite.bitmap.draw_text(0,32,256,32,"第 "+$now_page.to_s+" 页,共 " + $all_ys.to_s + " 页")
  151.   
  152.   $next_page = "http://www.readnovel.com/ch/13/110.html"
  153.   
  154.   $fr = File.open("alltext.txt","wb") # fr是目录列表
  155.   
  156.   #$fr.write("'地址编号','作者','书名','日期','最后章节','字数','作者ID','类别','章节地址'" + "\n")
  157.   
  158.   while($now_page >= 2)
  159.    ver = Get_Http_Info.get_info($next_page)
  160.    
  161.    
  162.     for i in 1..$ary.split(/normalfont">《<a href="/).size - 1
  163.      a = $ary.split(/normalfont">《<a href="/)[i].split(/" target="_blank/)[0]
  164.      $fr.write(a + "\n")
  165.    end
  166.    Graphics.update
  167.    $next_page = $ary.split(/第一页">&laquo;<\/a> <a href="/)[1].split(/">上一页<\/a>/)[0]
  168.    
  169.    
  170.    $sprite.bitmap.clear
  171.    $sprite.bitmap.draw_text(0,0,256,32,"正在获得文章列表……")
  172.    $sprite.bitmap.draw_text(0,32,256,32,"第 "+$now_page.to_s+" 页,共 " + $all_ys.to_s + " 页")
  173.    Graphics.update
  174.    $now_page -= 1
  175.   end
  176.   
  177.   $fr.close
  178. end
  179. $fr = File.open("alltext.txt","r") # fr是目录列表
  180. $dz = $fr.readlines
  181. for i in 599..$dz.size-1
  182.   $dz[i] = "http://www.readnovel.com" + $dz[i].split(/\n/)[0]
  183.   ver = Get_Http_Info.get_info($dz[i])
  184.   begin
  185.     begin
  186.       bookname = $ary.split(/a title="/)[1].split(/">/)[0]
  187.       book = File.open("books1/#{bookname}.txt","wb")
  188.     rescue
  189.       bookname = o
  190.       book = File.open("books1/#{bookname}.txt","wb")
  191.     end      
  192.     book.write("书名:" + bookname + "  ")
  193.     book.write("来源:" + $dz[i] + "\r\n\000")
  194.     content = $ary.split(/<div class="content">/)[1].split(/<\/div>/)[0]
  195.     content.gsub!(/<P>/) {|s| s=""}
  196.     content.gsub!(/<\/P>/) {|s| s="\r\n"}
  197.     content.gsub!(/<BR>/) {|s| s="\r\n"}
  198.     book.write(content)
  199.     book.close
  200.     $sprite.bitmap.clear
  201.     $sprite.bitmap.draw_text(0,0,256,32,"正在储存文章……")
  202.     $sprite.bitmap.draw_text(0,32,256,32,"第 "+ i.to_s + " 篇,共 " + ($dz.size-1).to_s + " 篇")
  203.     Graphics.update   
  204.   rescue
  205.     next
  206.   end
  207. end
复制代码


二代出炉~这个脚本可以提取并保留小说阅读网的短篇小说资源,并且存为.txt
相关连接:http://www.readnovel.com/

脚本运行时间大约是10分钟,请耐心等待。
作者: 柳柳    时间: 2006-12-17 23:06
http://rpg.blue/web/ftppic/web3/200701/潇湘书院.rar

这次是潇湘书院的了,spider设计得更汗一点,直接是书名、作者、分类、字数、阅读数、推荐数、简介、地址,全部统一在一个表里面了。
作者: 九泪    时间: 2006-12-20 04:48
以下引用柳柳于2006-12-16 12:08:49的发言:

呵呵,这是第一次尝试干之中搜索蜘蛛的工作,下面继续实验……


^_^开始接触到蜘蛛爬了?难怪一心要进GG~{/hx}
作者: comprobe    时间: 2006-12-23 22:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 亿万星辰    时间: 2006-12-24 20:06
你就把它理解为一个下载机器好了。。。。。。。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1