序文
こんにちは!みなさん、こんにちは、魔王です〜
知識のポイント:
- クローラーの基本的なプロセス
- re正規表現は使いやすいです
- リクエスト
- JSONデータ解析方法
- ビデオデータの保存
開発環境]:
- Python 3.8
- Pycharm
モジュールの使用]:
- リクエスト>>>pipインストールリクエストサードパーティモジュール
- 再
win + R cmdと入力します。インストールコマンドを入力します。pipinstallモジュール名が一般的である場合は、ネットワーク接続がタイムアウトして国内のミラーソースを切り替えたことが原因である可能性があります。
クローラーの基本的なプロセス(修正済み):
1.データソース分析
-
クロールコンテンツが何であるかを判断しますか?(ターゲットURL、URL内のデータ)
ビデオコンテンツ -
開発者ツールを使用してパケットキャプチャ分析を実行し、そのURLアドレスを要求して取得するデータを分析します。I
。分析を通じて、ビデオ再生URLアドレスとは何かを知ることができますか?
II。ビデオ再生アドレスを介して、分析に進みます。 III。2つのビデオデータパケットの要求パラメータを比較することにより、すべてのビデオID (画像ID、ビデオID)
が取得されている限り、ビデオコンテンツを取得できることがわかります。
、音楽IDまたは任意のIDはリストページから取得できます)
IV。ビデオIDを分析するには、どこから取得するかを指定できます(通常はリストページで取得できます)。
ビデオ再生アドレスを取得したい>>>ビデオパケットを取得したい>>>ビデオIDを取得したい
2.コードの実装手順データ分析データの保存データを取得するためのリクエストを送信します
- リクエストを送信、ダンスビデオリストページのリクエストを送信
- データを取得すると、サーバーはデータコンテンツを返します
- データを解析し、必要なデータコンテンツのビデオIDを抽出します
- リクエストを送信し、ビデオIDをビデオパケットに渡してリクエストを送信します
- データを取得すると、サーバーはデータコンテンツを返します
- データを解析し、必要なデータコンテンツのビデオタイトルとビデオ再生アドレスを抽出します
- データを保存し、ビデオコンテンツをローカルに保存します
- 複数ページのデータ収集
コード
# 导入数据请求模块
import requests # 第三方模块 pip install requests 需要自行安装
# 导入re正则表达式
import re # 内置模块 不需要安装
# 导入格式化输出模块
import pprint # 内置模块 不需要安装
# 1. 发送请求, 对于舞蹈视频列表页面发送请求
for page in range(1, 11):
print(f'正在爬取第{
page}页的数据内容')
url = f'https://v.huya.com/g/all?set_id=51&order=hot&page={
page}'
# 爬虫是模拟浏览器对于服务器发送请求, 然后获取服务器返回数据内容
# user-agent: 用户代理 表示浏览器基本身份信息 (一种简单反反爬手段)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
# 通过requests模块里面get请求方式对于url地址发送请求, 并且携带上headers请求进行伪装, 最后用自定义变量response接收返回数据
response = requests.get(url=url, headers=headers)
# <Response [200]> 表示请求成功, 请求网址成功了 *** 200状态码表示请求成功, 但是不一定能够得到数据
# 2. 获取数据, 服务器返回数据内容 response.text 获取响应文本数据
# print(response.text)
# 3. 解析数据, 提取我们想要数据内容 视频ID
# 解析方式: css re xpath
# <li data-vid="676382675"> 想要数据 可以(.*?) 从response.text 里面去找寻这样数据内容
# .*? 是可以匹配任意字符(除了\n换行符以外) 如果你只是单纯提取数字 最好用 \d+ 匹配一个或者多个数字
video_ids = re.findall('<li data-vid="(\d+)">', response.text) # 返回列表数据
for video_id in video_ids: # 通过for循环遍历 提取列表里面元素 一个一个提取
# print(video_id)
# 4. 发送请求, 把视频ID传入到视频数据包里面发送请求
# 5. 获取数据, 服务器返回数据内容
# f 字符串格式化方法 {
} 占位符
video_info = f'https://liveapi.huya.com/moment/getMomentContent?videoId={
video_id}&uid=&_=1647433310180'
json_data = requests.get(url=video_info, headers=headers).json()
# 有反爬 就有 反反爬
# print(json_data)
# pprint.pprint(json_data)
# 根据冒号左边的内容, 提取冒号右边的内容
# 6. 解析数据
title = json_data['data']['moment']['title']
video_url = json_data['data']['moment']['videoInfo']['definitions'][0]['url']
# 7. 保存数据 >>> 发送请求 并且获取数据
"""
response.text >>> 文本数据返回字符串数据
response.json() >>> json字典数据
response.content >>> 二进制数据
"""
video_content = requests.get(url=video_url, headers=headers).content
with open('video\\' + title + '.mp4', mode='wb') as f:
f.write(video_content)
print(title, video_url)
エピローグ
さて、私のこの記事はここで終わります!
他にご提案やご質問がございましたら、お気軽にコメントまたはプライベートメッセージをお送りください。一緒に頑張りましょう(ง•_•)ง
気に入ったらブロガーをフォローするか、私の記事を気に入ってコメントしてください!!!