当前位置: 首页 > news >正文

python爬虫--小白篇【爬虫实践】

一、前言

1.1、王者荣耀皮肤爬虫

        根据王者荣耀链接,将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤:

  1. 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id;
  2. 根据单个英雄的hero_name和hero_id去查找该英雄每张皮肤图片的下载连接;
  3. 根据单张皮肤图片链接地址下载并保存图片内容到文件夹中;

1.2、腾讯动漫图片爬虫

         将腾讯动漫链接中每章节中的动漫图片爬取下来保存到本地。经过分析可知,只需要获取每张动漫图片的下载地址即可,然后在每章节后点击下一章按钮即可获取其他章节的动漫图片下载链接。其中需要注意的是需要通过动作链去模拟鼠标滑动的操作,可以通过ActionChains(browser).scroll_to_element(pic).perform()完成该操作。

1.3、m3u8视频爬虫

        根据单个AcFun视频链接,将视频爬取保存到本地。经过分析可知,可以分为三个步骤:

  1. 获取m3u8列表文件;
  2. 提取所有视频片段的播放地址ts文件;
  3. 下载并合并视频片段;

二、案例

 2.1、王者荣耀皮肤爬虫演示

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :王者荣耀图片下载
@Time :2024/12/9 13:58
@Motto:一直努力,一直奋进,保持平常心"""
import os.path
import pprint
import reimport requests
from bs4 import BeautifulSoup
# https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/558/558-bigskin-1.jpg
# https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/577/577-bigskin-2.jpg
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}# 根据英雄皮肤的连接下载并保存对应的英雄皮肤图片
def download_pic(pic_url, path, pic_name, hero_name):pic_content = requests.get(pic_url, headers=header).contentif not os.path.exists(f'{path}/{hero_name}'):os.mkdir(f'{path}/{hero_name}')with open(f'{path}/{hero_name}/{pic_name}.jpg', 'wb') as f:f.write(pic_content)print(f"{pic_name}下载成功")# 获取英雄的全部图片(单个英雄对应多个皮肤图片)
def get_hero_pics(hero_id,hero_name):hero_url = f"https://pvp.qq.com/web201605/herodetail/{hero_id}.shtml"r = requests.get(hero_url, headers=header)# apparent_encoding 是 Python requests 库中的一个属性,用于从响应内容中分析得出的编码方式r.encoding = r.apparent_encoding# print(r.text)soup = BeautifulSoup(r.text, 'html.parser')content = soup.find('ul', class_="pic-pf-list pic-pf-list3").get('data-imgname')pic_names = re.sub('&\d+', '', content).split('|')for num, pic_name in enumerate(pic_names):num += 1pic_url = f"https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{hero_id}/{hero_id}-bigskin-{num}.jpg"download_pic(pic_url, path, pic_name, hero_name)# 获取全部英雄的名称和对应的hero_id
def get_hero(hero_url):hero_list = requests.get(hero_url,headers=header).json()# 这个函数主要用于以一种美观、格式化的方式打印复杂的数据结构,如多层嵌套的列表、元组和字典等。它能够使输出的结果显示得更加清晰和易于阅读pprint.pprint(hero_list)for hero in hero_list:hero_name = hero['cname']hero_id = hero['ename']get_hero_pics(hero_id,hero_name)if __name__ == '__main__':"""1、根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id2、根据单个英雄的hero_name和hero_id去查找该英雄的全部皮肤碎片的数量,获取每张皮肤图片的下载连接3、根据单张皮肤图片链接地址下载并保存图片内容到文件夹中"""path = "D:\\ProjectCode\\Spider\\StudySpider07\\heros"heroes_url = "https://pvp.qq.com/web201605/js/herolist.json"get_hero(heroes_url)

2.2、腾讯动漫图片爬虫演示

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :腾讯动漫图片下载
@Time :2024/12/9 15:26
@Motto:一直努力,一直奋进,保持平常心"""
import os.path
import timeimport requests
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChainsservice = Service(executable_path='D:\ApplicationsSoftware\EdgeDriver\edgedriver_win32\msedgedriver.exe')
opt = Options()
opt.add_argument('--disable-blink-features=AutomationControlled')
# opt.headless = True# 下载动漫图片
def download(url ,path):browser = webdriver.Edge(service=service, options=opt)browser.maximize_window()browser.get(url)time.sleep(1)filename = browser.find_element(by=By.XPATH,value='//*[@id="comicTitle"]/span[@class="title-comicHeading"]').textpic_list = browser.find_elements(by=By.XPATH, value='//*[@id="comicContain"]/li/img')for num, pic in enumerate(pic_list):time.sleep(0.5)ActionChains(browser).scroll_to_element(pic).perform()link = pic.get_attribute('src')pic_content = requests.get(link).contentif not os.path.exists(f'{path}/{filename}'):os.mkdir(f'{path}/{filename}')with open(f'{path}/{filename}/{num}.jpg', 'wb') as f:f.write(pic_content)# print(link)print(f"已下载...{filename}....第{num+1}张图片")next_page = browser.find_element(by=By.XPATH, value='//*[@id="mainControlNext"]').get_attribute('href')browser.close()return next_pageif __name__ == '__main__':path = "D:\\ProjectCode\\Spider\\StudySpider07\\动漫"url = "https://ac.qq.com/ComicView/index/id/656073/cid/68282"while url:url = download(url, path)

