微風徐來,我情不自禁的摸了摸我油亮的頭頂,嘴裏哼着哥哥的風繼續吹,思考下今天這章要寫的內容,絞盡腦汁,爲數不多的頭髮又掉了幾根……從以前的英俊帥氣慢慢朝着土肥圓在進化,哎,生活拖累了我啊!
上篇我們只是說了下web框架的搭建,那今天我們就開始使用flask的render_template的模塊,實現加載模板頁面將抓取的信息通過網頁的形式來展示,下面我們直接上代碼講解,首先在上篇的video文件夾中創建一個__init__.py,你命名爲其它的也可以,只是路徑指向的時候要對應,在這個文件裏,我們就把爬取啊,處理業務邏輯的方法就寫到這個類裏面,方便以後的代碼維護及管理,代碼如下:
video/__init.py
#coding:utf-8
import requests,re
from pyquery import PyQuery as pq
class Video():
def __init__(self):
#定義請求超時的時間
self.timeout = 60
#獲取視頻信息
def get_video_info(self,weburl):
#請求網址
response = requests.get(url=weburl,timeout=self.timeout)
response.encoding = response.apparent_encoding
content = response.text
#用pyquery格式化內容
dochtml = pq(content)
#獲取視頻頁面中需要提取的信息
title=dochtml("#vod>h2>.title").text()
imgurl=dochtml(".lazy").attr("src")
users=dochtml(".infos > dd").eq(1).text()
detail=dochtml(".detail-desc-cnt > p").text()
#定義一個object,存放以上的數據,以json的形式傳遞
result = {}
result["title"] = title
result["imgurl"]=imgurl
result["users"] = users
result["detail"] = detail
#這個網站中這裏的標籤有很多類型,這裏我判斷了2種,意思是swyun沒有獲取到內容就查找zdyun
yunhtml=dochtml(".swyun").parent()(".play-list")
if len(yunhtml)==0:
yunlist=dochtml(".zdyun").parent()(".play-list>li").items()
else:
yunlist = yunhtml("li").items()
#定義劇集集合
episodes=[]
#這裏獲取到的yunlist是一個對象集
for p in yunlist:
name = p.text()
url = p('a').attr('href')
pjson={}
pjson["name"]=name
pjson["url"] = "{}{}".format(re.search('http[s]?://[-\w.]+', weburl).group(),url)
#將劇集的名稱及對應的地址插入到集合中
episodes.append(pjson)
result["episodes"]=episodes
#返回JSON結果集
return result
if __name__ == '__main__':
#調用方法調試一下
videourl = 'https://www.juji.tv/dianshiju/linghunweixiugong/'
v=Video()
result=v.get_video_info(videourl)
print(result)
這裏就是一個請求網頁並提取的過程,之前都講過這裏就不多說了,上面 有一點可以優化的就是if…else…,像上面在if中只有一個邏輯的我們可以簡化下:
yunlist=dochtml(".zdyun").parent()(".play-list>li").items() if len(yunhtml)==0 else yunhtml("li").items()
有點類似JS中的三目運算表達式,不懂?沒關係,請原諒我的自言自語……
這個video類創建好了,那我們就在main.py主文件中調用:
main.py
#coding:utf-8
from webvideo.app import app
from flask import render_template #引入render_template模塊加載模板頁面
from webvideo.app.video import * #引入剛剛實現的video類文件,*表示所有
# 主頁面
@app.route("/")
def index():
#要搜索的視頻網址
url = 'https://www.juji.tv/dianshiju/Helloxiaojie/'
#初始video類
v = Video()
#調用其中的get_video_info方法獲取返回的json集
result = v.get_video_info(url)
#通過render_template加載video.html模板頁面,並向頁面傳遞上面的json集
return render_template("video.html",result=result)
那這個video.html在哪裏,因爲之前說過了,flask的默認模板文件是放在templates文件夾下的,代碼如下:
templates/video.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
margin: 0;
padding: 0;
}
ul{
list-style: none;
margin: 0;
padding: 0;
}
.content{
width: 1000px;
margin: 40px auto;
}
.video_search{
width: 600px;
border: 1px solid #ddd;
height: 40px;
display: flex;
}
.video_search_text{
border: none;
font-size: 14px;
width: 480px;
padding: 0 20px;
}
.video_search_btn{
background-color: #eee;
border: none;
width: 80px;
font-size: 16px;
}
.video_info{
margin-top: 40px;
display: flex;
}
.video_img{
width: 225px;
height: 300px;
padding: 2px;
border: 1px solid #ddd;
}
.video_title{
font-size: 18px;
font-weight: bold;
line-height: 50px;
}
.video_txt{
margin-left: 20px;
margin-right: 20px;
}
.video_user{
font-size: 16px;
}
.video_detail{
margin-top: 20px;
font-size: 14px;
color: #999;
line-height: 22px;
}
.video_online{
margin-top: 40px;
width: 100%;
font-size: 16px;
padding-left: 20px;
line-height: 40px;
border-bottom: 1px solid #ddd;
}
.video_ep{
margin-top: 40px;
}
.video_ep ul li{
float: left;
margin-right: 20px;
width: 158px;
margin-bottom: 20px;
padding: 10px 10px;
border: 1px solid #ddd;
}
.video_ep ul li a{
color: #ff5519;
text-decoration: none;
}
.video_ep ul li a:hover{
color: #ff9f49;
}
.video_ep_li{
display: flex;
justify-content: space-between;
}
.video_play a{
display: flex;
align-items: center;
justify-content: center;
}
.video_play_name{
margin-left: 10px;
}
.video_play img,.video_down img{
width: 20px;
height: 20px;
}
.video_down{
margin-left: 10px;
border-left: 1px solid #ddd;
padding-left: 10px;
}
.video_show{
clear: both;
width: 100%;
}
.video_con{
margin-top: 120px;
}
.video_log{
max-height: 300px;
overflow: auto;
font-size: 14px;
line-height: 22px;
padding: 20px 0;
color: #999;
}
.towebmp4{
cursor: pointer;
padding: 4px 10px;
background-color: #ff5519;
color: #fff;
font-size: 16px;
}
.playmp4{
cursor: pointer;
padding: 4px 10px;
background-color: #228113;
color: #fff;
font-size: 16px;
}
</style>
</head>
<body>
<div class="content">
<form method="post" action="/search">
<div class="video_search">
<input type="text" name="weburl" class="video_search_text" placeholder="請輸入網址,這裏是抓取的https://www.juji.tv/dianshiju/linghunweixiugong/"><button type="submit" class="video_search_btn">搜索</button>
</div>
</form>
<div class="video_info">
<div class="video_logo"><img src="{{result['imgurl']}}" class="video_img"> </div>
<div class="video_txt">
<div class="video_title">{{result['title']}}</div>
<div class="video_user">{{result['users']}}</div>
<div class="video_detail">{{result['detail']}}</div>
</div>
</div>
<div class="video_online">在線觀看</div>
<div class="video_ep">
<ul>
{% for item in result['episodes']%}
<li>
<div class="video_ep_li">
<div class="video_play">
<a href="javascript:;" class="js-play" data-name="{{result['title']}}_{{item['name']}}" data-url="{{item['url']}}" title="播放"><img src="/static/img/play.png"><span class="video_play_name">{{item['name']}}</span></a>
</div>
<div class="video_down"><a href="javascript:;" class="js-down" data-name="{{result['title']}}_{{item['name']}}" data-url="{{item['url']}}" title="下載"><img src="/static/img/down.png"> </a> </div>
</div>
</li>
{% endfor%}
</ul>
</div>
<div class="video_show">
<!--播放視頻-->
<div class="video_con" style="display: none">
<video id="player" class="video-js vjs-16-9 vjs-big-play-centered" controls preload="auto" data-setup="{}"></video></div>
<!--播放視頻-->
<!--查看下載進度-->
<div class="video_log">
</div>
<!--查看下載進度-->
</div>
</div>
</body>
</html>
這裏html頁面的我就不在這裏詳細說了,這裏是講python,前端的知識點有興趣後面可以講講,但是裏面大家可以發現一些參數,比如:
{{result['title']}} #意思是顯示標題
{% for item in result['episodes']%} #意思就是循環展示劇集
……
{% endfor %}
這些就是通過上面的形式來獲取傳遞給頁面的result參數,簡單的說下,{{…}}這個是在頁面中讀取變量,{%%}這個是執行邏輯方法,跟asp,php,java的類似,在頁面中代碼混排,其實個人是不推薦這種方法,目前大趨勢都流行前後端分離,完全可以用JS來調用方法,不需要膠水的一樣的代碼寫法,這種不利用代碼維護,如果不是全棧人員的話,修改起來很麻煩,這裏只是爲了簡單快捷,所以直接用這種方式展示,來,我們運行run.py文件來看看結果:
至此我們就將爬取的視頻信息通過網頁的形式展示出來,這篇只是講解如何實現頁面展示,爲了不干擾理解的過程,所以我將JS部分刪除了。
認真的時光還是過得這麼快,該到吃飯的時間的了,今天就到這裏,江湖不說再見,咱們下篇見!
關注公衆號,超越平凡才能成就自己