zhongqingkandian.py 6.4 KB

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