Python爬虫实战教程:从数据来源分析到代码实现完整步骤
知识点开发环境:案例实现步骤:一. 数据来源分析

(只有当你找到数据来源的时候, 才能通过代码实现)
1.确定需求 (要爬取的内容是什么?)
使用开发者工具来进行抓包分析,以确定数据是从哪里来的(找出真正的数据来源)。
有 80 集 Python 基础入门视频教学,只要看了这些视频教学就能学会相关内容,这是付费 VIP 完整版的教程。
点这里即可免费在线观看
二. 代码实现过程
今天的目标
三. 单个视频导入所需模块
import json import requests import re
发送请求
data = {
operationName 为 "visionSearchPhoto"。
visionSearchPhoto 方法执行时需传入上述参数,其返回结果包含 result、llsid、webPageArea 等字段,feeds 字段包含 type、author、tags、photo 等子字段,author 子字段包含 id、name、following、headerUrl、headerUrls 等信息,headerUrls 又包含 cdn、url、__typename 等,photo 子字段包含 id、duration、caption、likeCount、realLikeCount、coverUrl、photoUrl、liked、timestamp、expTag、coverUrls、photoUrls、animatedCoverUrl、stereoType、videoRatio 等信息,还包含 canAddComment、currentPcursor、llsid、status、__typename 等字段,同时还返回 searchSessionId、pcursor、aladdinBanner 等信息,aladdinBanner 包含 imgUrl、link、__typename 等。
'variables': {
'keyword': '张三',
'pcursor': ' ',
'page': "search",
'searchSessionId' 是 "MTRfMjcwOTMyMTQ2XzE2Mjk5ODcyODQ2NTJf5oWi5pGHXzQzMQ"
}
使用 requests 库发送一个 POST 请求,请求的地址是 'https://www.kuaishou.com/graphql',请求的数据是 data 。
加请求头
headers = {
Content-Type 的格式有四种,分别对应着 data。这四种格式分别是:格式一、格式二、格式三、格式四。
# 爬虫基础/xml: 把xml作为一个文件来传输
# multipart/form-data: 用于文件上传
内容类型为 JSON 格式。
# 用户身份标识
'Cookie' 包含以下信息:kpf 为 PC_WEB;kpn 为 KUAISHOU_VISION;clientid 为 3;did 为 web_721a784b472981d650bcb8bbc5e9c9c2
# 浏览器信息 (伪装成浏览器发送请求)
"Mozilla/5.0 表示用户代理的版本信息,其运行在 Windows NT 10.0 的操作系统上,且为 64 位系统,即 Win64;同时,浏览器内核为 AppleWebKit/537.36,其呈现方式类似 Gecko;当前使用的浏览器是 Chrome/91.0.4472.124,其渲染引擎为 WebKit,而整体的浏览器标识为 Safari/537.36。"
}
json序列化操作
JSON 数据交换格式。在 JSON 出现之前,大家一直将 XML 用于传递数据。 各个语言都支持 JSON ,JSON 能够支持各种数据类型,因此 JSON 常被用于我们日常的 HTTP 交互以及数据存储等方面。 # 将python对象编码成Json字符串 data = json.dumps(data) 使用 requests 库的 post 方法向 'https://www.kuaishou.com/graphql' 发送请求,请求头为 headers,请求数据为 data,然后将返回的响应转换为 json 格式并赋值给 json_data 。
字典取值
feeds 等于 json_data 中 data 下的 visionSearchPhoto 里的 feeds for feed in feeds: caption 等于 feed 字典中 'photo' 键对应的值的 'caption' 键对应的值 photoUrl 等于 feed 中的 photo 的 photoUrl new_title = re.sub(r'[/\:*?<>/\n] ', '-', caption)
再次发送请求
使用 requests 库发送 GET 请求获取 photoUrl 对应的内容,获取到的内容存储在 resp 中
保存数据
使用“wb”模式打开名为“video\”加上“title”再加上“.mp4”的文件,将其赋值给变量 f 。 f.write(resp) print(title, '爬取成功!!!')
四. 翻页爬取导入模块
import concurrent.futures import time
发送请求
def get_json(url, data): 使用 requests 库发送 POST 请求,请求的地址是 url,请求头是 headers,请求数据是 data,然后将返回的 JSON 数据赋值给 response 。 return response
修改标题
def change_title(title): # windows系统文件命名 不能含有特殊字符... # windows文件命名 字符串不能超过 256... new_title = re.sub(r'[/\\|:?<>"*\n]', '_', title) if len(new_title) > 50: new_title = new_title[:10] return new_title
数据提取
def parse(json_data): data_list 等于 json_data 中 'data' 下的 'visionSearchPhoto' 中的 'feeds' info_list = [] for data in data_list: # 提取标题 title 等于 data 中['photo']['caption']的值。 new_title 由 change_title 函数对 title 进行了处理后得到。 data 中的['photo']['photoUrl']被赋值给了 url_1 info_list 中添加了一个包含新标题和第一个 URL 的列表,即 [new_title, url_1] 被添加到了 info_list 中。 return info_list
保存数据
def save(title, url_1): 使用 requests 库发送 GET 请求获取 url_1 的内容,获取到的内容赋值给 resp 变量。 打开名为"video\\"加上 title 再加上 ".mp4"的文件,以二进制写入模式"wb"打开,将其赋值给变量 f 。 f.write(resp) print(title, '爬取成功!!!')
主函数 调动所有的函数
def run(url, data):
"""主函数 调动所有的函数"""
获取到的 json 数据是通过调用 get_json 函数,并传入 url 和 data 这两个参数而得到的。
info_list = parse(json_data)
对于标题和 url_1 ,它们来自 info_list 。
save(title, url_1)
if __name__ == '__main__':
start_time = time.time()
将其作为执行器使用。
for page in range(1, 5):
该 url 为 'https://www.kuaishou.com/graphql' 。
data = {
'operationName': "visionSearchPhoto",
'query': "query visionSearchPhoto($keyword: String, $pcursor: String, $searchSessionId: String, $page: String, $webPageArea: String) {\n visionSearchPhoto(keyword: $keyword, pcursor: $pcursor, searchSessionId: $searchSessionId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\ntype\nauthor {\n id\n name\n following\n headerUrl\n headerUrls {\n cdn\n url\n __typename\n }\n __typename\n}\ntags {\n type\n name\n __typename\n}\nphoto {\n id\n duration\n caption\n likeCount\n realLikeCount\n coverUrl\n photoUrl\n liked\n timestamp\n expTag\n coverUrls {\n cdn\n url\n __typename\n }\n photoUrls {\n cdn\n url\n __typename\n }\n animatedCoverUrl\n stereoType\n videoRatio\n __typename\n}\ncanAddComment\ncurrentPcursor\nllsid\nstatus\n__typename\n }\n searchSessionId\n pcursor\n aladdinBanner {\nimgUrl\nlink\n__typename\n }\n __typename\n }\n}\n",
'variables': {
'keyword': '曹芬',
# 'keyword': keyword,
'pcursor': str(page),
'page': "search",
'searchSessionId': "MTRfMjcwOTMyMTQ2XzE2Mjk5ODcyODQ2NTJf5oWi5pGHXzQzMQ"
}
}
data = json.dumps(data)
提交执行器来运行指定的内容,包括传入的 URL 和数据。具体来说,是将 run 函数与 url、data 等参数一起提交给 executor 去执行。
输出“一共花费了:”,然后输出时间差,即 time.time()减去 start_time 的结果
耗时为57.7秒
这篇关于 Python 爬虫实战之批量下载快手平台视频数据的文章到此就介绍完毕了。更多关于 Python 批量下载快手视频的内容,大家可以搜索本站以前的文章,或者继续浏览下面的相关文章。希望大家以后能多多支持本站!