你問我爬蟲最大的樂趣是什么?當然是爬小姐姐了~
磚家說,看美女可以提高壽命,那為了長壽不得天天看。
再說了,我看美女只是為了心情愉悅,心情好才能做好事情嘛~
當然我們都是正經人,都看正經的,別看這種,看多了營養跟不上~
是吧,這誰頂得住啊
算了算了 ,走遠了,關注正題。
說說今天用的環境和 模塊啥的
開發環境
- Python版本:Python 3.6 / 3.8
- 代碼編輯器:pycharm
模塊
- requests、re
- pip install requests
知識點
- requests 的簡單使用
- 正則表達式的簡單使用
一、數據來源分析
(比較重要, 只有當你找到數據來源的時候, 你才能通過代碼去實現)
1、確定要爬取的內容 (梨視頻)
2、利用開發者工具(F12 或者 鼠標右鍵點擊檢查 選擇 network)進行抓包分析 (學爬蟲, 寫爬蟲程序) 開發者工具 要會使用
當我們要爬取多個視頻內容 數據內容 (要知道一個數據從哪里來的)
I、找到一個視頻播放的url地址
II、找這個播放地址的來源 >>>> videoInfo
真實的播放地址
https://video.pearvideo.com/mp4/adshort/20210823/cont-1739485-15752387_adpkg-ad_hd.mp4
假的播放地址
https://video.pearvideo.com/mp4/adshort/20210823/1629873733405-15752387_adpkg-ad_hd.mp4
III、獲取每一個視頻的 ID 就可以獲取所有視頻的播放地址
二、代碼實現步驟
- 發送請求 對於排行榜的url 發送請求
- 獲取數據 獲取網頁源代碼 (獲取響應體的文本數據 response.text)
- 解析數據 提取想要的 視頻ID 以及 視頻標題
- 發送請求 需要把視頻ID傳入 相應的數據包里面
- 獲取數據 獲取json字典數據
- 解析數據 提取 假的播放地址
- 構建真實url地址
- 數據保存
- 進行多頁/多個視頻內容 爬取
要用到的模塊統統安排上
import requests # 數據請求 第三方模塊 pip install requests import re # 正則表達式模塊 import pprint # 格式化輸出模塊 import time # 時間模塊 import os # 文件操作的模塊
創建一個文件夾存放下載的視頻
filename = 'video\\' if not os.path.exists(filename): os.mkdir(filename)
特殊字符全部給它替換掉
def change_title(title): mode = re.compile(r'[\\\/\*\"\?\<\>\|]') new_title = re.sub(mode, '_', title) return new_title
客戶端(瀏覽器)對於服務器發送請求, 服務器接收到請求之后, 會給客戶端返回數據 (通過前端的頁面渲染)
通過 python代碼 對於服務器發送請求, 被反爬, 沒有給你返回你想要的數據內容
需要把python代碼進行偽裝 : 請求頭 headers
for page in range(10, 101, 10): url = f'https://www.pearvideo.com/popular_loading.jsp?reqType=1&categoryId=&start={page}&sort=4&mrd=0.985271587548759' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } response = requests.get(url=url, headers=headers) print(response.status_code)
返回的是響應體對象 200 狀態碼, 表示請求成功。
獲取響應體的文本屬性
response 返回的數據 和 elements 並不是一定是一樣的
print(response.text)
解析數據 , re正則表達式, css選擇器, xpath [哪一個最適合就那種]
.*? 匹配任意字符, \d+ 匹配多個數字,視頻ID都是數字
正則表達式,匹配出來的內容,返回的是列表
video_ids = re.findall('<a href="video_(\d+)" class="popularembd actplay">', response.text) titles = re.findall('<h2 class="popularem-title">(.*?)</h2>', response.text)
我們都知道 如果要提取列表中每一個元素 是需要遍歷 如果我們同時提取兩個列表呢?
.zip 壓縮包文件 zip(video_ids, titles) 返回是可迭代對象,可以遍歷, for循環可以提取出來。
for video_id, title in zip(video_ids, titles): # video_id = i[0] # title = i[1] # print(video_id) # print(title) # 字符串格式化方法 '{video_id}'.format(video_id) new_title = change_title(title) link_url = f'https://www.pearvideo.com/videoStatus.jsp?contId={video_id}&mrd=0.8988491099054703' print(link_url)
Referer : 告訴服務器, 我們請求的url地址 是從哪里跳轉過來的
headers_1 = { 'Referer': f'https://www.pearvideo.com/video_{video_id}', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } response_1 = requests.get(url=link_url, headers=headers_1)
print(response_1.json())
pprint.pprint(response_1.json())
對於json字典數據 可以直接根據鍵值對取值 根據冒號左邊的內容 提取冒號右邊的內容
src_url = response_1.json()['videoInfo']['videos']['srcUrl'] now_time = response_1.json()['systemTime']
replace 字符串替換的意思 就是 now_time 替換成 ‘cont-1739485’
video_url = src_url.replace(now_time, f'cont-{video_id}') print(video_url)
now_time = int(time.time() * 1000)
print(now_time)
print(src_url)
獲取當前時間戳 直接替換掉
真實的播放地址
https://video.pearvideo.com/mp4/adshort/20210823/cont-1739485-15752387_adpkg-ad_hd.mp4
假的播放地址
https://video.pearvideo.com/mp4/adshort/20210823/1629873733405-15752387_adpkg-ad_hd.mp4
string_1 = ‘/’.join(src_url.split(’/’)[:-1])
string_2 = ‘-’.join(src_url.split(’-’)[1:])
video_url = string_1 + ‘/cont-’ + video_id + ‘-’ + string_2
print(video_url)
video_content = requests.get(url=video_url).content with open(filename + new_title + '.mp4', mode='wb') as f: f.write(video_content) print(title)
OK ,我們看看爬取結果
如果文章看不懂的話,也有詳細的視頻教程,都可以點我領取 ,包括完整代碼。
很多小伙伴因為沒有好的學習資料或者遇到問題不能及時得到解決,導致自己學不下去,這里小編給大家准備了大量學習資料,都可以點上面的(藍色點我領取)
Python 環境、pycharm編輯器/永久激活/翻譯插件
python 零基礎視頻教程
Python 界面開發實戰教程
Python 爬蟲實戰教程
Python 數據分析實戰教程
python 游戲開發實戰教程
Python 電子書100本
Python 學習路線規划
本節視頻源碼、課件、福利文件
都可以加群免費領取
Python 相關問題可解答
Python 相關外包需求可發布
Python 相關招聘需求可發布