今天嘗試爬取一個小視頻網站的視頻(當然不是大家想的那個小視頻):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 竟然還有個跳轉 真是塊難啃的骨頭,但是應該問題不大,先記錄一下這個問題,以后遇到再看看 不管開發人員多么狡猾 我都要攻克你們
