spider.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package db
  2. import (
  3. "container/list"
  4. "encoding/json"
  5. "fmt"
  6. "log"
  7. "os"
  8. "sort"
  9. be "spider_creator/backend"
  10. "strconv"
  11. "strings"
  12. "github.com/bmaupin/go-epub"
  13. "github.com/boltdb/bolt"
  14. "github.com/xuri/excelize/v2"
  15. )
  16. // Load
  17. func (s *SpiderDb) Load(code string) *be.SpiderConfig {
  18. var req *be.SpiderConfig = new(be.SpiderConfig)
  19. err := s.db.View(func(tx *bolt.Tx) error {
  20. bucket := tx.Bucket([]byte("myBucket"))
  21. value := bucket.Get([]byte(code))
  22. if value != nil && len(value) > 0 {
  23. _ = json.Unmarshal(value, req)
  24. }
  25. return nil
  26. })
  27. if err != nil {
  28. log.Fatal(err)
  29. }
  30. return req
  31. }
  32. // SaveOrUpdate
  33. func (s *SpiderDb) SaveOrUpdate(sc *be.SpiderConfig) {
  34. //加载原始数据
  35. var sc1 *be.SpiderConfig = new(be.SpiderConfig)
  36. var sc2 *be.SpiderConfig
  37. err := s.db.View(func(tx *bolt.Tx) error {
  38. bucket := tx.Bucket([]byte("myBucket"))
  39. value := bucket.Get([]byte(sc.Code))
  40. if value != nil && len(value) > 0 {
  41. _ = json.Unmarshal(value, sc1)
  42. }
  43. return nil
  44. })
  45. if err != nil {
  46. log.Println(err.Error())
  47. return
  48. }
  49. //更新
  50. if sc1 != nil {
  51. sc2 = be.MergeSpiderConfig(sc1, sc)
  52. value, _ := json.Marshal(sc2)
  53. err = s.db.Update(func(tx *bolt.Tx) error {
  54. bucket := tx.Bucket([]byte("myBucket"))
  55. err := bucket.Put([]byte(sc.Code), value)
  56. return err
  57. })
  58. if err != nil {
  59. log.Println(err.Error())
  60. return
  61. }
  62. }
  63. }
  64. // LoadAll,默认按照代码排序
  65. func (s *SpiderDb) LoadSpiderConfigAll() be.SpiderConfiges {
  66. ret := make(be.SpiderConfiges, 0)
  67. // 开始读取事务
  68. err := s.db.View(func(tx *bolt.Tx) error {
  69. // 遍历数据库中的所有桶
  70. bucket := tx.Bucket([]byte("myBucket"))
  71. // 遍历桶中的所有键/值对
  72. return bucket.ForEach(func(k, v []byte) error {
  73. var sf *be.SpiderConfig = new(be.SpiderConfig)
  74. json.Unmarshal(v, sf)
  75. if sf != nil {
  76. ret = append(ret, sf)
  77. }
  78. return nil
  79. })
  80. })
  81. sort.Sort(ret)
  82. if err != nil {
  83. log.Println(err.Error())
  84. }
  85. return ret
  86. }
  87. // Delete
  88. func (s *SpiderDb) DeleteSpiderConfig(code string) {
  89. err := s.db.Update(func(tx *bolt.Tx) error {
  90. bucket := tx.Bucket([]byte("myBucket"))
  91. err := bucket.Delete([]byte(code))
  92. return err
  93. })
  94. if err != nil {
  95. log.Println(err.Error())
  96. return
  97. }
  98. }
  99. // 批量导入
  100. func (s *SpiderDb) BatchImport(filepath string) error {
  101. f, err := excelize.OpenFile(filepath)
  102. if err != nil {
  103. return err
  104. }
  105. defer f.Close()
  106. for _, sheetName := range f.GetSheetList() {
  107. // 获取工作表的所有行
  108. rows, err := f.GetRows(sheetName)
  109. if err != nil {
  110. continue
  111. }
  112. //
  113. for index, row := range rows {
  114. if index == 0 || len(row) < 5 || row[0] == "" || row[3] == "" {
  115. continue
  116. }
  117. sc := &be.SpiderConfig{
  118. Code: row[0],
  119. Site: row[1],
  120. Channel: row[2],
  121. Href: row[3],
  122. ModifyUser: row[4],
  123. }
  124. value, _ := json.Marshal(sc)
  125. err = s.db.Update(func(tx *bolt.Tx) error {
  126. bucket := tx.Bucket([]byte("myBucket"))
  127. err := bucket.Put([]byte(sc.Code), value)
  128. return err
  129. })
  130. if err != nil {
  131. continue
  132. }
  133. }
  134. }
  135. return nil
  136. }
  137. // ExportEpubFile 导出epub文件
  138. func (db *SpiderDb) ExportEpubFile(bookname, filepath string,
  139. currentResult *list.List) error {
  140. output := epub.NewEpub(bookname)
  141. output.SetTitle(bookname)
  142. output.SetDescription(bookname)
  143. output.SetAuthor("unknow")
  144. i := 1
  145. for el := currentResult.Front(); el != nil; el = el.Next() {
  146. art, _ := el.Value.(*be.ResultItem)
  147. body := "<h2>" + art.Title + "</h2><p>" + strings.Join(strings.Split(art.Content, "\n"), "</p><p>") + "</p>"
  148. output.AddSection(body, art.Title, fmt.Sprintf("%06d.xhtml", i+1), "")
  149. i += 1
  150. }
  151. fo, err := os.Create(filepath)
  152. if err != nil {
  153. db.enf.Dispatch("debug_event", err.Error())
  154. }
  155. output.WriteTo(fo)
  156. fo.Close()
  157. return nil
  158. }
  159. // ExportExcelFile数据集导出到excel文件中
  160. func (db *SpiderDb) ExportExcelFile(filepath, site, channel string,
  161. currentResult *list.List) error {
  162. f := excelize.NewFile()
  163. defer f.Close()
  164. f.SetCellStr("Sheet1", "A1", "站点")
  165. f.SetCellStr("Sheet1", "B1", "栏目")
  166. //写入数据
  167. f.SetCellStr("Sheet1", "C1", "标题")
  168. f.SetCellStr("Sheet1", "D1", "链接")
  169. f.SetCellStr("Sheet1", "E1", "发布单位")
  170. f.SetCellStr("Sheet1", "F1", "发布时间")
  171. f.SetCellStr("Sheet1", "G1", "正文")
  172. f.SetCellStr("Sheet1", "H1", "附件")
  173. i := 0
  174. for el := currentResult.Front(); el != nil; el = el.Next() {
  175. r, _ := el.Value.(*be.ResultItem)
  176. //写入站点信息
  177. iStr := strconv.Itoa(i + 2)
  178. f.SetCellStr("Sheet1", "A"+iStr, site)
  179. f.SetCellStr("Sheet1", "B"+iStr, channel)
  180. //写入数据
  181. f.SetCellStr("Sheet1", "C"+iStr, r.Title)
  182. f.SetCellStr("Sheet1", "D"+iStr, r.Href)
  183. f.SetCellStr("Sheet1", "E"+iStr, r.PublishUnit)
  184. f.SetCellStr("Sheet1", "F"+iStr, r.ListPubTime)
  185. f.SetCellStr("Sheet1", "G"+iStr, r.Content)
  186. f.SetCellStr("Sheet1", "H"+iStr, "")
  187. if len(r.AttachLinks) > 0 {
  188. bs, err := json.Marshal(r.AttachLinks)
  189. if err == nil {
  190. f.SetCellStr("Sheet1", "H"+iStr, string(bs))
  191. }
  192. }
  193. i += 1
  194. }
  195. err := f.SaveAs(filepath)
  196. if err != nil {
  197. return err
  198. }
  199. return nil
  200. }