spider.go 5.0 KB

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