目錄
- 思路
- 詳細步驟
- 代碼演示
- 多頁操作詳細
- 代碼演示
思路

1.先在空白處右鍵點擊查看網頁源代碼 2.發現頁面上的視頻信息在網頁中,該網站的視頻鏈接、名稱等是直接加載的 3.模擬向梨視頻汽車板塊網址發送get請求 4.分析返回結果發現視頻鏈接是一個個li標簽下的a標簽的href值 5.由於同類li只用於存放視頻,從這些li標簽定位a標簽即可 6.補全a標簽中的鏈接,點擊,是視頻詳情頁,查詢該網頁源代碼 7.視頻詳情頁中視頻不是直接加載的,無需向該網頁發送請求 8.通過network找到二次加載的地址,並向其發送get請求,返回錯誤信息,說明該網站有防爬措施 9.在請求頭中添加referer字段說明請求來源 10.向該視頻鏈接發送請求並反序列化 11.拿到的視頻鏈接無法訪問 12.分析可知中間有一段被系統時間替換 13.利用視頻編號將其替換回來從而獲取真實連接 14.向該鏈接發送請求並將返回的視頻保存至本地
詳細步驟
1、先分析網頁的加載模式,在空白處點擊右鍵查看網頁源代碼,隨便復制某個視頻標題在源代碼頁面按Ctrl+F搜索,能夠搜索到,說明這個網站是直接加載的
2、回到頁面,在空白處右鍵點擊檢查,選擇Elements欄,再點擊最右邊的箭頭符號,把鼠標移到某個視頻,下欄會定位到其所在的標簽,尋找規律后發現這些標簽都是在一個個<li class="categoryem">標簽下
3.在pycharm里循環li標簽內的a標簽里href的內容,拼接后發現是每個視頻的詳情頁地址
4、在
6、朝該詳情頁發送請求發現獲取不到
7、原因是有防爬措施之防盜鏈,得定義一個請求頭加上Refer參數再去請求網站
8、在代碼中執行下,看看能不能拿到視頻真實的鏈接
9、去瀏覽器上復制視頻的地址發現與我們拿到的有地方不一樣
10、接着去想如何去替換核心數據,去拿到真正的視頻地址,研究發現通過systemTime即可
11、在代碼里拼接成視頻的真實地址
12、利用os模塊寫入文件並保存單頁所有視頻數據
a.首先為了避免訪問次數過多,需要在循環內加入主動延遲
b.接下來創建存放視頻的目錄
c.拼接文件路徑保存數據寫入文件
代碼演示

import requests from bs4 import BeautifulSoup import os import time if not os.path.exists(r'視頻'): os.mkdir(r'視頻') # 定義根目錄地址 base_url = 'https://www.pearvideo.com/' # 1.發送get請求獲取頁面數據 res = requests.get('https://www.pearvideo.com/category_31') # 2.使用bs4模塊解析 soup = BeautifulSoup(res.text, 'lxml') # 3.研究視頻詳情鏈接 li_list = soup.select('li.categoryem') # 4.循環獲取每個li里面的a標簽 for li in li_list: a_tag = li.find(name='a') a_href_link = a_tag.get('href') # video_1742158 # 通過研究發現詳情頁數據是動態加載的 所以通過network獲取到地址 video_id = a_href_link.split('_')[-1] headers = { "Referer": "https://www.pearvideo.com/video_%s" % video_id } res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp', params={'contId': video_id}, headers=headers ) time.sleep(1) data_dict = res1.json() src_url = data_dict['videoInfo']['videos']['srcUrl'] systemTime = data_dict['systemTime'] real_url = src_url.replace(systemTime, 'cont-%s' % video_id) res2 = requests.get(real_url) file_path = os.path.join('視頻', real_url[-12:]) with open(file_path, 'wb')as f: f.write(res2.content) print('%s成功' % file_path)
多頁操作詳細
1、回到汽車板塊的首頁,在Network下的Fetch/XHR,將頁面滾動條往下拖到底,可以看到瀏覽器自動發送了個請求
2、再看一下請求的參數,可以看到12個視頻id以及頁面的起始位置,所以再往下拖滾動條會引起參數的變化
3、進入響應界面查看
4、將代碼稍作修改
# 在起始位置自定義參數 res=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start=%s' % n)
5、再將整個發送網絡請求獲取視頻數據最后保存的代碼段封裝成函數以便使用,參數為請求中的起始位置
6、調用此方法即可隨意獲取頁面的視頻數據,參數必須是12的倍數
代碼演示

梨視頻多頁數據爬取思路 import requests from bs4 import BeautifulSoup import os import time if not os.path.exists(r'梨視頻數據'): os.mkdir(r'梨視頻數據') def get_video(n): res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start=%s' % n) soup = BeautifulSoup(res.text, 'lxml') li_list = soup.select('li.categoryem') # 4.循環獲取每個li里面的a標簽 for li in li_list: a_tag = li.find(name='a') a_href_link = a_tag.get('href') # video_1742158 video_id = a_href_link.split('_')[-1] # 防盜鏈 headers = { "Referer": "https://www.pearvideo.com/video_%s" % video_id } res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp', params={'contId': video_id}, headers=headers ) data_dict = res1.json() src_url = data_dict['videoInfo']['videos']['srcUrl'] systemTime = data_dict['systemTime'] real_url = src_url.replace(systemTime, 'cont-%s' % video_id) res2 = requests.get(real_url) file_path = os.path.join(r'梨視頻數據', '%s.mp4' % video_id) with open(file_path, 'wb') as f: f.write(res2.content) time.sleep(0.5) for n in range(12, 48, 12): get_video(n)