这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
一、项目简介:
本次项目团队开发过程中,发现一个问题,在系统刚开始上线使用时,未必有很多用户注册,去发布视频,如果没有很好的示例,用户也不会去发布自己的视频,那么就会造成系统无人使用,为了解决这个问题,和使用户更好的体验感,那么我们就会使用爬虫技术,定期自动的在数据库增加视频数据,这样就不会存在以上问题了。
二、涉及技术&知识点:
本次提出问题,最好的解决方案,就是通过后台主动的往数据库增加数据。那如何获取数据,那就涉及到了爬虫技术。什么是爬虫呢:
爬虫又被称为网页蜘蛛、网络机器人,有时也被称为网页追逐者,是一种按照一定的规则,自动地抓取互联网上网页中相应信息(文本、图片等)的程序或脚本,然后把抓取的信息存储到自己的计算机上。简单来说,爬虫就是抓取目标网站内容的工具,一般是根据定义的行为自动进行抓取,更智能的爬虫会自动分析目标网站结构,类似于搜索引擎的爬虫。
既然爬虫知道了,那本次获取视频数据主要使用的是爬虫中的selenium框架。
-
- selenium,作为浏览器端一个自动化测试工具,可以模拟用户操作浏览器的动作,就像是人自己操作浏览器一样。关于selenium的具体信息如下
-
- Selenium进行元素定位,主要有ID,Name,ClassName,Css Selector,Partial LinkText,LinkText,XPath,TagName等8种方式。
-
- Selenium获取单一元素(如:find_element)和获取元素数组(如:find_elements)两种方式。
-
- Selenium元素定位后,可以给元素进行赋值和取值,或者进行相应的事件操作(如:click)。
-
- requests,web请求对象,通过selenium获取到视频的url后,再通过requests库进行视频流的获取,然后保存成本地视频文件。
-
- 浏览器开发者工具,通过开发者工具可以查看页面上某一个按钮或链接等页面元素对应的html标识。
三、实践过程:
下面只展示部分核心代码
一.遍历目录
self.__driver.get(self.__url)
self.close_popup_window()
#4. 最大化窗口
self.__driver.maximize_window()
time.sleep(self.__wait_sec)
#打开以后,根据class=BHgRhxNh获取ul下的li
if self.checkIsExistsByClass(cls='BHgRhxNh'):
#获取
hots = self.__driver.find_elements(by=By.CLASS_NAME, value='BHgRhxNh')
hot_infos = []
index = 0
for hot in hots:
hot_info = {}
a = hot.find_element(by=By.TAG_NAME, value='a')
href = a.get_attribute("href")
text = a.text
hot_info['url'] = href
hot_info['text'] = text
if index > 0:
div = hot.find_element(by=By.CLASS_NAME, value='GsuT_hjh')
if div is not None:
hot_value = div.find_element(by=By.TAG_NAME, value='span').text
hot_info['value'] = hot_value
hot_infos.append(hot_info)
index = index + 1 print(hot_infos)
二.打开单个热点视频的url,并解析真实短视频播放url
def open_video_html(self, url):
"""打开具体视频的页面"""
self.__driver.get(url=url)
time.sleep(1)
self.close_popup_window() # 关闭弹窗
video = self.__driver.find_element(by=By.TAG_NAME, value='video')
source = video.find_element(by=By.TAG_NAME, value='source')
src = source.get_attribute('src')
return src
三.下载视频
def download_video(self, url, video_name):
"""根据视频源地址进行下载"""
if os.path.exists(video_name):
# 如果已重新下载过,则不需要再次下载
return
else:
with open(video_name, 'wb') as fp:
fp.write(requests.get(url).content)
四、总结思考:
项目中的问题,可能会遇见很多,只要有办法解决,就不是问题。