程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python帶你采集不可言說網站數據,並帶你多重騷操作~

編輯:Python

前言

嗨喽,大佬們好鴨!這裡是小熊貓~

今天我們采集國內知名的shipin彈幕網站!

這裡有及時的動漫新番,活躍的ACG氛圍,有創意的Up主。

大家可以在這裡找到許多歡樂。


目錄(可根據個人情況點擊你想看的地方)

  • 前言
  • python方向
  • 環境使用:
    • 需要私我領取
  • 模塊使用:
      • 需要安裝模塊
      • 內置模塊 你安裝好python環境就可以了
  • 秘籍 <適用於任何網站, 采集任何數據>
      • 一. 數據來源分析 [點擊此處領取免費資料](https://jq.qq.com/?_wv=1027&k=2OpBRkgk)
      • 二. 代碼實現步驟過程 基本四大步驟
  • 代碼 [點擊此處領取免費資料](https://jq.qq.com/?_wv=1027&k=2OpBRkgk)
      • 1. 導入所需模塊
      • 2. 模擬浏覽器發送請求
      • 3. 獲取數據 [點擊此處領取免費資料](https://jq.qq.com/?_wv=1027&k=2OpBRkgk)
      • 4. 保存數據 [點擊此處領取免費資料](https://jq.qq.com/?_wv=1027&k=2OpBRkgk)
      • 5. 實現搜索功能
      • 8. 一個簡單的操作界面 [點擊此處領取免費資料](https://jq.qq.com/?_wv=1027&k=2OpBRkgk)
  • 尾語

python方向

  • 爬蟲程序 >>> 爬蟲工程師 采集數據處理
  • 網站開發 >>> 開發工程師
  • 數據分析 >>> 數據分析師 處理表格 word
  • 自動化
  • 游戲開發/輔助
  • 人工智能/機器學習 深度學習
  • 自動化測試 運維

環境使用:

  • Python 3.8
  • Pycharm 2021.2版本
  • ffmpeg

<需要設置環境變量> 軟件的使用 合成視頻和音頻

需要私我領取

模塊使用:

需要安裝模塊

  • import requests >>> pip install requests

內置模塊 你安裝好python環境就可以了

  • import re
  • import json
  • import subprocess

秘籍 <適用於任何網站, 采集任何數據>

一. 數據來源分析 點擊此處領取免費資料

  1. 確定自己需求 <采集網站是那個, 獲取數據是什麼東西>
  2. 通過開發者工具進行抓包分析, 分析我們想要數據內容來自於哪裡 <通過網頁源代碼就可以找到相應數據內容>
    shipin信息數據 在網頁源代碼裡面 playinfo裡面
    shipin標題

我們想要數據內容都是來自於網頁源代碼

I. 用浏覽器打開這個所采集的網址

II. 在這個網頁上面用鼠標右鍵點擊查看網頁源代碼 會彈出一個新的窗口

III. ctrl + F 打開搜索框 搜索playinfo 可以找到相關信息數據

IV. ctrl + F 打開搜索框 搜索shipin標題, 也可以找到相關的數據內容

二. 代碼實現步驟過程 基本四大步驟

  1. 發送請求, 模擬浏覽器對於url網址發送請求 <專門定義函數來發送請求>
  2. 獲取數據, 獲取網頁源代碼
  3. 解析數據, 提取我們想要數據內容 <shipin信息以及shipin標題>
  4. 保存數據, 把shipin內容保存本地

代碼 點擊此處領取免費資料

1. 導入所需模塊

不是內置模塊的小可耐們記得安裝哦~

import requests # 數據請求模塊 <發送請求工具>
import re # 正則表達式
import json # 序列化與反序列
import pprint # 格式化輸出模塊
import subprocess
import os

因審核機制原因,我把網址裡的一些東西刪掉了,小可耐們可以自己添加一下哈,很容易的

還有兩個字,我用拼音代替了,你們可以改回文字哦 ~

如果有不太會改或者有點點小懶惰的小可耐也可以私信我,我發你吶~

2. 模擬浏覽器發送請求

def get_response(html_url, data=None):
""" 發送請求函數 def 關鍵字 用於自定義函數 get_response 自定義函數名字 :param html_url: 形式參數<不具備實際意義> 傳入到這個函數參數 發送請求網址 :return: 響應對象 模擬浏覽器發送請求 headers 請求頭進行偽裝模擬 user-agent 用戶代理意思 表示浏覽器基本身份標識 <Response [200]> <>在python裡面表示對象 響應對象 200 狀態碼 表示請求成功 相當於打電話, 打通了嘟嘟嘟聲音 404 網址不對 相當於你所撥打電話是空號 503 服務器有問題 相當於你所撥打電話不在服務區 403 你沒有訪問權限 相當於你所撥打電話正在通話中 """
headers = {

'referer': 'https://www..com/', # 防盜鏈 告訴服務器你請求url是從哪裡跳轉過來的
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
}
response = requests.get(url=html_url, params=data, headers=headers)
return response

3. 獲取數據 點擊此處領取免費資料

def get_video_info(play_url):
""" 獲取shipin信息函數 :param play_url: shipin播放詳情頁 :return: 信息shipin信息 仰望星空腳踏實地 不會用正則 6 通過相關語法,可以對於字符串數據提取自己想要內容 解析數據 re.findall() 通過re模塊裡面findall 去找到所有我們想要數據內容 從什麼地方去找什麼樣數據內容 從response.text裡面去找 "title":"(.*?)","pubdate" 中(.*?) 這段是我們想要數據 '"title":"(.*?)","pubdate"', response.text 保存數據, 標題作為文件名保存, 以字符串數據形式 列表取值 len 統計元素個數 [0] 根據索引位置取值 列表索引位置從0開始計數 type() 內置函數,查看數據類型 """
# 定義了函數, 一定要調用
response = get_response(html_url=play_url) # 調用前面定義好的發送請求函數 函數是可以重復調用
# print(response.text) # response.text 獲取響應對象文本數據 <獲取網頁源代碼> 字符串數據
title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '') # 標題
title = re.sub(r'[/\:*?"<>|]', '', title)
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0] # 視頻信息
# print(title)
# print(html_data)
# print(type(html_data))
# 為了方便提取數據, 可以把這個html_data 轉成json字典數據
json_data = json.loads(html_data)
# print(json_data)
# print(type(json_data)) # 輸出一行
# 字符串單雙引號使用 外面是單引號裡面就要使用雙引號
# pprint.pprint(json_data) # 格式化展開效果
# 字典取值, 鍵值對取值 根據冒號左邊的內容<鍵>, 提取冒號右邊的內容<值>
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
print(audio_url)
print(video_url)
video_info = [title, audio_url, video_url]
return video_info

4. 保存數據 點擊此處領取免費資料

def save(title, audio_url, video_url):
""" 保存數據函數 :param title: shipin標題 :param audio_url: 音頻url :param video_url: shipin畫面url :return: """
audio_content = get_response(html_url=audio_url).content
video_content = get_response(html_url=video_url).content
with open('video\\' + title + '.mp3', mode='wb') as f:
f.write(audio_content)
with open('video\\' + title + '.mp4', mode='wb') as f:
f.write(video_content)
cmd = f"ffmpeg -i video\\{
title}.mp4 -i video\\{
title}.mp3 -c:v copy -c:a aac -strict experimental video\\{
title}output.mp4"
subprocess.run(cmd, shell=True)
os.remove(f'video\\{
title}.mp4')
os.remove(f'video\\{
title}.mp3')
print('')
print(title, '視頻下載完成')

5. 實現搜索功能

def get_search(page, word):
""" :param page: 采集多少頁 :param word: 搜索關鍵字 :return: """
search_url = 'https://api..com/x/web-interface/search/type'
data = {

'__refresh__': 'true',
'_extra': '',
'context': '',
'page': page,
'page_size': '42',
'from_source': '',
'from_spmid': '333.337',
'platform': 'pc',
'highlight': '1',
'single_column': '0',
'keyword': word,
'category_id': '',
'search_type': 'video',
'dynamic_offset': '84',
'preload': 'true',
'com2co': 'true',
}
json_data = get_response(html_url=search_url, data=data).json()
bv_list = [i['bvid'] for i in json_data['data']['result']]
print(bv_list)
return bv_list
# 6. 采集多個shipin
def get_up_video(page, up_id):
""" 采集up多個shipin :param page: 采集多少頁 :param up_id: shipin博主ID :return: """
up_link = 'https://api..com/x/space/arc/search'
data = {

'mid': up_id,
'ps': '30',
'tid': '0',
'pn': page,
'keyword': '',
'order': 'pubdate',
'jsonp': 'jsonp',
}
json_data = get_response(html_url=up_link, data=data).json()
bv_list = [i['bvid'] for i in json_data['data']['list']['vlist']]
print(bv_list)
return bv_list
# 7. 獲取id
def main(bv_id):
""" 主函數 :param bv_id: shipin bv號 :return: """
video_info = get_video_info(play_url=f'https://www..com/video/{
bv_id}')
save(video_info[0], video_info[1], video_info[2])

8. 一個簡單的操作界面 點擊此處領取免費資料

if __name__ == '__main__':
# 只要你可以看到數據
msg = """請輸入你要進行的操作: A. 多頁數據采集 B. 采集單個shipin C. 采集番劇 D. 采集某個Up所有shipin內容 0. 即可退出系統 """
while True:
print(msg)
kew_word = input('請輸入你要進行的操作: ')
if kew_word == 'A' or kew_word == 'a':
word = input('請輸入你想要下載shipin關鍵字: ')
page = input('請輸入你想要下載shipin頁數: ')
for num in range(1, int(page) + 1):
bv_list = get_search(page=num, word=word)
elif kew_word == 'B' or kew_word == 'b':
bv = input('請輸入你想要下載shipinBv號: ')
elif kew_word == 'C' or kew_word == 'c':
print('功能還沒上線')
elif kew_word == 'D' or kew_word == 'd':
up_id = input('請輸入你想要下載up主ID: ')
page = input('請輸入你想要下載shipin頁數: ')
for num in range(1, int(page) + 1):
get_up_video(page=num, up_id=up_id)
elif kew_word == '0':
break

尾語

成功沒有快車道,幸福沒有高速路。

所有的成功,都來自不倦地努力和奔跑,所有的幸福都來自平凡的奮斗和堅持

——勵志語錄

本文章就寫完啦~感興趣的小伙伴可以復制代碼去試試

你們的支持是我最大的動力!!記得三連哦~ 歡迎大家閱讀往期的文章呀~

我是小熊貓, 咱們下篇文章見啦


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved