找回密码
  注册[Register]
查看: 661|回复: 6

[其他] go爬取小说

[复制链接]
发表于 2021-2-24 11:56 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。


go语言使用colly+goquery爬取小说章节,因为懒所以没有去爬取单独小说的前缀路劲,需要手动修改。会在noval文件夹下生成每个章节的txt文件
[AppleScript] 纯文本查看 复制代码
package main

import (
   "fmt"
   "github.com/PuerkitoBio/goquery"
   "github.com/gocolly/colly"
   "github.com/gocolly/colly/extensions"
   "os"
   "strconv"
   "strings"
   "time"
)

var indexUrl string = "http://www.xbiquge.la"
var novelIndex string="http://www.xbiquge.la/61/61403/"

func main() {
   start := time.Now()
   number := 1
   // 初始化collector
   c := colly.NewCollector(func(c *colly.Collector) {
      extensions.RandomUserAgent(c) // 设置随机头
      c.Async = true
   },
   )
   /*c.OnHTML("a[href]", func(e *colly.HTMLElement) {
      link := e.Attr("href")
      fmt.Printf("find link: %s\n", e.Request.AbsoluteURL(link))
      c.Visit(e.Request.AbsoluteURL(link))
   })*/
   urls := make([]string, 0, 100)
   //urlList := make([]string,30,100)
   // 解析页面获取需要的信息
   c.OnHTML("dd", func(e *colly.HTMLElement) {
      e.DOM.Each(func(i int, selection *goquery.Selection) {
         //title := selection.Find("dd a").Text()
         title := selection.Find("dd a").Text()
         link, _ := selection.Find("dd a").Attr("href")
         if len(link) != 0 {
            link = indexUrl + link
            urls = append(urls, link)
         }
         fmt.Printf("%d --> %s-->%s\n", number, title, link)
         number += 1
         time.Sleep(2 * time.Second)
         c.Visit(e.Request.AbsoluteURL(link))
         return
      })
   })
   dd := 1
   c.OnHTML("div.box_con", func(e *colly.HTMLElement) {
      e.DOM.Each(func(i int, selection *goquery.Selection) {
         fileName := selection.Find("div.bookname h1").First().Text()
         split := strings.SplitN(fileName, " ",2)
         if len(split)==2 {
            fileName=strconv.Itoa(dd)+split[1]
         }
         text := selection.Find("div#content").Text()
         // 保存为txt文件
         dstFile, err := os.Create("novel\\"+fileName)
         if err != nil {
            fmt.Println(err.Error())
            return
         }
         defer dstFile.Close()
         dstFile.WriteString(text + "\n")
         dd += 1
      })
   })

   c.OnRequest(func(r *colly.Request) {
      fmt.Println("Visiting", r.URL)
   })
   c.OnError(func(response *colly.Response, err error) {
      fmt.Println(err)
   })
   c.Visit(novelIndex)
   c.Wait()
   fmt.Printf("花费时间:%s\n", time.Since(start))
   fmt.Println("获取的url总数量:", number)
   fmt.Println("获取的url长度:", len(urls))
   fmt.Println("获取的url容量:", cap(urls))
}

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2021-2-24 12:42 | 显示全部楼层

支持楼主,谢谢分享。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-24 12:49 | 显示全部楼层
多谢分享多谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-24 13:34 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-24 14:17 | 显示全部楼层

感谢楼主的分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-24 16:01 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-2-24 18:36 | 显示全部楼层
谢谢分享!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-5-19 09:45 , Processed in 0.036002 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表