天天看點

python爬取美拍視訊

一.分析視訊加載過程,為爬視訊做準備(詳細)

1. 找到視訊所在位址

爬取視訊位址為https://www.meipai.com/medias/hot

滑鼠在界面右擊“檢視頁面源代碼”,ctrl+f搜尋video,發現視訊連結。

python爬取美拍視訊

頁面源代碼

複制上圖箭頭所指連結,發現進入單個視訊網址,同理查找網頁源代碼裡是否視訊位址,發現沒有,考慮視訊應該是動态資料,使用抓包工具尋找,然後找到視訊位址。

python爬取美拍視訊

找到下一級視訊位址

複制上述箭頭所指連結,發現就是我們要找的隻有視訊的網頁連結!!!

2.分析視訊加密過程

可以看出上述視訊連結中的參數特别長,可能是在浏覽器請求時進行加密了。點選抓包工具中的“網絡”裡的“媒體”

python爬取美拍視訊

視訊位址

可以猜測隻有視訊的位址(https://mvvideo10.meitudata.com/6333bbe70aeb2a0c812gxe965_H264_1_2910a0dd979362.mp4)由單個使用者的單個視訊網址(https://www.meipai.com/media/6980726254603093045)請求到的,在“源代碼”裡進行尋找和分析,我們找到“playPicsVideo”以及“decodeMp4.decode”。

python爬取美拍視訊

加密函數

搜尋“decodeMp4.decode”,然後找到下圖紅箭頭處。

python爬取美拍視訊

加密函數

為判斷加密過程是否為這一步,打上斷點,重新整理界面,得:

python爬取美拍視訊

調試

由此可知這一步就是加密,滑鼠放在‘.decode’上點選到‘.decode’函數的位置上。

python爬取美拍視訊

加密函數定義處

另外發現decodeMp4.decode()函數的輸入為(https://www.meipai.com/media/6980726254603093045)網址頁面源代碼裡的data-video。

二.思路整理

1.請求源網址‘https://www.meipai.com/medias/hot’,解析得到所有視訊的data-id

2.将data-id與’https://www.meipai.com’拼在一起,請求這一拼起來的網址,解析獲得标題title與加密函數的輸入值data-video

3.對data-video進行加密

4.對加密後得到的網址進行請求,下載下傳視訊

三.python實作

import requests
from lxml import etree
import re
import base64
url = 'https://www.meipai.com/medias/hot'
resp = requests.get(url)
html = etree.HTML(resp.text)

#解析提取視訊網址
data_url = html.xpath('/html/body/div[2]/div[1]/ul//div[1]/a/@href') 

#拼成電腦可以讀取的網址
video_url = []  
for i in data_url:
    url_i = 'https://www.meipai.com'+i
    video_url.append(url_i)
#print(video_url)

# 解密函數
def getHex(a):
    return {
    'str': a[4:],
    'hex': "".join(list(a[0:4])[::-1])  
    }
def getDec(a):
    b = str(int(a, 16))
    return {
    'pre': list(b[0:2]),
    'tail': list(b[2:])
    }
def substr(a, b):
    c = a[0:int(b[0])]
    d = a[int(b[0]):int(b[0]) + int(b[1])]
    return c + a[int(b[0]):].replace(d, '')
def getPos(a, b):
    b[0] = len(a) - int(b[0]) - int(b[1])
    return b
def decode(a):
    b = getHex(a)
    c = getDec(b['hex'])
    d = substr(b['str'], c['pre'])
    return base64.b64decode(substr(d, getPos(d, c['tail'])))

for i_url in video_url:
    #提取解密前的參數
    response = requests.get(i_url)
    obj = re.compile(r'data-video="(.*?)">',re.S)
    data_video = obj.findall(response.text)[0]
    html2 = etree.HTML(response.text)
    title = html2.xpath('/html/body/div[2]/div[1]/div[2]/h1/text()')[0].strip() 
    #print(data_video)
    #print(title)

    data_video_url = decode(data_video).decode()
    # 下載下傳視訊
    with open(r'./video/' + title + '.mp4', mode='wb') as f:
        f.write(requests.get('https:' + data_video_url).content)           

四.總結

本文講述我自學爬蟲時關于爬取美拍視訊的一些思考過程,主要分析如同通過抓包工具找到我們要的資料,這也是我薄弱的地方,與大家一起學習。關于python的學習,歡迎大家一起讨論學習。沖!!!

python爬取美拍視訊