wangyou.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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 md5
  7. import time
  8. import json
  9. name = 'wangyou'
  10. allowed_domains = ['api.wangyou2.com']
  11. source = 'zy_wangyou'
  12. source_name = 'wangyou忘忧'
  13. source_id = 31
  14. sid = '100000106'
  15. key = '4MWJrBwwEdsXnGW426e85f5NYc8TwfJN'
  16. base_url = 'http://api.wangyou2.com/apis/api/{}.php?sid=' + sid + '&sign={}'
  17. doc = 'https://help.2cms.top/web/#/13'
  18. category = [{'channel_id': 1, 'cate_id': '1001', 'cate_name': '热血青春', 'sub_cate_id': '1001001', 'category_id': 67, 'category_name': '校园励志'},
  19. {'channel_id': 1, 'cate_id': '1001', 'cate_name': '', 'sub_cate_id': '1001002', 'category_id': 67, 'category_name': '校园励志'},
  20. {'channel_id': 1, 'cate_id': '1001', 'cate_name': '', 'sub_cate_id': '1001003', 'category_id': 30, 'category_name': '校园黑道'},
  21. {'channel_id': 1, 'cate_id': '1001', 'cate_name': '', 'sub_cate_id': '1001004', 'category_id': 94, 'category_name': '青春爱情'},
  22. {'channel_id': 1, 'cate_id': '1001', 'cate_name': '', 'sub_cate_id': '1001005', 'category_id': 94, 'category_name': '青春爱情'},
  23. {'channel_id': 1, 'cate_id': '1002', 'cate_name': '现代都市', 'sub_cate_id': '1002001', 'category_id': 54, 'category_name': '都市爱情'},
  24. {'channel_id': 1, 'cate_id': '1002', 'cate_name': '', 'sub_cate_id': '1002002', 'category_id': 68, 'category_name': '现代修真'},
  25. {'channel_id': 1, 'cate_id': '1002', 'cate_name': '', 'sub_cate_id': '1002003', 'category_id': 55, 'category_name': '官场沉浮'},
  26. {'channel_id': 1, 'cate_id': '1002', 'cate_name': '', 'sub_cate_id': '1002004', 'category_id': 54, 'category_name': '都市爱情'},
  27. {'channel_id': 1, 'cate_id': '1003', 'cate_name': '悬疑灵异', 'sub_cate_id': '1003001', 'category_id': 81, 'category_name': '灵异恐怖'},
  28. {'channel_id': 1, 'cate_id': '1003', 'cate_name': '', 'sub_cate_id': '1003002', 'category_id': 81, 'category_name': '灵异恐怖'},
  29. {'channel_id': 1, 'cate_id': '1003', 'cate_name': '', 'sub_cate_id': '1003003', 'category_id': 81, 'category_name': '灵异恐怖'},
  30. {'channel_id': 1, 'cate_id': '1003', 'cate_name': '', 'sub_cate_id': '1003004', 'category_id': 81, 'category_name': '灵异恐怖'},
  31. {'channel_id': 1, 'cate_id': '1004', 'cate_name': '军事历史', 'sub_cate_id': '1004001', 'category_id': 14, 'category_name': '历史穿越'},
  32. {'channel_id': 1, 'cate_id': '1004', 'cate_name': '', 'sub_cate_id': '1004002', 'category_id': 14, 'category_name': '历史穿越'},
  33. {'channel_id': 1, 'cate_id': '1004', 'cate_name': '', 'sub_cate_id': '1004003', 'category_id': 14, 'category_name': '历史穿越'},
  34. {'channel_id': 1, 'cate_id': '1004', 'cate_name': '', 'sub_cate_id': '1004004', 'category_id': 14, 'category_name': '历史穿越'},
  35. {'channel_id': 1, 'cate_id': '1005', 'cate_name': '玄幻奇幻', 'sub_cate_id': '1005001', 'category_id': 23, 'category_name': '玄幻奇幻'},
  36. {'channel_id': 1, 'cate_id': '1005', 'cate_name': '', 'sub_cate_id': '1005002', 'category_id': 23, 'category_name': '玄幻奇幻'},
  37. {'channel_id': 1, 'cate_id': '1005', 'cate_name': '', 'sub_cate_id': '1005003', 'category_id': 23, 'category_name': '玄幻奇幻'},
  38. {'channel_id': 1, 'cate_id': '1005', 'cate_name': '', 'sub_cate_id': '1005004', 'category_id': 23, 'category_name': '玄幻奇幻'},
  39. {'channel_id': 1, 'cate_id': '1006', 'cate_name': '武侠仙侠', 'sub_cate_id': '1006001', 'category_id': 23, 'category_name': '玄幻奇幻'},
  40. {'channel_id': 1, 'cate_id': '1006', 'cate_name': '', 'sub_cate_id': '1006002', 'category_id': 23, 'category_name': '玄幻奇幻'},
  41. {'channel_id': 1, 'cate_id': '1006', 'cate_name': '', 'sub_cate_id': '1006003', 'category_id': 23, 'category_name': '玄幻奇幻'},
  42. {'channel_id': 1, 'cate_id': '1006', 'cate_name': '', 'sub_cate_id': '1006004', 'category_id': 23, 'category_name': '玄幻奇幻'},
  43. {'channel_id': 1, 'cate_id': '1007', 'cate_name': '网游竞技', 'sub_cate_id': '1007001', 'category_id': 19, 'category_name': '游戏竞技'},
  44. {'channel_id': 1, 'cate_id': '1007', 'cate_name': '', 'sub_cate_id': '1007002', 'category_id': 19, 'category_name': '游戏竞技'},
  45. {'channel_id': 1, 'cate_id': '1007', 'cate_name': '', 'sub_cate_id': '1007003', 'category_id': 19, 'category_name': '游戏竞技'},
  46. {'channel_id': 1, 'cate_id': '1007', 'cate_name': '', 'sub_cate_id': '1007004', 'category_id': 19, 'category_name': '游戏竞技'},
  47. {'channel_id': 2, 'cate_id': '1008', 'cate_name': '热血言情', 'sub_cate_id': '1008001', 'category_id': 98, 'category_name': '婚恋情感'},
  48. {'channel_id': 2, 'cate_id': '1008', 'cate_name': '', 'sub_cate_id': '1008002', 'category_id': 98, 'category_name': '婚恋情感'},
  49. {'channel_id': 2, 'cate_id': '1008', 'cate_name': '', 'sub_cate_id': '1008003', 'category_id': 98, 'category_name': '婚恋情感'},
  50. {'channel_id': 2, 'cate_id': '1008', 'cate_name': '', 'sub_cate_id': '1008004', 'category_id': 98, 'category_name': '婚恋情感'},
  51. {'channel_id': 2, 'cate_id': '1008', 'cate_name': '', 'sub_cate_id': '1008005', 'category_id': 98, 'category_name': '婚恋情感'},
  52. {'channel_id': 2, 'cate_id': '1009', 'cate_name': '古代情缘', 'sub_cate_id': '1009001', 'category_id': 120, 'category_name': '宫斗宅斗'},
  53. {'channel_id': 2, 'cate_id': '1009', 'cate_name': '', 'sub_cate_id': '1009002', 'category_id': 120, 'category_name': '宫斗宅斗'},
  54. {'channel_id': 2, 'cate_id': '1009', 'cate_name': '', 'sub_cate_id': '1009003', 'category_id': 123, 'category_name': '女尊王朝'},
  55. {'channel_id': 2, 'cate_id': '1009', 'cate_name': '', 'sub_cate_id': '1009004', 'category_id': 123, 'category_name': '女尊王朝'},
  56. {'channel_id': 2, 'cate_id': '1009', 'cate_name': '', 'sub_cate_id': '1009005', 'category_id': 123, 'category_name': '女尊王朝'},
  57. {'channel_id': 2, 'cate_id': '1010', 'cate_name': '现代爱情', 'sub_cate_id': '1010001', 'category_id': 98, 'category_name': '婚恋情感'},
  58. {'channel_id': 2, 'cate_id': '1010', 'cate_name': '', 'sub_cate_id': '1010002', 'category_id': 98, 'category_name': '婚恋情 感'},
  59. {'channel_id': 2, 'cate_id': '1010', 'cate_name': '', 'sub_cate_id': '1010003', 'category_id': 98, 'category_name': '婚恋情感'},
  60. {'channel_id': 2, 'cate_id': '1010', 'cate_name': '', 'sub_cate_id': '1010004', 'category_id': 98, 'category_name': '婚恋情感'},
  61. {'channel_id': 2, 'cate_id': '1010', 'cate_name': '', 'sub_cate_id': '1010005', 'category_id': 98, 'category_name': '婚恋情感'},
  62. {'channel_id': 2, 'cate_id': '1011', 'cate_name': '幻想世界', 'sub_cate_id': '1011001', 'category_id': 96, 'category_name': '东方玄幻'},
  63. {'channel_id': 2, 'cate_id': '1011', 'cate_name': '', 'sub_cate_id': '1011002', 'category_id': 96, 'category_name': '东方玄幻'},
  64. {'channel_id': 2, 'cate_id': '1011', 'cate_name': '', 'sub_cate_id': '1011003', 'category_id': 96, 'category_name': '东方玄幻'},
  65. {'channel_id': 2, 'cate_id': '1011', 'cate_name': '', 'sub_cate_id': '1011004', 'category_id': 96, 'category_name': '东方玄幻'},
  66. {'channel_id': 2, 'cate_id': '1011', 'cate_name': '', 'sub_cate_id': '1011005', 'category_id': 96, 'category_name': '东方玄幻'},
  67. {'channel_id': 2, 'cate_id': '1011', 'cate_name': '', 'sub_cate_id': '1011006', 'category_id': 96, 'category_name': '东方玄幻'}]
  68. def get_sign():
  69. today = time.strftime("%Y%m%d", time.localtime())
  70. sign_str = today + sid + key
  71. return md5(sign_str)
  72. def get_category(sub_cate_id):
  73. for item in category:
  74. if str(sub_cate_id) == item['sub_cate_id']:
  75. return item
  76. return item[0]
  77. class wangyouProcess(object):
  78. name = name
  79. allowed_domains = allowed_domains
  80. source = source
  81. source_name = source_name
  82. source_id = source_id
  83. def get_start_url(self):
  84. sign = get_sign()
  85. return base_url.format('BookList',sign)
  86. def bid_list_result(self, response):
  87. result = json.loads(response.text)
  88. if result is None or result.get('data') is None:
  89. return []
  90. result_list = []
  91. for item in result['data']:
  92. result_list.append({'id': item['id']})
  93. return result_list
  94. def get_book_info_url(self, bid):
  95. sign = get_sign()
  96. return base_url.format('BookInfo',sign) + '&bookid={}'.format(bid)
  97. def book_info_result(self, response):
  98. result = json.loads(response.text)
  99. result = result['data']
  100. category_info = get_category(result['ctitle']);
  101. return {
  102. 'bid': result['id'], 'name': result['bookTitle'], 'author': result['author'],
  103. 'intro': result['introduction'], 'cover': result['cover'], 'keyword': result['labels'],
  104. 'status':result['state'], 'category': category_info['category_name'],'category_id':category_info['category_id'],
  105. 'channel': result['channel_id']
  106. }
  107. def get_chapter_list_url(self, bid):
  108. sign = get_sign()
  109. return base_url.format('BookChapters',sign) + '&bookid={}'.format(bid)
  110. def chapter_list_result(self, response):
  111. result = json.loads(response.text)
  112. if result is None or result.get('data') is None:
  113. return []
  114. result_list = []
  115. i = 0
  116. for chapter_item in result['data']:
  117. i = i+1
  118. result_list.append({
  119. 'source_chapter_id': chapter_item['id'], 'name': chapter_item['title'],
  120. 'sequence': chapter_item['orders'], 'is_vip': 1 if chapter_item['isVip'] else 0,
  121. 'size': 0, 'recent_update_at': chapter_item['postTime']
  122. })
  123. return result_list
  124. def get_chapter_content_url(self, bid, cid):
  125. sign = get_sign()
  126. return base_url.format('BookChapterInfo',sign) + '&bookid={}&chapterid={}'.format(bid, cid)
  127. def chapter_content_result(self, response):
  128. result = json.loads(response.text)
  129. if result is None:
  130. return {'content': ''}
  131. return {
  132. 'content': result['data']['content'],
  133. 'size': len(result['data']['content'])
  134. }
  135. class wangyouSpider(wangyouProcess,baseSpider):
  136. name = name
  137. custom_settings = {
  138. 'DOWNLOAD_DELAY': 0.1,
  139. 'SOURCE': source,
  140. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  141. }
  142. class wangyouUpdateSpider(wangyouProcess,baseUpdateSpider):
  143. name = name + "update"
  144. custom_settings = {
  145. 'DOWNLOAD_DELAY': 0.1,
  146. 'SOURCE': source,
  147. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  148. }
  149. class wangyouFixSpider(wangyouProcess,fixChapterSpider):
  150. name = name + 'fix'
  151. custom_settings = {
  152. 'DOWNLOAD_DELAY': 0.1,
  153. 'SOURCE': source,
  154. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  155. }
  156. class wangyouBookInfoSpider(wangyouProcess,baseUpdateBookStatusSpider):
  157. name = name + "bookinfo"
  158. custom_settings = {
  159. 'DOWNLOAD_DELAY': 0.1,
  160. 'SOURCE': source,
  161. 'LOG_FILE': 'content_spider/log/' + name + time.strftime("%Y-%m-%d", time.localtime()) + '.log'
  162. }