zhongqingkandian.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # -*- coding: utf-8 -*-
  2. import json
  3. import time
  4. import requests
  5. sys.path.append(os.getcwd())
  6. from application.common.feishu.feishu_utils import FeishuUtils
  7. from application.common.log import Local
  8. # from application.common.feishu.feishu_utils import FeishuUtils
  9. # from application.common.log import Local
  10. import sys,os
  11. class ZhongQingKanDian:
  12. API_BASE_URL = "http://8.217.192.46:8889"
  13. COMMON_HEADERS = {
  14. "Content-Type": "application/json"
  15. }
  16. MAX_RETRIES = 3
  17. TIMEOUT = 10 # 设置超时时间
  18. def __init__(self):
  19. self.session = requests.Session()
  20. self.session.headers.update(self.COMMON_HEADERS)
  21. # 初始化请求次数计数器
  22. self.recommend_list_request_count = 0
  23. self.content_recommend_list_request_count = 0
  24. self.detail_request_count = 0
  25. def send_request(self, endpoint, data):
  26. full_url = f"{self.API_BASE_URL}{endpoint}"
  27. for retry in range(self.MAX_RETRIES):
  28. try:
  29. response = self.session.post(full_url, data=data, timeout=self.TIMEOUT)
  30. response.raise_for_status()
  31. return response.json()
  32. except requests.RequestException as e:
  33. Local.logger("zhongqingkandian", "recommend").info(
  34. f"请求 {full_url} 失败(第 {retry + 1} 次重试): {e}")
  35. if retry < self.MAX_RETRIES - 1:
  36. time.sleep(2)
  37. except json.JSONDecodeError as e:
  38. Local.logger("zhongqingkandian", "recommend").info(
  39. f"解析 {full_url} 的响应数据失败(第 {retry + 1} 次重试): {e}")
  40. # print(f"解析 {full_url} 的响应数据失败(第 {retry + 1} 次重试): {e}")
  41. if retry < self.MAX_RETRIES - 1:
  42. time.sleep(2)
  43. return None
  44. def is_response_valid(self, resp):
  45. if resp and resp.get("code", -1) == 0:
  46. data = resp.get("data", {}).get("data")
  47. return data is not None
  48. return False
  49. def req_recommend_list(self):
  50. url = '/crawler/zhong_qing_kan_dian/recommend'
  51. body = json.dumps({"cursor": ""})
  52. resp = self.send_request(url, body)
  53. if self.is_response_valid(resp):
  54. self.recommend_list_request_count += 1
  55. Local.logger("zhongqingkandian", "recommend").info(f"请求推荐流的总次数: {self.recommend_list_request_count}响应:{resp}")
  56. return resp["data"]["data"]
  57. Local.logger("zhongqingkandian", "recommend").info(
  58. f"请求推荐流失败,返回异常: {resp}")
  59. return None
  60. def req_content_recommend_list(self, content_id):
  61. url = '/crawler/zhong_qing_kan_dian/related'
  62. body = json.dumps({
  63. "content_id": str(content_id),
  64. "cursor": ""
  65. })
  66. resp = self.send_request(url, body)
  67. if self.is_response_valid(resp):
  68. self.content_recommend_list_request_count += 1
  69. Local.logger("zhongqingkandian", "recommend").info(f"请求内容相关推荐流的总次数: {self.content_recommend_list_request_count}响应:{resp}")
  70. return resp["data"]["data"]
  71. Local.logger("zhongqingkandian", "recommend").info(
  72. f"请求内容相关推荐流失败,返回异常: {resp}")
  73. return None
  74. def req_detail(self, content_link, label):
  75. url = '/crawler/zhong_qing_kan_dian/detail'
  76. body = json.dumps({
  77. "content_link": content_link
  78. })
  79. resp = self.send_request(url, body)
  80. if resp and resp.get("code") == 0:
  81. self.detail_request_count += 1
  82. Local.logger("zhongqingkandian", "recommend").info(f"请求详情的总次数: {self.detail_request_count}")
  83. data = resp["data"]["data"]
  84. if data["content_type"] == "video":
  85. video_id = data['channel_content_id']
  86. video_title = data["title"]
  87. video_cover = data["image_url_list"][0]['image_url']
  88. video_url = data["video_url_list"][0]['video_url']
  89. video_duration = data["video_url_list"][0]['video_duration']
  90. account_id = data["channel_account_id"]
  91. account_name = data["channel_account_name"]
  92. account_avatar = data["avatar"]
  93. values = [
  94. [
  95. video_title,
  96. video_url,
  97. video_duration,
  98. video_cover,
  99. video_id,
  100. content_link,
  101. account_name,
  102. account_id,
  103. account_avatar,
  104. label,
  105. ]
  106. ]
  107. FeishuUtils.insert_columns("BvScsJKDWhuj1ctUX1mcBzq1nYb", "a338b3", "ROWS", 1, 2)
  108. time.sleep(0.5)
  109. FeishuUtils.update_values("BvScsJKDWhuj1ctUX1mcBzq1nYb", "a338b3", "A2:Z2", values)
  110. else:
  111. Local.logger("zhongqingkandian", "recommend").info(f"不是视频")
  112. else:
  113. Local.logger("zhongqingkandian", "recommend").info(f"请求详情失败,返回异常: {resp}")
  114. return None
  115. def control_request(self):
  116. recommend_list = self.req_recommend_list()
  117. if recommend_list:
  118. for video_obj in recommend_list:
  119. content_link = video_obj.get("share_url")
  120. content_id = video_obj.get("id")
  121. if content_link and content_id:
  122. time.sleep(2)
  123. detail = self.req_detail(content_link, "推荐")
  124. if detail:
  125. print(detail)
  126. time.sleep(10)
  127. content_recommend_list = self.req_content_recommend_list(content_id)
  128. if content_recommend_list:
  129. for content_obj in content_recommend_list:
  130. content_link = content_obj.get("share_info", {}).get("share_url")
  131. if content_link:
  132. res = self.req_detail(content_link, "内容相关推荐")
  133. if res:
  134. print(res)
  135. def run(self):
  136. while True:
  137. self.control_request()
  138. if __name__ == '__main__':
  139. ZhongQingKanDian().run()
  140. # ZhongQingKanDian().req_detail('https://vol.youth.cn/1qWiCPOjl1CUewP5?signature=bDjmABzyXE32GNxlOY4pJVbdZfDqw9naZ9vnQ58wq06peMdkrP','ceshi')