開發環境:
Python 3.6
Pycharm
瀏覽器驅動 >>> 和瀏覽器(谷歌或者火狐) 版本最相近的一個(下載驅動之后和你代碼放到同一個文件里面就可以使用)
模塊使用:
- requests >>> pip install requests
- selenium >>> pip install selenium
- re
- os
想要學習Python的可以點這里,每晚8點都有免費Python案例的講解,還有老師在線一對一的解答
本篇文章流程(爬蟲基本思路):
一. 數據來源分析
-
確定需求 (我們要爬的內容是什么?)
抖音視頻內容 -
通過開發者工具進行抓包分析
I. (F12/鼠標右鍵點擊檢查可以打開) 選擇network 選擇 media 找播放地址
II. 找播放地址來源 >>>
二. 代碼實現過程
-
發送請求 對於視頻詳情頁發送請求
-
獲取數據 獲取網頁源代碼數據
-
解析數據 提取視頻播放地址 以及視頻標題
-
下載保存
爬取一個視頻
安裝所需模塊
import requests # 數據請求 第三方模塊 pip install requests import re # 正則表達式模塊 import os # 文件操作模塊 import time # 時間模塊 from selenium import webdriver # pip install selenium
發送請求
url = 'https://www.douyin.com/video/6942071509448002846' # headers 請求頭 偽裝作用 # user-agent: 瀏覽器的基本信息 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=li_url, headers=headers)

解析數據 通過 re 正則表達式
# 正則表達式匹配出來的內容是列表 # 貪婪模式[我全都要] 非貪婪模式(?) title = re.findall('<title data-react-helmet="true"> (.*?)</title>', response.text, re.S) new_title = change_title(title) # 返回是列表 是沒問題的吧 [1] 索引取值 第一個元素索引位置是0 第二個元素索引位置 1 html_data = re.findall('src(.*?)vr%3D%2', response.text)
進行解碼
video_url = requests.utils.unquote(html_data)
保存數據
with open(filename + new_title + '.mp4', mode='w') as f: f.write(video_content) # 寫入內容 print(title)
創建文件夾
filename = 'video\\' # 文件名字 if not os.path.exists(filename): # 判斷如果沒有這個文件夾的話 os.mkdir(filename) # 創建這個文件
批量爬取
實例化一個瀏覽器的對象
driver = webdriver.Chrome() # 訪問url地址網址 driver.get('https://www.douyin.com/user/MS4wLjABAAAAY8bNCoKh6fT_I2ZRaCkVB4pcVPIeoC0a9jOWWPUKvJw') # 延時三秒 time.sleep(3) # 下滑操作 drop_down()
模擬滑動操作
def drop_down(): """執行頁面滾動的操作""" # javascript for x in range(1, 30, 4): # 在你不斷的下拉過程中, 頁面高度也會變的 time.sleep(1) j = x / 9 # document.documentElement.scrollTop 指定滾動條的位置 # document.documentElement.scrollHeight 獲取瀏覽器頁面的最大高度 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j driver.execute_script(js)
返回的列表 里面元素是對象
lis = driver.find_elements_by_css_selector('div._927ae3b0dd790b5b62eae61c7d2fa0bc-scss > div:nth-child(2) > ul li') for li in lis: # 調用 find_element_by_css_selector() 方法 li_url = li.find_element_by_css_selector('a').get_attribute('href') driver.quit()
替換特殊字符
def change_title(title): pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|\n]") # '/ \ : * ? " < > |' new_title = re.sub(pattern, "_", title) # 替換為下划線 return new_title
運行結果