2.3、m3u8视频爬虫演示

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :视频爬虫
@Time :2024/12/9 16:37
@Motto:一直努力,一直奋进,保持平常心"""
import pprint
import re
import json
import requests
from tqdm import tqdm # 进度条模块
from bs4 import BeautifulSoupheader = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}# 获取m3u8列表文件
def get_m3u8_list(url):resp = requests.get(url,headers=header)# print(resp.text)# 正则表达式去匹配info = re.findall('window.pageInfo = window.videoInfo = (.*?) window.videoResource', resp.text, re.S)[0].strip()[:-1]# 逐层剥开找到m3u8地址info_json = json.loads(json.loads(info)['currentVideoInfo']['ksPlayJson'])['adaptationSet'][0]['representation'][0]['url']filename = json.loads(info)['title']# print(filename)# pprint.pp(info_json)return info_json,filename# 提取所有视频片段的播放地址ts文件
def get_ts_files(m3u8_url):resp = requests.get(m3u8_url, headers=header)# print(resp.text)ts_files = re.sub('#.*', '', resp.text).strip()return ts_files# 下载并合并视频片段
def download_combine(ts_files, path, filename):with open(f'{path}/{filename}.mp4', 'ab') as f:for ts in tqdm(ts_files):# 地址拼接ts = 'https://ali-safety-video.acfun.cn/mediacloud/acfun/acfun_video/' + ts# 获取地址二进制流内容ts_content = requests.get(ts, headers=header).contentf.write(ts_content)# # 获取目录页的视频链接
# def get_index_link():
#     index_url = 'https://www.acfun.cn/rest/pc-direct/homePage/searchDefault'
#     resp = requests.get(index_url, headers=header)
#     print(resp.text)
#     soup = BeautifulSoup(resp.text, 'html.parser')
#     link_list = soup.findAll('a', class_="list-wrap")
#     # 遍历所有的<a>标签并打印它们的href属性值
#     for tag in link_list:
#         href = tag.get('href')
#         if href:  # 确保href属性存在
#             print(href)
#
#     else:
#         print('请求失败,状态码:', resp.status_code)
#     print(link_list)def main():url = "https://www.acfun.cn/v/ac46628128"path = "D:\\ProjectCode\\Spider\\StudySpider07\\videos"m3u8_url, filename = get_m3u8_list(url)ts_files = get_ts_files(m3u8_url)download_combine(ts_files, path, filename)# get_index_link()if __name__ == '__main__':main()

相关文章:

python爬虫--小白篇【爬虫实践】

一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接&#xff0c;将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤&#xff1a; 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id&#xff1b;根据单个英雄的hero_name和h…...

Unity背包道具拖拽(极简版实现)

&#xff08;感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服&#xff09; 1.关键接口&#xff0c;三个拖拽相关的 2.关键参数&#xff0c;PointerEventData 一直没仔细看过&#xff0c;其实有包含鼠标相关的很多参数&#xff0c;鼠标点击次数&#xff…...

spark读取普通文件

spark读取普通文件 txt文件 """ 将一行数据当做一个字段&#xff0c;需要自己切割 字段名称为value 表结构 可以从sql中搞 """ df spark.read.text("../../data/wordcount/input/data.txt") df spark.read.format("text"…...

MySQL SQL语句性能优化

MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…...

【蓝桥杯每日一题】技能升级

