抖音、快手视频抓取
一、抖音视频获取
浏览器打开抖音浏览器,https://www.douyin.com/,打开一般直接让登录,点击x关闭即可。
搜索里输入想要抓取视频的号体,比如,航空工业,我们要抓取视频的号体:
选择用户,再点击进入号体,视频部分就是我们需要抓取的内容:
我们来分析这部分视频的构造:
只要遍历div里的这些内容即可,视频地址,视频封面图,视频标题都有,自动化操作到此即可都获取到,临时使用的代码,没有格式化封装,将就看就行:
try: # 点击关闭登录弹窗 WebDriverWait(driver, 10, 0.2).until(EC.presence_of_element_located((By.CLASS_NAME, "dy-account-close"))).click() except Exception as e: print(e) # 输入号体名称 WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@data-e2e='searchbar-input']"))).send_keys(account) # 点击搜索 WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@data-e2e='searchbar-button']"))).click() # 切换浏窗口 windows = driver.window_handles driver.switch_to.window(windows[-1]) # 点击用户 WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//span[@data-key='user']"))).click() # 进入号体 WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//span[text()='%s']" % account))).click() # 切换窗口 windows = driver.window_handles driver.switch_to.window(windows[-1]) # 向下滑动,获取更多视频 for i in range(2): js = "document.documentElement.scrollTop={0}".format(scroll) driver.execute_script(js) scroll += 700 time.sleep(1) # 找到视频地址 vi = driver.find_elements(By.XPATH, "//*[contains(@href,'/video/')]") # 找到封面图 cover = driver.find_elements(By.XPATH, "//*[contains(@href,'/video/')]//div//div//img")
获取到的视频类似这样的:https://www.douyin.com/video/7209924261669014839
直接访问这个视频还是下载不到的,怎么搞呢?
直接访问这个地址即可,然后我们看请求接口里有“https://v26-web.douyinvod.com/'”这个地址:
直接访问这个地址:
你会发现这个地址就是视频的原地址,视频时长我们也可以获取到,是不是很easy!
# 访问视频地址 re_url, video_time = gv.get_video_douyin(i[1]) for ul in re_url.requests: try: # 获取原视频 if 'https://v26-web.douyinvod.com/' in ul.url: # 视频转存七牛 qiniu_video = qn_url.url_to_qiniu(ul.url, 'mp4') qiniu_cover = qn_url.url_to_qiniu(v_cover, 'jpg')
获取原视频地址后,转存七牛即可,原视频地址是带有时间搓过期验证的,获取到后第一时间下载或者转存。
到此,抖音视频就over,但通过自动化方式频繁访问,抖音会弹出滑块验证码啥的,还有ip判断,可以通过代理iP池搞定。
当然,一个号体一天刷一两次就可以了,所以,至少目前为止,不用ip也行,如果嫌每次登录弹窗的话,可以扫码登录,自动化时候读取浏览器缓存加载即可:
# 加载浏览器缓存 options.add_argument(profile_directory)
二、快手视频获取
抖音快手都属于字节,一看快手前端,和抖音都类似,但快手简单的难以置信:
同样的自动化进入用户视频页面后,“https://www.kuaishou.com/graphql”,这个地址把视频都返回了,并且没有js加密,抖音也有接口返回视频地址,但都js加密的。既然没有加密,
那直接解析获取视频即可:
def get_kuai_shou_video(url, account): """ :param account: :param url: :return: """ # seleniumwire:浏览器请求分析插件 # 浏览器缓存文件地址(谷歌浏览器) profile_directory = r'--user-data-dir=%s' % config.get('****', 'chromedriver_user_data') + 'User Data' # *******配置自动化参数*********# options = webdriver.ChromeOptions() # 加载浏览器缓存 options.add_argument(profile_directory) # options.add_argument("headless") # 避免代理跳转错误 options.add_argument('--ignore-certificate-errors-spki-list') options.add_argument('--ignore-ssl-errors') options.add_experimental_option('excludeSwitches', ['enable-automation']) options.add_experimental_option('useAutomationExtension', False) options.add_argument("--disable-popup-blocking") # 不打开浏览器运行 # options.add_argument("headless") # *******配置自动化参数*********# driver = webdriver.Chrome(executable_path=driver_path, options=options) # 最大化浏览器 driver.maximize_window() dou_yin_url = url driver.get(dou_yin_url) video_li = [] video_l = [] time.sleep(5) scroll = 0 WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@class='search-input']"))).send_keys(account) WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@class='search-button']"))).click() WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@class='tab-title title-user']"))).click() WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//span[text()='%s']" % account))).click() windows = driver.window_handles driver.switch_to.window(windows[-1]) for i in range(3): js = "document.documentElement.scrollTop={0}".format(scroll) driver.execute_script(js) scroll += 700 time.sleep(1) for i in driver.requests: # 找到有视频的接口 if "https://www.kuaishou.com/graphql" in i.url: try: # 解析数据 buff = BytesIO(i.response.body) f = gzip.GzipFile(fileobj=buff) htmls = f.read().decode('utf-8') html_dic = json.loads(htmls) try: # 解析视频数据 vf = html_dic['data']['visionProfilePhotoList']['feeds'] for f in vf: video_li.append(f) except Exception as e: print(e)except Exception as e: print(e) driver.quit() if video_li: for v in video_li: try: # 视频地址 original_url = v['photo']['photoUrl'] # 视频封面地址 original_cover = v['photo']['coverUrl'] qiniu_video = qn_url.url_to_qiniu(original_url, 'mp4') qiniu_cover = qn_url.url_to_qiniu(original_cover, 'jpg') # 组装视频信息 video_dic = { 'video_title': v['photo']['caption'], 'video_duration': v['photo']['duration'], 'video_path': qiniu_video, 'video_cover': qiniu_cover, 'original_url': original_url, 'original_cover': original_cover, 'video_time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(v['photo']['timestamp'] / 1000)) } video_l.append(video_dic) except Exception as e: print(e)else: print("获取视频异常") return video_l
然后转存视频即可,非常简单!
以上是抖音和快手的视频抓取。
仅供学习使用,勿作恶!!!
本文来自博客园,作者:drewgg,转载请注明原文链接:https://www.cnblogs.com/drewgg/p/17214444.html