整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Python爬蟲教程:采集快手用戶所有公開作品,包括圖集和視頻!

          在前面

          • 代碼功能如題:根據快手用戶的id來爬取用戶所有公開作品,包括圖集和視頻。
          • 原理:其實就是利用基于chromium內核的瀏覽器自帶的devtools對所有請求進行排查找出包含作品鏈接的請求,然后用代碼模擬請求去獲得數據,再根據url下載作品保存就行了,包括一些網站的自動注冊登錄、操作都可以模擬。這個其實應該算是寫過爬蟲的同學們都知道。

          核心代碼

          • 廢話不多說,上核心代碼
          def __crawl_user(self, uid):
          if uid.isdigit():
              uid = self.__switch_id(uid)
          
          payload = {"operationName": "privateFeedsQuery",
                     "variables": {"principalId": uid, "pcursor": "", "count": 999},
                     "query": "query privateFeedsQuery($principalId: String, $pcursor: String, $count: Int) {\n  privateFeeds(principalId: $principalId, pcursor: $pcursor, count: $count) {\n    pcursor\n    list {\n      id\n      thumbnailUrl\n      poster\n      workType\n      type\n      useVideoPlayer\n      imgUrls\n      imgSizes\n      magicFace\n      musicName\n      caption\n      location\n      liked\n      onlyFollowerCanComment\n      relativeHeight\n      timestamp\n      width\n      height\n      counts {\n        displayView\n        displayLike\n        displayComment\n        __typename\n      }\n      user {\n        id\n        eid\n        name\n        avatar\n        __typename\n      }\n      expTag\n      __typename\n    }\n    __typename\n  }\n}\n"}
          res = requests.post(self.__data_url, headers=self.__headers, json=payload)
          
          works = json.loads(res.content.decode(encoding='utf-8', errors='strict'))['data']['privateFeeds']['list']
          
          if not os.path.exists("../data"):
              os.makedirs("../data")
          
          # 這兩行代碼將response寫入json供分析
          # with open("data/" + uid + ".json", "w") as fp:
          #     fp.write(json.dumps(works, indent=2))
          
          # 防止該用戶在直播,第一個作品默認為直播,導致獲取信息為NoneType
          if works[0]['id'] is None:
              works.pop(0)
          name = re.sub(r'[\\/:*?"<>|\r\n]+', "", works[0]['user']['name'])
          
          dir = "data/" + name + "(" + uid + ")/"
          # print(len(works))
          if not os.path.exists(dir):
              os.makedirs(dir)
          
          # if not os.path.exists(dir + ".list"):
          #     print("")
          
          print("開始爬取用戶 " + name + ",保存在目錄 " + dir)
          print(" 共有" + str(len(works)) + "個作品")
          
          for j in range(len(works)):
              self.__crawl_work(uid, dir, works[j], j + 1)
              time.sleep(1)
          
          print("用戶 " + name + "爬取完成!")
          print()
          time.sleep(1)

          快手分為五種類型的作品,在作品里面表現為workType屬性

          • 其中兩種圖集: vertical和multiple,意味著拼接長圖和多圖,所有圖片的鏈接在imgUrls里
          • 一種單張圖片: single 圖片鏈接也在imgUrls里
          • K歌: ksong 圖片鏈接一樣,不考慮爬取音頻...
          • 視頻: video 需要解析html獲得視頻鏈接



          def __crawl_work(self, uid, dir, work, wdx):
              w_type = work['workType']
              w_caption = re.sub(r"\s+", " ", work['caption'])
              w_name = re.sub(r'[\/:*?"<>|\r\n]+', "", w_caption)[0:24]
              w_time = time.strftime('%Y-%m-%d', time.localtime(work['timestamp'] / 1000))
          
          if w_type == 'vertical' or w_type == 'multiple' or w_type == "single" or w_type == 'ksong':
              w_urls = work['imgUrls']
              l = len(w_urls)
              print("  " + str(wdx) + ")圖集作品:" + w_caption + "," + "共有" + str(l) + "張圖片")
              for i in range(l):
                  p_name = w_time + "_" + w_name + "_" + str(i + 1) + ".jpg"
                  pic = dir + p_name
                  if not os.path.exists(pic):
                      r = requests.get(w_urls[i])
                      r.raise_for_status()
                      with open(pic, "wb") as f:
                          f.write(r.content)
                      print("    " + str(i + 1) + "/" + str(l) + " 圖片 " + p_name + " 下載成功 √")
                  else:
                      print("    " + str(i + 1) + "/" + str(l) + " 圖片 " + p_name + " 已存在 √")
          elif w_type == 'video':
              w_url = self.__work_url + work['id']
              res = requests.get(w_url, headers=self.__headers_mobile,
                                 params={"fid": 1841409882, "cc": "share_copylink", "shareId": "143108986354"})
              html = res.text
              waitreplace = work['id'] + '".*?"srcNoMark":"(.*?)"'
          
              v_url = re.findall(waitreplace, html)
              # pattern = re.compile(r"playUrl", re.MULTILINE | re.DOTALL)
              # script = soup.find("script", text=pattern)
              # s = pattern.search(script.text).string
              # v_url = s.split('playUrl":"')[1].split('.mp4')[0].encode('utf-8').decode('unicode-escape') + '.mp4'
              try:
                  print("  " + str(wdx) + ")視頻作品:" + w_caption)
              except:
                  print("  這里似乎有點小錯誤,已跳過")
              v_name = w_time + "_" + w_name + ".mp4"
              video = dir + v_name
          
              if v_url:
                  if not os.path.exists(video):
                      r = requests.get(v_url[0])
                      r.raise_for_status()
          
                      with open(video, "wb") as f:
                          f.write(r.content)
                      print("    視頻 " + v_name + " 下載成功 √")
                  else:
                      print("    視頻 " + v_name + " 已存在 √")
              else:
                  print("未找到視頻")
          else:
              print("錯誤的類型")
        1. payload就是post參數,這個是在devtools的request請求底下可以找到的
        2. 其實就是解析json,然后里面有圖片的url和視頻的id,我注釋掉的兩行代碼可以保存完整的json的,你可以去掉注釋然后看分析保存的json
        3. 剩下的看源碼吧,不難理解的


        4. 注意事項:

          • 不考慮提供列表可選的批量下載功能
          • 有需要的合理功能可以issue反饋,看到后會考慮是否修改
          • 如果需要自定義自己的需求,可以拿走代碼自行修改,喜歡的話給個star給個follow
          • 本代碼僅供學習使用,不可違反法律爬取視頻,以及私自盜用搬運視頻,后果自負

          項目源碼地址 https://github.com/oGsLP/kuaishou-crawler

          網頁中常見的多媒體文件包括音頻文件和視頻文件,對于在線音頻和視頻,我們往往都是使用embed標簽來插入。embed語法:

          1 <embed src="”視頻地址”" type="”audio/x-pn-realaudio-plugin”"

          2 console="”Clip1〃" controls="”ControlPanel,StatusBar”" height="”330〃"

          3 width="”450〃" autostart="”true”" title="undefined">

          <embed src="要播放的文件網址" ;="" autostart="true" loop="true" width="400"

          height="350">

          html中網頁中如何插入音頻和視頻?


          舉例1:插入音頻文件

          1 <title>插入音頻文件</title>

          2

          3

          4 <embed src="media/西班牙舞曲.mp3" width="400px" height="80px">

          在瀏覽器預覽效果如下:

          說明:

          我們可以看到,使用embed標簽插入音頻文件還會有一個播放界面,界面上有幾個簡單的功能按鈕。

          舉例2:插入視頻文件

          1 <title>插入音頻文件</title>

          2

          3

          4 <embed src="media/小蘋果.wmv" width="400px" height="80px">

          在瀏覽器預覽效果如下:

          注意:

          由于音頻和視頻文件比較大,所以在這里我們就不提供大家在線測試的功能。不過大家可以在自己計算機上面測試一下代碼。

          使用embed標簽插入視頻,在瀏覽器我們也可以看到,瀏覽器提供了一個簡單的操作界面。embed標簽支持的視頻格式很多,大部分主流格式都支持。

          embed標簽能支持大部分格式的視頻文件,反正主流的如.mp4、.avi、.rmvb等都支持。如果你使用embed標簽不能播放視頻,那就可能是你視頻格式有問題或者編碼有問題。你可以用格式工廠轉換一下格式。

          以上就是html中網頁中如何插入音頻和視頻?

          . WebRTC 采集api

          在WebRTC中有一個api 可以用來獲取桌面:getDisplayMedia

          var promise = navigator.mediaDevices.getDisplayMedia(constraints);

          constraints可選 constraints中約束與getUserMedia函數中的一致。

          2. 采集平面數據

          采集平面數據:這個功能在chrome中是實驗性的項目,所以只有對最新的項目開放。

          在實戰之前我們要打開瀏覽器,做一下設置 chrome://flags/#enable-experimental-web-platform-features

          如下圖所示:

          接下來我們看看具體的js代碼如下:

          C++音視頻開發學習資料點擊領取→音視頻開發(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)


          主站蜘蛛池模板: 性色av一区二区三区夜夜嗨| 国产一区二区三区精品久久呦| 69久久精品无码一区二区| 国产suv精品一区二区6| 亚洲视频一区二区三区四区| 中文字幕一区二区三区有限公司| 日本一区二区三区在线看| 99精品国产一区二区三区2021 | 老熟妇高潮一区二区三区| 亚洲AV本道一区二区三区四区| 区三区激情福利综合中文字幕在线一区 | 又硬又粗又大一区二区三区视频| 免费一区二区无码视频在线播放| 亚洲欧美日韩中文字幕一区二区三区 | 国产99视频精品一区| 日韩高清国产一区在线| 国产美女精品一区二区三区| 免费无码一区二区三区蜜桃| 成人免费一区二区三区| 国产午夜三级一区二区三| 国产91一区二区在线播放不卡| 亚洲成a人一区二区三区| 狠狠做深爱婷婷综合一区| 成人区精品一区二区不卡| 精品国产免费一区二区三区香蕉| 国产亚洲一区二区精品| 亚洲国产精品第一区二区| 色噜噜狠狠一区二区| 久久久国产精品无码一区二区三区| 国产激情一区二区三区小说| 国产人妖在线观看一区二区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲成在人天堂一区二区| 亚洲一区二区三区免费在线观看| 亚洲av成人一区二区三区观看在线 | 无码精品人妻一区二区三区人妻斩| 无码人妻久久一区二区三区免费 | 国产成人无码精品一区二区三区 | 97久久精品无码一区二区天美| 性色av无码免费一区二区三区| 亚洲一区日韩高清中文字幕亚洲|