江湖小白之一起學Python (十)開發視頻網之抓取信息並展示

微風徐來,我情不自禁的摸了摸我油亮的頭頂,嘴裏哼着哥哥的風繼續吹,思考下今天這章要寫的內容,絞盡腦汁,爲數不多的頭髮又掉了幾根……從以前的英俊帥氣慢慢朝着土肥圓在進化,哎,生活拖累了我啊!

上篇我們只是說了下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部分刪除了。

認真的時光還是過得這麼快,該到吃飯的時間的了,今天就到這裏,江湖不說再見,咱們下篇見!

關注公衆號,超越平凡才能成就自己

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章