liuyue.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. # -*- coding: utf-8 -*-
  2. from content_spider.baseSpider import baseSpider
  3. from content_spider.baseSpider import baseUpdateSpider
  4. from content_spider.baseSpider import fixChapterSpider
  5. from content_spider.baseSpider import baseUpdateBookStatusSpider
  6. from content_spider.Util import get_category_by_id
  7. from content_spider.Util import md5
  8. import time
  9. import json
  10. name = 'liuyue'
  11. allowed_domains = ['api.6yxs.com']
  12. source = 'zy_liuyue'
  13. source_name = 'liuyue六月'
  14. source_id = 33
  15. base_url = 'http://api.6yxs.com/Open'
  16. doc = 'https://docs.qq.com/doc/DZm1ic0RiWENWelNx?u=2ddd749abc4a466e8277cd2c98def851'
  17. apiname = 'zhiyu'
  18. category = [
  19. {'channel_id': 1, 'ncategory_id': 21, 'name': '东方玄幻', 'my_category_name': '玄幻仙侠', 'my_category_id': 1,
  20. 'pname': '玄幻奇幻', 'id': 13},
  21. {'channel_id': 1, 'ncategory_id': 22, 'name': '西方玄幻', 'my_category_name': '玄幻仙侠', 'my_category_id': 1,
  22. 'pname': '玄幻奇幻', 'id': 14},
  23. {'channel_id': 1, 'ncategory_id': 21, 'name': '传统武侠', 'my_category_name': '玄幻仙侠', 'my_category_id': 1,
  24. 'pname': '武侠仙侠', 'id': 15},
  25. {'channel_id': 1, 'ncategory_id': 21, 'name': '古典仙侠', 'my_category_name': '玄幻仙侠', 'my_category_id': 1,
  26. 'pname': '武侠仙侠', 'id': 16},
  27. {'channel_id': 1, 'ncategory_id': 54, 'name': '都市生活', 'my_category_name': '都市暧昧', 'my_category_id': 3,
  28. 'pname': '都市职场', 'id': 17},
  29. {'channel_id': 1, 'ncategory_id': 68, 'name': '异能超能', 'my_category_name': '都市暧昧', 'my_category_id': 3,
  30. 'pname': '都市职场', 'id': 18},
  31. {'channel_id': 1, 'ncategory_id': 67, 'name': '青春校园', 'my_category_name': '热血校园', 'my_category_id': 2,
  32. 'pname': '都市职场', 'id': 19},
  33. {'channel_id': 1, 'ncategory_id': 55, 'name': '官场商战', 'my_category_name': '都市暧昧', 'my_category_id': 3,
  34. 'pname': '都市职场', 'id': 20},
  35. {'channel_id': 1, 'ncategory_id': 14, 'name': '架空历史', 'my_category_name': '军事历史', 'my_category_id': 4,
  36. 'pname': '历史军事', 'id': 21},
  37. {'channel_id': 1, 'ncategory_id': 14, 'name': '纪实历史', 'my_category_name': '军事历史', 'my_category_id': 4,
  38. 'pname': '历史军事', 'id': 22},
  39. {'channel_id': 1, 'ncategory_id': 51, 'name': '军事战争', 'my_category_name': '军事历史', 'my_category_id': 4,
  40. 'pname': '历史军事', 'id': 23},
  41. {'channel_id': 1, 'ncategory_id': 51, 'name': '军旅幻想', 'my_category_name': '军事历史', 'my_category_id': 4,
  42. 'pname': '历史军事', 'id': 24},
  43. {'channel_id': 1, 'ncategory_id': 19, 'name': '游戏生涯', 'my_category_name': '游戏竞技', 'my_category_id': 7,
  44. 'pname': '游戏竞技', 'id': 25},
  45. {'channel_id': 1, 'ncategory_id': 19, 'name': '游戏异界', 'my_category_name': '游戏竞技', 'my_category_id': 7,
  46. 'pname': '游戏竞技', 'id': 26},
  47. {'channel_id': 1, 'ncategory_id': 19, 'name': '体育竞技', 'my_category_name': '游戏竞技', 'my_category_id': 7,
  48. 'pname': '游戏竞技', 'id': 27},
  49. {'channel_id': 1, 'ncategory_id': 127, 'name': '未来世界', 'my_category_name': '其他', 'my_category_id': 124,
  50. 'pname': '科幻灵异', 'id': 28},
  51. {'channel_id': 1, 'ncategory_id': 127, 'name': '末世危机', 'my_category_name': '其他', 'my_category_id': 124,
  52. 'pname': '科幻灵异', 'id': 29},
  53. {'channel_id': 1, 'ncategory_id': 81, 'name': '推理侦探', 'my_category_name': '悬疑灵异', 'my_category_id': 8,
  54. 'pname': '科幻灵异', 'id': 30},
  55. {'channel_id': 1, 'ncategory_id': 81, 'name': '悬疑探险', 'my_category_name': '悬疑灵异', 'my_category_id': 8,
  56. 'pname': '科幻灵异', 'id': 31},
  57. {'channel_id': 2, 'ncategory_id': 88, 'name': '豪门世家', 'my_category_name': '现代言情', 'my_category_id': 87,
  58. 'pname': '现代言情', 'id': 32},
  59. {'channel_id': 2, 'ncategory_id': 117, 'name': '娱乐明星', 'my_category_name': '现代言情', 'my_category_id': 87,
  60. 'pname': '现代言情', 'id': 33},
  61. {'channel_id': 2, 'ncategory_id': 98, 'name': '婚恋情缘', 'my_category_name': '现代言情', 'my_category_id': 87,
  62. 'pname': '现代言情', 'id': 34},
  63. {'channel_id': 2, 'ncategory_id': 103, 'name': '青春纯爱', 'my_category_name': '浪漫青春', 'my_category_id': 101,
  64. 'pname': '浪漫青春', 'id': 35},
  65. {'channel_id': 2, 'ncategory_id': 105, 'name': '青春疼痛', 'my_category_name': '浪漫青春', 'my_category_id': 101,
  66. 'pname': '浪漫青春', 'id': 36},
  67. {'channel_id': 2, 'ncategory_id': 104, 'name': '青春校园', 'my_category_name': '浪漫青春', 'my_category_id': 101,
  68. 'pname': '浪漫青春', 'id': 37},
  69. {'channel_id': 2, 'ncategory_id': 83, 'name': '古代架空', 'my_category_name': '古代言情', 'my_category_id': 82,
  70. 'pname': '古代言情', 'id': 38},
  71. {'channel_id': 2, 'ncategory_id': 120, 'name': '宫闱宅斗', 'my_category_name': '古代言情', 'my_category_id': 82,
  72. 'pname': '古代言情', 'id': 39},
  73. {'channel_id': 2, 'ncategory_id': 84, 'name': '经商种田', 'my_category_name': '古代言情', 'my_category_id': 82,
  74. 'pname': '古代言情', 'id': 40},
  75. {'channel_id': 2, 'ncategory_id': 110, 'name': '魔法幻情', 'my_category_name': '幻想言情', 'my_category_id': 93,
  76. 'pname': '仙侠奇缘', 'id': 41},
  77. {'channel_id': 2, 'ncategory_id': 110, 'name': '玄幻言情', 'my_category_name': '幻想言情', 'my_category_id': 93,
  78. 'pname': '仙侠奇缘', 'id': 42},
  79. {'channel_id': 2, 'ncategory_id': 111, 'name': '推理探险', 'my_category_name': '女生灵异', 'my_category_id': 92,
  80. 'pname': '悬疑灵异', 'id': 43},
  81. {'channel_id': 2, 'ncategory_id': 112, 'name': '灵异鬼怪', 'my_category_name': '女生灵异', 'my_category_id': 92,
  82. 'pname': '悬疑灵异', 'id': 44},
  83. {'channel_id': 2, 'ncategory_id': 106, 'name': '现代耽美', 'my_category_name': '耽美同人', 'my_category_id': 102,
  84. 'pname': '耽美同人', 'id': 45},
  85. {'channel_id': 2, 'ncategory_id': 106, 'name': '古代耽美', 'my_category_name': '耽美同人', 'my_category_id': 102,
  86. 'pname': '耽美同人', 'id': 46},
  87. {'channel_id': 2, 'ncategory_id': 106, 'name': '同人小说', 'my_category_name': '耽美同人', 'my_category_id': 102,
  88. 'pname': '耽美同人', 'id': 47},
  89. {'channel_id': 2, 'ncategory_id': 107, 'name': '中国文学', 'my_category_name': '其他', 'my_category_id': 100,
  90. 'pname': '经典文学', 'id': 49},
  91. {'channel_id': 2, 'ncategory_id': 107, 'name': '外国文学', 'my_category_name': '其他', 'my_category_id': 100,
  92. 'pname': '经典文学', 'id': 50},
  93. {'channel_id': 2, 'ncategory_id': 107, 'name': '成功励志', 'my_category_name': '其他', 'my_category_id': 100,
  94. 'pname': '经管励志', 'id': 56},
  95. {'channel_id': 2, 'ncategory_id': 107, 'name': '理财管理', 'my_category_name': '其他', 'my_category_id': 100,
  96. 'pname': '经管励志', 'id': 57},
  97. {'channel_id': 2, 'ncategory_id': 107, 'name': '少儿读物', 'my_category_name': '其他', 'my_category_id': 100,
  98. 'pname': '少儿教育', 'id': 58},
  99. {'channel_id': 2, 'ncategory_id': 107, 'name': '亲子教育', 'my_category_name': '其他', 'my_category_id': 100,
  100. 'pname': '少儿教育', 'id': 59},
  101. {'channel_id': 2, 'ncategory_id': 107, 'name': '社会军事', 'my_category_name': '其他', 'my_category_id': 100,
  102. 'pname': '人文社科', 'id': 60},
  103. {'channel_id': 2, 'ncategory_id': 107, 'name': '历史文化', 'my_category_name': '其他', 'my_category_id': 100,
  104. 'pname': '人文社科', 'id': 61},
  105. {'channel_id': 2, 'ncategory_id': 107, 'name': '健康生活', 'my_category_name': '其他', 'my_category_id': 100,
  106. 'pname': '人文社科', 'id': 62},
  107. {'channel_id': 2, 'ncategory_id': 107, 'name': '心理读物', 'my_category_name': '其他', 'my_category_id': 100,
  108. 'pname': '人文社科', 'id': 63},
  109. {'channel_id': 2, 'ncategory_id': 107, 'name': '科普读物', 'my_category_name': '其他', 'my_category_id': 100,
  110. 'pname': '人文社科', 'id': 64},
  111. {'channel_id': 2, 'ncategory_id': 107, 'name': '影视原著', 'my_category_name': '其他', 'my_category_id': 100,
  112. 'pname': '文学艺术', 'id': 65},
  113. {'channel_id': 2, 'ncategory_id': 107, 'name': '人物传记', 'my_category_name': '其他', 'my_category_id': 100,
  114. 'pname': '文学艺术', 'id': 66},
  115. {'channel_id': 2, 'ncategory_id': 107, 'name': '散文随笔', 'my_category_name': '其他', 'my_category_id': 100,
  116. 'pname': '文学艺术', 'id': 67},
  117. {'channel_id': 2, 'ncategory_id': 107, 'name': '诗词歌赋', 'my_category_name': '其他', 'my_category_id': 100,
  118. 'pname': '文学艺术', 'id': 68},
  119. {'channel_id': 2, 'ncategory_id': 107, 'name': '古代言情', 'my_category_name': '其他', 'my_category_id': 100,
  120. 'pname': '出版小说', 'id': 69},
  121. {'channel_id': 2, 'ncategory_id': 107, 'name': '现代言情', 'my_category_name': '其他', 'my_category_id': 100,
  122. 'pname': '出版小说', 'id': 70},
  123. {'channel_id': 2, 'ncategory_id': 107, 'name': '科幻未来', 'my_category_name': '其他', 'my_category_id': 100,
  124. 'pname': '出版小说', 'id': 71},
  125. {'channel_id': 2, 'ncategory_id': 107, 'name': '悬疑推理', 'my_category_name': '其他', 'my_category_id': 100,
  126. 'pname': '出版小说', 'id': 72},
  127. {'channel_id': 2, 'ncategory_id': 107, 'name': '武侠仙侠', 'my_category_name': '其他', 'my_category_id': 100,
  128. 'pname': '出版小说', 'id': 73},
  129. {'channel_id': 2, 'ncategory_id': 107, 'name': '青春文学', 'my_category_name': '其他', 'my_category_id': 100,
  130. 'pname': '出版小说', 'id': 74},
  131. {'channel_id': 2, 'ncategory_id': 107, 'name': '现实小说', 'my_category_name': '其他', 'my_category_id': 100,
  132. 'pname': '出版小说', 'id': 75},
  133. {'channel_id': 2, 'ncategory_id': 107, 'name': '历史小说', 'my_category_name': '其他', 'my_category_id': 100,
  134. 'pname': '出版小说', 'id': 76}]
  135. def get_category(sub_name):
  136. for item in category:
  137. if item['name'] == sub_name:
  138. return item
  139. return {'channel_id': 2, 'ncategory_id': 88, 'name': '豪门世家', 'my_category_name': '现代言情', 'my_category_id': 87,
  140. 'pname': '现代言情', 'id': 32}
  141. class liuyueProcess(object):
  142. name = name
  143. allowed_domains = allowed_domains
  144. source = source
  145. source_name = source_name
  146. source_id = source_id
  147. def get_start_url(self):
  148. return base_url + '/book?apiname=' + apiname
  149. def bid_list_result(self, response):
  150. result = json.loads(response.text)
  151. if result is None:
  152. return []
  153. result_list = []
  154. for item in result['result']:
  155. result_list.append({'id': item['bookid']})
  156. return result_list
  157. def get_book_info_url(self, bid):
  158. return base_url + '/bookInfo?apiname={}&bookid={}'.format(apiname,bid)
  159. def book_info_result(self, response):
  160. result = json.loads(response.text)
  161. result = result.get('result')
  162. if result is None:
  163. return None
  164. subcatid = result['category'].split(',')[2]
  165. category_info = get_category(subcatid)
  166. category_id = category_info['my_category_id']
  167. ncategory_id = category_info['ncategory_id']
  168. category_name = category_info['my_category_name']
  169. channel_id = category_info['channel_id']
  170. sub_subscribe_info = get_category_by_id(ncategory_id)
  171. sub_subscribe_name = category_name if sub_subscribe_info is None else sub_subscribe_info['category_name']
  172. return {
  173. 'bid': result['bookid'], 'name': result['bookname'], 'author': result['authorname'],
  174. 'intro': result['intro'], 'cover': result['bookpic'], 'keyword': result['tags'],
  175. 'status': result['fullflag'],
  176. 'category_id': ncategory_id,
  177. 'category': sub_subscribe_name, 'channel': channel_id
  178. }
  179. def get_chapter_list_url(self, bid):
  180. return base_url + '/Chapter?apiname={}&bookid={}'.format(apiname,bid)
  181. def chapter_list_result(self, response):
  182. result = json.loads(response.text)
  183. if result is None:
  184. return []
  185. result_list = []
  186. for chapter_item in result['result']:
  187. result_list.append({
  188. 'source_chapter_id': chapter_item['chapterid'], 'name': chapter_item['chaptername'],
  189. 'sequence': chapter_item['chapterorder'], 'is_vip': chapter_item['vip'],
  190. 'size': chapter_item['words'], 'recent_update_at': chapter_item['update_date']
  191. })
  192. return result_list
  193. def get_chapter_content_url(self, bid, cid):
  194. return base_url + '/Content?apiname={}&bookid={}&chapterid={}'.format(apiname,bid, cid)
  195. def chapter_content_result(self, response):
  196. result = json.loads(response.text)
  197. if result is None:
  198. return {'content': ''}
  199. return {
  200. 'content': result['result']['content'],
  201. }
  202. class liuyueSpider(liuyueProcess,baseSpider):
  203. name = name
  204. custom_settings = {
  205. 'DOWNLOAD_DELAY': 0.1,
  206. 'SOURCE': source,
  207. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  208. }
  209. class liuyueUpdateSpider(liuyueProcess,baseUpdateSpider):
  210. name = name + "update"
  211. custom_settings = {
  212. 'DOWNLOAD_DELAY': 0.1,
  213. 'SOURCE': source,
  214. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  215. }
  216. class liuyueFixSpider(liuyueProcess,fixChapterSpider):
  217. name = name + 'fix'
  218. custom_settings = {
  219. 'DOWNLOAD_DELAY': 0.1,
  220. 'SOURCE': source,
  221. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  222. }
  223. class liuyueBookInfoSpider(liuyueProcess,baseUpdateBookStatusSpider):
  224. name = name + "bookinfo"
  225. custom_settings = {
  226. 'DOWNLOAD_DELAY': 0.1,
  227. 'SOURCE': source,
  228. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  229. }