hksp_author.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import os
  2. import re
  3. import base64
  4. import json
  5. import random
  6. import sys
  7. import datetime
  8. import time
  9. import uuid
  10. import requests
  11. sys.path.append(os.getcwd())
  12. from common.video_item import VideoItem
  13. from common import PiaoQuanPipeline, AliyunLogger
  14. from common.mq import MQ
  15. class HaoKanVideoAccount(object):
  16. def __init__(self, platform, mode, rule_dict, user_dict, env):
  17. self.account_id = user_dict["link"]
  18. self.platform = platform
  19. self.mode = mode
  20. self.rule_dict = rule_dict
  21. self.user_dict = user_dict
  22. self.env = env
  23. self.download_cnt = 0
  24. self.mq = MQ(topic_name="topic_crawler_etl_" + self.env)
  25. self.url_key = "guanghui456"
  26. def decrypt(self, ori_str):
  27. # base64解码
  28. base64_bytes = base64.b64decode(ori_str)
  29. crypt_str = base64_bytes.decode("utf-8")
  30. # 异或解密
  31. n = ""
  32. for i in range(len(crypt_str)):
  33. o = ord(crypt_str[i])
  34. s = ord(self.url_key[i % len(self.url_key)])
  35. n += chr(o ^ s)
  36. return n
  37. def get_video_list(self):
  38. page_limit = 10
  39. url = "https://haokan.baidu.com/web/author/listall"
  40. params = {
  41. "app_id": self.account_id, # 账号id
  42. "ctime": "", # 翻页指示,用时间戳表示,为空表示从头开始
  43. "rn": page_limit, # 每一页的页数,默认是 10
  44. "_api": 1,
  45. }
  46. headers = {
  47. "Accept": "*/*",
  48. "Accept-Language": "en,zh-CN;q=0.9,zh;q=0.8",
  49. "Cache-Control": "no-cache",
  50. "Connection": "keep-alive",
  51. "Content-Type": "application/x-www-form-urlencoded",
  52. "Cookie": 'BIDUPSID=504D4A3A8D0584CA8C3BE27ACFED5323; PSTM=1695297510; BAIDUID=504D4A3A8D0584CA7398158209FA507F:FG=1; BAIDUID_BFESS=504D4A3A8D0584CA7398158209FA507F:FG=1; H_WISE_SIDS=213352_214793_110085_244721_236312_265883_265985_269905_271172_270102_234295_234207_272282_263618_272473_260335_273141_273244_273397_273481_275098_275007_275853_276196_275170_271562_253022_275870_277354_251972_277631_277642_277635_277611_275732_276665_275209_277554_259642_278057_278166_278163_278300_274784_275167_278263_272560_278573_278575_277542_278790_278388_256739_278920_279021_279045_278237_279267_276573_279367_279385_278392_274947_276269_278946_279086_279610_279605_279680_276983_279877_279307_279695_279945_279703_279975_279998_278249_278213_280132_280209_277699_280161_280227_274286_280405_280368_278674_280485_280541_270366_278414_276929_275856_280614_256223_280488_280636_276438_280560_277759_279896_280768_280809_279850_280771_280107_280583; H_WISE_SIDS_BFESS=213352_214793_110085_244721_236312_265883_265985_269905_271172_270102_234295_234207_272282_263618_272473_260335_273141_273244_273397_273481_275098_275007_275853_276196_275170_271562_253022_275870_277354_251972_277631_277642_277635_277611_275732_276665_275209_277554_259642_278057_278166_278163_278300_274784_275167_278263_272560_278573_278575_277542_278790_278388_256739_278920_279021_279045_278237_279267_276573_279367_279385_278392_274947_276269_278946_279086_279610_279605_279680_276983_279877_279307_279695_279945_279703_279975_279998_278249_278213_280132_280209_277699_280161_280227_274286_280405_280368_278674_280485_280541_270366_278414_276929_275856_280614_256223_280488_280636_276438_280560_277759_279896_280768_280809_279850_280771_280107_280583; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218b98064c148fe-08a95b8d70a5fe-17525634-1901520-18b98064c151479%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218b98064c148fe-08a95b8d70a5fe-17525634-1901520-18b98064c151479%22%7D; H_PS_PSSID=39624_39663_39684_39690_39676_39678_39713; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; hkpcSearch=%u674E%u6709%u8D22; BA_HECTOR=0h240k018l2ka0a000a00g0g1il6sn21q; ZFY=PnfJdvQrpMNOIoZw1LsOKMDW8:BWcrmDvtL60fANYxmQ:C; Hm_lvt_4aadd610dfd2f5972f1efee2653a2bc5=1699950106,1700038092; PC_TAB_LOG=video_details_page; COMMON_LID=c414c76cb1b11dfb04b7062a5ae09ce2; ab_sr=1.0.1_ZGEwNWY3OTFhZmNhNzZiN2YyZjljYjI3ZmE2YzRiZDA5NjY3YTI0OTdiMWM0ZWZhMjU3YWMzMThmZjU5YzQ5MDM0NDA4N2FmZWM5M2I0ZmQzZmE0ZWI2MjJkMjE0MDQ1ZTIyYmU5OGQ3OWY3ZDNlYTI2NmFiMGZlYTliODFmZmJiY2U0MDRmMzkwZWMzOTQxMTc0MDU3NmQ2ZWVlNjM3ZA==; reptileData=%7B%22data%22%3A%22636c55e0319da5169a60acec4a264a35c10862f8abfe2f2cc32c55eb6b0ab4de0efdfa115ea522d6d4d361dea07feae27710e59370b70671d347daddec662182e4c514cbcba8dae1736cf735f29e19b9a42be523d0836d04fa3b15dd57de52f4%22%2C%22key_id%22%3A%2230%22%2C%22sign%22%3A%22551bc5f4%22%7D; Hm_lpvt_4aadd610dfd2f5972f1efee2653a2bc5=1700038278; RT="z=1&dm=baidu.com&si=bd56d547-8a2c-433d-9eee-70f64ccf646a&ss=lozishrc&sl=9&tt=c2s&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=6z26"',
  53. "Referer": "https://haokan.baidu.com/author/1774716548084013",
  54. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
  55. }
  56. response = requests.request("GET", url, headers=headers, params=params)
  57. result = response.json()
  58. print(json.dumps(result, ensure_ascii=False, indent=4))
  59. def get_tiny_video_list(self):
  60. url = "https://haokan.baidu.com/web/author/listall"
  61. params = {
  62. "app_id": self.account_id,
  63. "ctime": "",
  64. "video_type": "haokan|tabhubVideo",
  65. "rn": 20,
  66. }
  67. headers = {
  68. "Accept": "*/*",
  69. "Accept-Language": "en,zh-CN;q=0.9,zh;q=0.8",
  70. "Cache-Control": "no-cache",
  71. "Connection": "keep-alive",
  72. "Content-Type": "application/x-www-form-urlencoded",
  73. "Cookie": 'BIDUPSID=504D4A3A8D0584CA8C3BE27ACFED5323; PSTM=1695297510; BAIDUID=504D4A3A8D0584CA7398158209FA507F:FG=1; BAIDUID_BFESS=504D4A3A8D0584CA7398158209FA507F:FG=1; H_WISE_SIDS=213352_214793_110085_244721_236312_265883_265985_269905_271172_270102_234295_234207_272282_263618_272473_260335_273141_273244_273397_273481_275098_275007_275853_276196_275170_271562_253022_275870_277354_251972_277631_277642_277635_277611_275732_276665_275209_277554_259642_278057_278166_278163_278300_274784_275167_278263_272560_278573_278575_277542_278790_278388_256739_278920_279021_279045_278237_279267_276573_279367_279385_278392_274947_276269_278946_279086_279610_279605_279680_276983_279877_279307_279695_279945_279703_279975_279998_278249_278213_280132_280209_277699_280161_280227_274286_280405_280368_278674_280485_280541_270366_278414_276929_275856_280614_256223_280488_280636_276438_280560_277759_279896_280768_280809_279850_280771_280107_280583; H_WISE_SIDS_BFESS=213352_214793_110085_244721_236312_265883_265985_269905_271172_270102_234295_234207_272282_263618_272473_260335_273141_273244_273397_273481_275098_275007_275853_276196_275170_271562_253022_275870_277354_251972_277631_277642_277635_277611_275732_276665_275209_277554_259642_278057_278166_278163_278300_274784_275167_278263_272560_278573_278575_277542_278790_278388_256739_278920_279021_279045_278237_279267_276573_279367_279385_278392_274947_276269_278946_279086_279610_279605_279680_276983_279877_279307_279695_279945_279703_279975_279998_278249_278213_280132_280209_277699_280161_280227_274286_280405_280368_278674_280485_280541_270366_278414_276929_275856_280614_256223_280488_280636_276438_280560_277759_279896_280768_280809_279850_280771_280107_280583; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218b98064c148fe-08a95b8d70a5fe-17525634-1901520-18b98064c151479%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218b98064c148fe-08a95b8d70a5fe-17525634-1901520-18b98064c151479%22%7D; H_PS_PSSID=39624_39663_39684_39690_39676_39678_39713; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; hkpcSearch=%u674E%u6709%u8D22; BA_HECTOR=0h240k018l2ka0a000a00g0g1il6sn21q; ZFY=PnfJdvQrpMNOIoZw1LsOKMDW8:BWcrmDvtL60fANYxmQ:C; Hm_lvt_4aadd610dfd2f5972f1efee2653a2bc5=1699950106,1700038092; PC_TAB_LOG=video_details_page; COMMON_LID=c414c76cb1b11dfb04b7062a5ae09ce2; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; ab_sr=1.0.1_ODM2M2M4NzY2MWE3Yjg0MGQ4NDk2YTQ4ZTRlMWVlYjdiY2JmMzQ5ZjU1MjAxODUxZTQ0NTg4YjJjNzNmYTU2MzZiMjI2Y2EwZTU2OGIwYjdmMDc3NmRhMGJjODZkZmIyN2U0YWFjMjUzZWEwNTRlZWQ1N2U0MzkxY2YwMzk4Zjk1N2NiYWM1OGZlN2M0NWU4ZWJiZjFmNWE5YWU3YjFmMA==; reptileData=%7B%22data%22%3A%22636c55e0319da5169a60acec4a264a35c10862f8abfe2f2cc32c55eb6b0ab4de0efdfa115ea522d6d4d361dea07feae27710e59370b70671d347daddec6621825f6963cc8f86c5fee1d0664c82edf0ae5c838cf8bde5188e6a7757f1998a7c48%22%2C%22key_id%22%3A%2230%22%2C%22sign%22%3A%22f302bd06%22%7D; Hm_lpvt_4aadd610dfd2f5972f1efee2653a2bc5=1700046227; RT="z=1&dm=baidu.com&si=bd56d547-8a2c-433d-9eee-70f64ccf646a&ss=loznmnju&sl=1&tt=1w3&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=2oq"',
  74. "Referer": "https://haokan.baidu.com/author/1702511677416581",
  75. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
  76. }
  77. response = requests.request("GET", url, headers=headers, params=params)
  78. result = response.json()
  79. print(json.dumps(result, ensure_ascii=False, indent=4))
  80. self.process_video_list(result)
  81. def process_video_list(self, result):
  82. if result["errmsg"] == "成功":
  83. video_list = result["data"]["results"]
  84. for index, video_obj in enumerate(video_list):
  85. # self.get_video_info(video_obj)
  86. try:
  87. AliyunLogger.logging(
  88. code="1001",
  89. platform=self.platform,
  90. mode=self.mode,
  91. env=self.env,
  92. message="扫描到一条视频",
  93. data=video_obj,
  94. )
  95. self.get_video_info(video_obj)
  96. except Exception as e:
  97. AliyunLogger.logging(
  98. code="3000",
  99. platform=self.platform,
  100. mode=self.mode,
  101. env=self.env,
  102. message="抓取单条视频异常,报错是:{}".format(e),
  103. )
  104. else:
  105. AliyunLogger.logging(
  106. code="3000",
  107. platform=self.platform,
  108. mode=self.mode,
  109. env=self.env,
  110. message="请求视频链接列表失败,需要 review 代码验证",
  111. )
  112. def get_video_info(self, video_obj):
  113. url = "https://haokan.baidu.com/v?vid={}&collection_id=".format(
  114. video_obj["content"]["vid"]
  115. )
  116. header = {
  117. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
  118. }
  119. response_text = requests.get(url, headers=header).text
  120. encrypted_data = json.loads(
  121. re.search(r"window\.__PRELOADED_STATE__\s*=\s*(.*?);", response_text)
  122. .group(1)
  123. .strip()
  124. )
  125. encrypted_video_obj = encrypted_data["encrptedVideoMeta"]
  126. d_obj = json.loads(self.decrypt(encrypted_video_obj))
  127. AliyunLogger.logging(
  128. code="1001",
  129. platform=self.platform,
  130. mode=self.mode,
  131. env=self.env,
  132. data=d_obj,
  133. message="扫描到一条视频",
  134. )
  135. trace_id = self.platform + str(uuid.uuid1())
  136. item = VideoItem()
  137. item.add_video_info("video_id", d_obj["id"])
  138. item.add_video_info("video_title", d_obj["title"])
  139. item.add_video_info("playcnt", d_obj["playcnt"])
  140. item.add_video_info("publish_time_stamp", d_obj["publish_time"])
  141. item.add_video_info("duration", d_obj["duration"])
  142. item.add_video_info("video_url", d_obj["playurl"])
  143. item.add_video_info("like_cnt", d_obj["like"])
  144. item.add_video_info("comment_cnt", d_obj["comment"])
  145. item.add_video_info("cover_url", video_obj["content"]["cover_src"])
  146. item.add_video_info("user_id", self.user_dict['link'])
  147. item.add_video_info("user_name", "123")
  148. item.add_video_info("out_video_id", d_obj["id"])
  149. item.add_video_info("platform", self.platform)
  150. item.add_video_info("strategy", self.mode)
  151. item.add_video_info("session", "{}-{}".format(self.platform, int(time.time())))
  152. # 准备发往 MQ 的消息
  153. mq_obj = item.produce_item()
  154. print(item.item)
  155. # 筛选规则的 pipeline
  156. pipeline = PiaoQuanPipeline(
  157. platform=self.platform,
  158. mode=self.mode,
  159. rule_dict=self.rule_dict,
  160. env=self.env,
  161. item=mq_obj,
  162. trace_id=trace_id,
  163. )
  164. print(mq_obj)
  165. if pipeline.process_item():
  166. self.mq.send_msg(mq_obj)
  167. print(mq_obj)
  168. AliyunLogger.logging(
  169. code="1002",
  170. platform=self.platform,
  171. mode=self.mode,
  172. env=self.env,
  173. message="成功发送至 ETL",
  174. data=mq_obj,
  175. trace_id=trace_id,
  176. )
  177. if __name__ == "__main__":
  178. T = HaoKanVideoAccount(
  179. platform="haokanshipin",
  180. mode="author",
  181. rule_dict={},
  182. user_dict={"link": 1657075178605219},
  183. env="prod",
  184. )
  185. T.get_tiny_video_list()