这里的话接着我们我们上一篇selenium自动化工具的使用,这一次我们去抓取一下某手视频数据,当然只是用来学习,不能爬多了,只能学习上爬一点点,不能妨碍了这个视频网站的运行,遵守我们的网络安全法律!
有时候就在想可不可以去使用自动化工具去抓点视频来看看,于是就出了今天这节课程!
以我们这个某视频网站为例子吧:精彩推荐-快手
这里一些基本知识就不介绍了,直接进入正题!
首先就是
导包: from selenium import webdriver driver= webdriver.Chrome(executable_path=接上我们安装的驱动的路径) driver.get('https://www.kuaishou.com/new-reco')
这样浏览器就可以去抓取我们的视频网站,接下来就到视频页面的具体操作了!
这里我的思想是直接抓取推荐页面的视频数据,我发现当前视频的url都在这个<video>标签的src属性中,于是我们就可以去抓取当前视频的url数据,拿到之后再利用我们的lxml库去抓取视频链接,再用request库去下载我们的视频。
但是后面想了一下我不能只抓一个视频,于是再去找找这些视频的url有什么规律,后面我发现了,就是当前页面我们搜索<video>标签可以得到3个,3个当中都有一个视频url,且都对应着我们这个视频。当我用ActionChains动作链去点击我们键盘下键,实现翻页时,又会得到一个新的3个<video>标签,且3个url都指向着翻页那个页面的视频。到这里大家估计都知道我要做啥了-----》
就是直接定义一个for循环,每隔几秒就翻页,这不就可以得到我们的视频url吗,然后再去request抓取视频!
这里的话就不一一展示了,就直接附上源码!【代码还算简洁,没有搞一些其它的东西,像什么异步,多线程,就是一个一个慢慢爬!】
import time import requests from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains from lxml import etree option = webdriver.ChromeOptions() # V76以及以上版本 option.add_experimental_option('useAutomationExtension', False) option.add_experimental_option('excludeSwitches', ['enable-automation']) # 不自动关闭浏览器 option.add_experimental_option("detach", True) driver= webdriver.Chrome(chrome_options=option,executable_path='C:\\Users\\user\\Desktop\\chromedriver-win32\\chromedriver-win32\\chromedriver.exe') driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ }) driver.get('https://www.kuaishou.com/new-reco') time.sleep(5) # iframe=driver.find_element_by_xpath('/html/body/div[2]/iframe') # driver.switch_to.frame(iframe) # time.sleep(1) # driver.find_element_by_xpath('/html/body/div/div/div[1]/div/div[2]/div[2]').click() # time.sleep(2) url_lists=[] for i in range(30): time.sleep(2) ActionChains(driver).send_keys(Keys.DOWN).perform() # 不定位元素,直接按下键盘下键 time.sleep(3) video_list = driver.find_elements_by_tag_name('video') for video in video_list: if video.get_attribute('src'): if "blob" not in video.get_attribute('src'): if "https://www.kuaishou.com/new-reco" not in video.get_attribute('src'): print(video.get_attribute('src')) url_lists.append(video.get_attribute('src')) time.sleep(2) print(url_lists) def crawl(url_lists): num=0 for url in url_lists: response=requests.get(url).content with open(f"./第{num}个视频.mp4",'wb')as f: f.write(response) print(f"第{num}视频抓取完毕!") num=num+1 crawl(url_lists)
这里再简单介绍一下其中的一些内容含义吧,我这里没写注释啥的!
option = webdriver.ChromeOptions() # V76以及以上版本 option.add_experimental_option('useAutomationExtension', False) option.add_experimental_option('excludeSwitches', ['enable-automation']) # 不自动关闭浏览器 option.add_experimental_option("detach", True)
这一部分的话就是单纯的在网上看到说自动化的浏览器上会显示一行【类似于正在使用自动化工具】,大概意思就是说网站知道你是自动化工具来请求,于是我们用这个浏览器就不会有那些字【其实有点自欺欺人,网站可以通过浏览器指纹等来检测你是不是自动化工具】
其中最常见的就是
网站会通过window.navigator.webdriver来检测。正常情况下可能就是和我上面一样没使用自动化工具时是一个未定义,但是当我们使用那个selenium时,值就变成了True。因此有想使用js中的HOOK函数来改写它的值,driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ })
但是就像我说的,它可以检测很多东西通过浏览器指纹,所以一时半会你根本不知道它到底检测的是哪个值!
接下来就是正文部分
url_lists=[]
for i in range(30):
time.sleep(2)
ActionChains(driver).send_keys(Keys.DOWN).perform() # 不定位元素,直接按下键盘下键
time.sleep(3)
video_list = driver.find_elements_by_tag_name('video')
for video in video_list:
if video.get_attribute('src'):
if "blob" not in video.get_attribute('src'):
if "https://www.kuaishou.com/new-reco" not in video.get_attribute('src'):
print(video.get_attribute('src'))
url_lists.append(video.get_attribute('src'))
time.sleep(2)
print(url_lists)
def crawl(url_lists):
num=0
for url in url_lists:
response=requests.get(url).content
with open(f"./第{num}个视频.mp4",'wb')as f:
f.write(response)
print(f"第{num}视频抓取完毕!")
num=num+1
crawl(url_lists)
这里的大概代码就是定义一个for循环,每隔2秒就按下键盘下键,让播放下一个视频,在等个3秒就去网页上定位我们的video元素,遍历三个video元素,找到它们的src属性,这里有一个窍门就是发现blob形式的url是一个二进制流文件,我们不要,然后以https://www.kuaishou.com/new-reco开头的url我们不要,就可以在3个url中筛选出第二个url【这里为什么不三个视频都下载呢,就是因为是一样的视频】。然后下面就将我们的视频url添加到我们的url_列表中后面传入我们下载器去下载!
好了,今天视频抓取案例就到这里!【lzp】