技能升级 2024-12-10 蓝桥杯每日一题 技能升级 二分 题目大意 一个角色有 N 种可以增加攻击力的技能&#xff0c;对于第 i 个技能首次升级可以提升 A i A_i Ai​ 点攻击力&#xff0c;随后的每次升级增加的攻击力都会减少 B i B_i Bi​ 。升级 ⌈ A i B i ⌉ \lceil \frac{A…...

css 实现在一条线上流动小物体(offset-path)

直接贴代码,留几个参考网址给大家 【SVG】路径<Path>标签详解,一次搞懂所有命令参数 探秘神奇的运动路径动画 Motion Path <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport&quo…...

探索 Robyn 框架 —— 下一代高性能 Web 框架

技术博客&#xff1a;探索 Robyn 框架 —— 下一代高性能 Web 框架 什么是 Robyn&#xff1f; Robyn 是一个用 Rust 编写的高性能 Web 框架&#xff0c;旨在通过极简设计和高效并发处理&#xff0c;帮助开发者快速构建可扩展的现代 Web 应用。得益于 Rust 的内存安全性和性能…...

STL容器-map P3613【深基15.例2】寄包柜 普及-

题目来源&#xff1a;洛谷题库 文章目录 map例题map知识点map使用注意&#xff1a;map的常用用法 map例题 P3613【深基15.例2】寄包柜 普及- 题意 根据数据插入/查询 思路 map键值对可以根据柜子编号查找物品&#xff0c;但是柜子又有很多个&#xff0c;考虑数组或者map数组…...

【MySQL 进阶之路】了解 性能优化 与 设计原则

1.B树的优势 “矮胖”结构&#xff1a; 矮&#xff1a;B树的每个节点存储更多的关键字&#xff0c;从而减少了树的层级&#xff08;最多三层&#xff09;&#xff0c;减少了磁盘I/O操作&#xff0c;提高了查询效率。胖&#xff1a;叶子节点存储实际的数据&#xff0c;并使用双…...

MySQL之数据库三大范式

一、什么是范式&#xff1f; 范式是数据库遵循设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 &#xff08;范式是具有最小冗余的表结构&#xff09; 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式&#xff08;1NF/2NF/3NF…...

[大数据]Hudi

G:\Bigdata\17.hudi\大数据技术之数据湖Hudi 第1章 Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服…...

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Dock…...

JavaScript 高级特性与 ES6 新特性:正则表达式的深度探索

在现代 JavaScript 开发中&#xff0c;正则表达式&#xff08;Regular Expressions&#xff09;和高级特性、ES6 新特性的结合使用&#xff0c;能够极大地提升代码的简洁性、可读性和功能性。本文将深入探讨 JavaScript 中的正则表达式及其在高级特性和 ES6 新特性中的应用&…...

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替换&#x1f388;1.3. 数据验证&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…...

【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )

文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…...

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务&#xff0c;然而&#xff0c;纯OCR任务偏向于模型的感知能力&#xff0c;对于文档场景&#xff0c;由于文字密度较高&#xff0c;现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…...

Mybatis动态sql执行过程

动态SQL的执行原理主要涉及到在运行时根据条件动态地生成SQL语句&#xff0c;然后将其发送给数据库执行。以下是动态SQL执行原理的详细解释&#xff1a; 一、接收参数 动态SQL首先会根据用户的输入或系统的条件接收参数。这些参数可以是查询条件、更新数据等&#xff0c;它们…...

leetcode 31 Next Permutation

题意 找到下一个permutation是什么&#xff0c;对于一个数组[1&#xff0c;2&#xff0c;3]&#xff0c;下一个排列就是[1, 3, 2] 链接 https://leetcode.com/problems/next-permutation/ 思考 首先任何一个permutation满足一个性质&#xff0c;从某个位置往后一定是降序。…...

每日一练 | 华为 eSight 创建的缺省角色

01 真题题目 下列选项中&#xff0c;不属于华为 eSight 创建的缺省角色的是&#xff1a; A. Administrator B. Monitor C. Operator D. End-User 02 真题答案 D 03 答案解析 华为 eSight 是一款综合性的网络管理平台&#xff0c;提供了多种管理和监控功能。 为了确保不同用…...

PyTorch基本使用-自动微分模块

学习目的&#xff1a;掌握自动微分模块的使用 训练神经网络时&#xff0c;最常用的算法就是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度&#xff0c;PyTorch 内置了名为 torch.autogra…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...