py_dm84.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. # coding=utf-8
  2. # !/usr/bin/python
  3. import sys
  4. import requests
  5. from lxml import etree
  6. sys.path.append('..')
  7. from base.spider import Spider
  8. class Spider(Spider):
  9. def getName(self):
  10. return "dm84"
  11. def init(self, extend):
  12. self.home_url = 'https://dmbus.cc'
  13. self.headers = {
  14. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"}
  15. def getDependence(self):
  16. return []
  17. def isVideoFormat(self, url):
  18. pass
  19. def manualVideoCheck(self):
  20. pass
  21. def homeContent(self, filter):
  22. return {
  23. 'class': [{'type_id': '1', 'type_name': '国产动漫'},
  24. {'type_id': '2', 'type_name': '日本动漫'},
  25. {'type_id': '3', 'type_name': '欧美动漫'},
  26. {'type_id': '4', 'type_name': '电影'}],
  27. 'filters': {
  28. '1': [{'key': 'type',
  29. 'name': '类型',
  30. 'value': [{'n': '全部', 'v': ''},
  31. {'n': '奇幻', 'v': '奇幻'},
  32. {'n': '战斗', 'v': '战斗'},
  33. {'n': '玄幻', 'v': '玄幻'},
  34. {'n': '穿越', 'v': '穿越'},
  35. {'n': '科幻', 'v': '科幻'},
  36. {'n': '武侠', 'v': '武侠'},
  37. {'n': '热血', 'v': '热血'},
  38. {'n': '耽美', 'v': '耽美'},
  39. {'n': '搞笑', 'v': '搞笑'},
  40. {'n': '动态漫画', 'v': '动态漫画'}]},
  41. {'key': 'year',
  42. 'name': '时间',
  43. 'value': [{'n': '全部', 'v': ''},
  44. {'n': '2024', 'v': '2024'},
  45. {'n': '2023', 'v': '2023'},
  46. {'n': '2022', 'v': '2022'},
  47. {'n': '2021', 'v': '2021'},
  48. {'n': '2020', 'v': '2020'},
  49. {'n': '2019', 'v': '2019'},
  50. {'n': '2018', 'v': '2018'},
  51. {'n': '2017', 'v': '2017'},
  52. {'n': '2016', 'v': '2016'},
  53. {'n': '2015', 'v': '2015'}]},
  54. {'key': 'by',
  55. 'name': '排序',
  56. 'value': [{'n': '按时间', 'v': 'time'},
  57. {'n': '按人气', 'v': 'hits'},
  58. {'n': '按评分', 'v': 'score'}]}],
  59. '2': [{'key': 'type',
  60. 'name': '类型',
  61. 'value': [{'n': '全部', 'v': ''},
  62. {'n': '冒险', 'v': '冒险'},
  63. {'n': '奇幻', 'v': '奇幻'},
  64. {'n': '战斗', 'v': '战斗'},
  65. {'n': '后宫', 'v': '后宫'},
  66. {'n': '热血', 'v': '热血'},
  67. {'n': '励志', 'v': '励志'},
  68. {'n': '搞笑', 'v': '搞笑'},
  69. {'n': '校园', 'v': '校园'},
  70. {'n': '机战', 'v': '机战'},
  71. {'n': '悬疑', 'v': '悬疑'},
  72. {'n': '治愈', 'v': '治愈'},
  73. {'n': '百合', 'v': '百合'},
  74. {'n': '恐怖', 'v': '恐怖'},
  75. {'n': '泡面番', 'v': '泡面番'},
  76. {'n': '恋爱', 'v': '恋爱'},
  77. {'n': '推理', 'v': '推理'}]},
  78. {'key': 'year',
  79. 'name': '时间',
  80. 'value': [{'n': '全部', 'v': ''},
  81. {'n': '2024', 'v': '2024'},
  82. {'n': '2023', 'v': '2023'},
  83. {'n': '2022', 'v': '2022'},
  84. {'n': '2021', 'v': '2021'},
  85. {'n': '2020', 'v': '2020'},
  86. {'n': '2019', 'v': '2019'},
  87. {'n': '2018', 'v': '2018'},
  88. {'n': '2017', 'v': '2017'},
  89. {'n': '2016', 'v': '2016'},
  90. {'n': '2015', 'v': '2015'}]},
  91. {'key': 'by',
  92. 'name': '排序',
  93. 'value': [{'n': '按时间', 'v': 'time'},
  94. {'n': '按人气', 'v': 'hits'},
  95. {'n': '按评分', 'v': 'score'}]}],
  96. '3': [{'key': 'type',
  97. 'name': '类型',
  98. 'value': [{'n': '全部', 'v': ''},
  99. {'n': '科幻', 'v': '科幻'},
  100. {'n': '冒险', 'v': '冒险'},
  101. {'n': '战斗', 'v': '战斗'},
  102. {'n': '百合', 'v': '百合'},
  103. {'n': '奇幻', 'v': '奇幻'},
  104. {'n': '热血', 'v': '热血'},
  105. {'n': '搞笑', 'v': '搞笑'}]},
  106. {'key': 'year',
  107. 'name': '时间',
  108. 'value': [{'n': '全部', 'v': ''},
  109. {'n': '2024', 'v': '2024'},
  110. {'n': '2023', 'v': '2023'},
  111. {'n': '2022', 'v': '2022'},
  112. {'n': '2021', 'v': '2021'},
  113. {'n': '2020', 'v': '2020'},
  114. {'n': '2019', 'v': '2019'},
  115. {'n': '2018', 'v': '2018'},
  116. {'n': '2017', 'v': '2017'},
  117. {'n': '2016', 'v': '2016'},
  118. {'n': '2015', 'v': '2015'}]},
  119. {'key': 'by',
  120. 'name': '排序',
  121. 'value': [{'n': '按时间', 'v': 'time'},
  122. {'n': '按人气', 'v': 'hits'},
  123. {'n': '按评分', 'v': 'score'}]}],
  124. '4': [{'key': 'type',
  125. 'name': '类型',
  126. 'value': [{'n': '全部', 'v': ''},
  127. {'n': '搞笑', 'v': '搞笑'},
  128. {'n': '奇幻', 'v': '奇幻'},
  129. {'n': '治愈', 'v': '治愈'},
  130. {'n': '科幻', 'v': '科幻'},
  131. {'n': '喜剧', 'v': '喜剧'},
  132. {'n': '冒险', 'v': '冒险'},
  133. {'n': '动作', 'v': '动作'},
  134. {'n': '爱情', 'v': '爱情'}]},
  135. {'key': 'year',
  136. 'name': '时间',
  137. 'value': [{'n': '全部', 'v': ''},
  138. {'n': '2024', 'v': '2024'},
  139. {'n': '2023', 'v': '2023'},
  140. {'n': '2022', 'v': '2022'},
  141. {'n': '2021', 'v': '2021'},
  142. {'n': '2020', 'v': '2020'},
  143. {'n': '2019', 'v': '2019'},
  144. {'n': '2018', 'v': '2018'},
  145. {'n': '2017', 'v': '2017'},
  146. {'n': '2016', 'v': '2016'},
  147. {'n': '2015', 'v': '2015'}]},
  148. {'key': 'by',
  149. 'name': '排序',
  150. 'value': [{'n': '按时间', 'v': 'time'},
  151. {'n': '按人气', 'v': 'hits'},
  152. {'n': '按评分', 'v': 'score'}]}]
  153. }
  154. }
  155. def homeVideoContent(self):
  156. data = self.get_data(self.home_url)
  157. return {'list': data, 'parse': 0, 'jx': 0}
  158. def categoryContent(self, cid, page, filter, ext):
  159. _type = ext.get('type') if ext.get('type') else ''
  160. _year = ext.get('year') if ext.get('year') else ''
  161. _by = ext.get('by') if ext.get('by') else ''
  162. url = f'{self.home_url}/show-{cid}--{_by}-{_type}--{_year}-{page}.html'
  163. data = self.get_data(url)
  164. return {'list': data, 'parse': 0, 'jx': 0}
  165. # return {"list": [], "msg": "来自py_dependence的categoryContent"}
  166. def detailContent(self, did):
  167. ids = did[0]
  168. video_list = []
  169. try:
  170. res = requests.get(f'{self.home_url}/v/{ids}.html', headers=self.headers)
  171. root = etree.HTML(res.text)
  172. vod_play_from = '$$$'.join(root.xpath(
  173. '//ul[contains(@class, "play_from")]/li/text()')) # //ul[contains(@class, "abc")] [@class="tab_control play_from"]
  174. play_list = root.xpath('//ul[contains(@class, "play_list")]')
  175. vod_play_url = []
  176. for i in play_list:
  177. name_list = i.xpath('./li/a/text()')
  178. url_list = i.xpath('./li/a/@href')
  179. vod_play_url.append(
  180. '#'.join([_name + '$' + _url for _name, _url in zip(name_list, url_list)])
  181. )
  182. video_list.append(
  183. {
  184. 'type_name': '',
  185. 'vod_id': ids,
  186. 'vod_name': '',
  187. 'vod_remarks': '',
  188. 'vod_year': '',
  189. 'vod_area': '',
  190. 'vod_actor': '',
  191. 'vod_director': '沐辰_为爱发电',
  192. 'vod_content': '',
  193. 'vod_play_from': vod_play_from,
  194. 'vod_play_url': '$$$'.join(vod_play_url)
  195. }
  196. )
  197. return {"list": video_list, 'parse': 0, 'jx': 0}
  198. except requests.RequestException as e:
  199. return {'list': [], 'msg': e}
  200. # return {"list": [], "msg": "来自py_dependence的detailContent"}
  201. def searchContent(self, key, quick, page='1'):
  202. if page != '1':
  203. return {'list': [], 'parse': 0, 'jx': 0}
  204. url = f'{self.home_url}/s----------.html?wd={key}'
  205. data = self.get_data(url)
  206. return {'list': data, 'parse': 0, 'jx': 0}
  207. # return {"list": [], "msg": "来自py_dependence的searchContent"}
  208. def playerContent(self, flag, pid, vipFlags):
  209. play_url = 'https://gitee.com/dobebly/my_img/raw/c1977fa6134aefb8e5a34dabd731a4d186c84a4d/x.mp4'
  210. try:
  211. res = requests.get(f'{self.home_url}{pid}', headers=self.headers)
  212. root = etree.HTML(res.text)
  213. urls = root.xpath('//iframe/@src')
  214. if len(urls) == 0:
  215. return {'url': play_url, 'parse': 0, 'jx': 0}
  216. return {'url': urls[0], 'parse': 1, 'jx': 0}
  217. except requests.RequestException as e:
  218. print(e)
  219. return {'url': play_url, 'parse': 0, 'jx': 0}
  220. # return {"list": [], "msg": "来自py_dependence的playerContent"}
  221. def localProxy(self, params):
  222. pass
  223. def destroy(self):
  224. return '正在Destroy'
  225. def get_data(self, url):
  226. data = []
  227. try:
  228. res = requests.get(url, headers=self.headers)
  229. root = etree.HTML(res.text)
  230. data_list = root.xpath('//li/div[@class="item"]')
  231. for i in data_list:
  232. data.append(
  233. {
  234. 'vod_id': i.xpath('./a[2]/@href')[0].split('/')[-1].split('.')[0],
  235. 'vod_name': i.xpath('./a[2]/@title')[0],
  236. 'vod_pic': i.xpath('./a[1]/@data-bg')[0],
  237. 'vod_remarks': i.xpath('./span/text()')[0]
  238. }
  239. )
  240. except requests.RequestException as e:
  241. return data
  242. return data