關於json接口返回的數據不是json格式的處理方法——正則匹配


今天嘗試爬取一個小視頻網站的視頻(當然不是大家想的那個小視頻):www.vmovier.com

一開始以為直接進去網頁后使用xpath匹配鏈接就行 測試發現該網站使用懶加載技術  所以直接爬的方法行不通 不能完全匹配所有視頻鏈接

於是我抓取了它的加載接口:https://www.vmovier.com/post/getbytab?tab=new&page=3&pagepart=1

其中page參數是頁數、pagepart參數是每頁的第幾次加載,經過測試發現每一頁都有三次加載,這里可以使用循環來實現

 

page = int(input("請輸入您要爬取的頁數:"))
    #將捕獲接口拿過來  因為是動態的頁面 所以捕獲接口 向接口發送數據
    #page=頁數  pagepart=每頁的第幾次刷新 每頁有三次刷新分別是1 2 3 可以寫一個循環
for T in range (1,4):
    url = "https://www.vmovier.com/post/getbytab?tab=new&page=% s&pagepart=%d" %(page,T)
    #print(url)
    # exit()

 

然后本文的主要問題是這個接口說是返回的是json數據格式,但是我打開發現根本不是標准json格式:

 

 這里我強烈譴責開發這個接口的程序員,耗費了我好長時間去尋找別的解決方法

下面這一塊是我想過濾出的東西:

 

 

 

一開始想的是獲取data字典的部分,轉化為HTML格式, 使用xpath來過濾我需要的標題和視頻鏈接,但是實驗發現行不通,最后我選擇使用了正則匹配的方法,不得不說正則真滴強:

import requests
from  bs4 import  BeautifulSoup
import time
from lxml import etree
import re
import json


#添加頭部  作為全局
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}

url = "https://www.vmovier.com/post/getbytab?tab=new&page=3&pagepart=1"
r = requests.get(url=url,headers=headers)
#print(r.text)
obj = json.loads(r.text)
# print(obj)
# exit()
#取出所有和視頻相關的數據 標題和url data是一個列表 里面存放的都是字典
data = obj['data']
#print(data)
# # exit()
# tree = etree.HTML(data)
# title = tree.xpath('//div[@class ="index-more"]')
# print(title)
match_obj_url = re.compile(r'<a href="(.*)" title=".*全文" target="_blank">閱讀全文...</a>')
url = re.findall(match_obj_url,data)
print(url)
match_obj_title = re.compile(r'<a href=".*" title="(.*)全文" target="_blank">閱讀全文...</a>')
title = re.findall(match_obj_title,data)
print(title)
exit()

 

 費了2個多小時的時間,可算搞出來了后面獲得這個url還不是最終視頻的url 竟然還有個跳轉 真是塊難啃的骨頭,但是應該問題不大,先記錄一下這個問題,以后遇到再看看  不管開發人員多么狡猾  我都要攻克你們


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM