【Python】爬虫数据提取

news2024/11/16 3:30:39

目录

一、xpath提取数据

二、爬虫爬取图片资源

三、爬虫爬取视频资源

四、FLV文件转码为MP4文件


一、xpath提取数据

<bookstore>
<book category="Python 基础">
    <title lang="cn">cook book</title>
    <author>David Beazley</author>
    <year>2022</year>
    <price>53.20</price>
</book>
<book category="story book">
    <title lang="en">The Lord of the Rings</title>
    <author>J.R.R.托尔金</author>
    <year>2005</year>
    <price>29.99</price>
</book>
<book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2013</year>
    <price>40.05</price>
</book>
</bookstore>

xpath(XML Path Language)是在HTML\XML中查找信息的语句,可在HTML\XML文档中对元素和属性进行遍历

在根结点下面的节点是并列的,如一个树结构,我们也可以像访问文件一样来获得这个元素 

xpath插件的安装:

  1. 自备梯子(能直接找到国内的.crx插件也可以不挂梯子)
  2. google浏览器搜索xpath_helper,进入谷歌应用商店下载得到一个.crx后缀的文件
  3. 打开浏览器的设置,找到拓展(拓展程序),进入开发者模式
  4. 直接下载得到的.crx文件用鼠标拖入浏览器,选择安装拓展
  5. 点击浏览器右上角拓展程序图标,可将xpath插件锁定

        点击xpath图标,出现这个黑框代表xpath插件安装成功

 xpath节点选取:

  • nodename :选中该元素
  • / :元素间的层级过度
  • // :匹配选择,可省略中间节点而不考虑位置
  • @ :选取属性
  • text() :选取文本

lxml模块:

lxml模块是Python的第三方库,配合path,利用etree.HTML,将获取的网页字符串转化成Element对象,Element对象通过xpath的方法调用,以列表形式返回数据,再进行数据提取

import requests
from lxml import etree

text = """
<bookstore>
<book category="Python 基础">
    <title lang="cn">cook book</title>
    <author>David Beazley</author>
    <year>2022</year>
    <price>53.20</price>
</book>
<book category="story book">
    <title lang="en">The Lord of the Rings</title>
    <author>J.R.R.托尔金</author>
    <year>2005</year>
    <price>29.99</price>
</book>
<book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2013</year>
    <price>40.05</price>
</book>
</bookstore>
"""

html = etree.HTML(text)
print(type(html))   # <class 'lxml.etree._Element'>
html_str = etree.tostring(html).decode()
print(type(html_str))   # <class 'str'>

# 获取书名
book_name = html.xpath("/html/body/bookstore/book/title/text()")    # 绝对路径
print(book_name)    # ['cook book', 'The Lord of the Rings', 'Learning XML']
book_name = html.xpath("//title/text()")
print(book_name)    # ['cook book', 'The Lord of the Rings', 'Learning XML']

# 数据提取列表元素
for i in book_name:
    print(i, end="\t")
# cook book	The Lord of the Rings	Learning XML

# 获取作者
book_author = html.xpath("//author/text()")
print("\n", book_author)    # ['David Beazley', 'J.R.R.托尔金', 'Erik T. Ray']

# 获取参数
category = html.xpath("//book/@category")
print(category)     # ['Python 基础', 'story book', 'WEB']
lang = html.xpath("//book/title/@lang")
print(lang)         # ['cn', 'en', 'en']

book = html.xpath("//book")
for i in book:
    category = i.xpath("@category")[0]
    book_info = dict()
    book_info[category] = dict()
    book_info[category]['name'] = i.xpath("title/text()")[0]
    book_info[category]['author'] = i.xpath("author/text()")[0]
    book_info[category]['year'] = i.xpath("year/text()")[0]
    book_info[category]['price'] = i.xpath("price/text()")[0]
    print(book_info)

"""
{'Python 基础': {'name': 'cook book', 'author': 'David Beazley', 'year': '2022', 'price': '53.20'}}
{'story book': {'name': 'The Lord of the Rings', 'author': 'J.R.R.托尔金', 'year': '2005', 'price': '29.99'}}
{'WEB': {'name': 'Learning XML', 'author': 'Erik T. Ray', 'year': '2013', 'price': '40.05'}}
"""

二、爬虫爬取图片资源

注:本代码爬取的图片皆无任何商业目的,仅供爬虫技术学习使用

示例:王者荣耀全英雄皮肤图片

import requests
from lxml import etree
import re

url = "https://pvp.qq.com/web201605/herolist.shtml"
response = requests.get(url)

response.encoding = "gbk"
html = response.text
# print(html)

html = etree.HTML(html)
# li_list = html.xpath("/html/body/div[3]/div/div/div[2]/div[2]/ul")
li_list = html.xpath('//ul[@class="herolist clearfix"]/li/a')
# xpath_helper拿到的xpath是已经被前端渲染过了的,不一定可用
# 如果xpath拿到的xpath不能直接用,就通过标签和属性手动选择数据

print(len(li_list))     # 93,英雄数量
for i in li_list:
    href = i.xpath('./@href')[0]
    name = i.xpath('./img/@alt')[0]
    # print(href, name)
    pattern = r'herodetail/(\d*)\.shtml'
    id = re.search(pattern, href).group(1)
    # print(name, id)

    cnt = 1
    while True:
        try:
            url = f"https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{id}/{id}-bigskin-{cnt}.jpg"
            resp = requests.get(url)
            if resp.status_code != 200:
                break
            with open(f"./skins/{name}{cnt}.jpg", "wb") as f:
                f.write(resp.content)
            cnt += 1
        except:
            print(Exception)
            break

三、爬虫爬取视频资源

注:本代码爬取的视频无任何商业目的,仅供爬虫技术学习使用

示例:B站李知恩视频

1. 对网页发送网络请求

import requests
from lxml import etree

url = "https://search.bilibili.com/all?" \
      "vt=16780856&keyword=李知恩&from_source=webtop_search&spm_id_from=333.1007&search_source=5"

response = requests.get(url)
print(response.text)

观察响应结果,请求发送成功,但是并未拿到想要的前端代码, 提示需要验证码(登录)

登录信息在请求头里面,我们要获取请求头信息

2. 获取视频链接

import requests
from lxml import etree

url = "https://search.bilibili.com/all?" \
      "vt=16780856&keyword=李知恩&from_source=webtop_search&spm_id_from=333.1007&search_source=5"

header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'referer': 'https://search.bilibili.com/all?keyword=%E6%9D%8E%E7%9F%A5%E6%81%A9&from_source=webtop_search&spm_id_from=333.1007&search_source=5',
    'cookie': "buvid3=EE26C87B-4D71-DDB1-E3EF-7C231D141FDE66254infoc; b_nut=1676099166; i-wanna-go-back=-1; _uuid=EEA6D79B-8E44-283C-4B1A-F63391023FC41071505infoc; buvid4=8BD6A57D-1756-0D2F-2D58-824CE069B0CF82025-023021115-3r0csnyFmYTJnqj7nA8pAw%3D%3D; DedeUserID=703170552; DedeUserID__ckMd5=921efa783160cc40; rpdid=|(YumR|Yk)|0J'uY~Y|mmklY; b_ut=5; nostalgia_conf=-1; header_theme_version=CLOSE; buvid_fp_plain=undefined; hit-dyn-v2=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; CURRENT_QUALITY=116; LIVE_BUVID=AUTO5716781015889927; hit-new-style-dyn=1; CURRENT_PID=114c35b0-cd23-11ed-a99d-39a1565dc8a4; fingerprint=07652cefeee9b3af116a4e8892842b91; home_feed_column=5; FEED_LIVE_VERSION=V8; SESSDATA=4afb5a37%2C1696835970%2Cf0b52%2A42; bili_jct=00e8099da712cb9a9738ad46d90f6d21; sid=8tpyjca9; bp_video_offset_703170552=783637244587016200; is-2022-channel=1; buvid_fp=07652cefeee9b3af116a4e8892842b91; PVID=2; innersign=1; b_lsid=326DE875_18776328C0A"
}

response = requests.get(url, headers=header)
# print(response.text)

html = etree.HTML(response.text)
div_list = html.xpath('//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div/div[1]/div/div')
print(len(div_list))

for i in div_list:
    i_url = i.xpath('./div/div[2]/a/@href')[0]
    i_url = "https:" + i_url
    print(i_url)

3. 下载第三方包you-get

pip install you-get

4. 用操作系统调用you-get包下载视频资源

import requests
from lxml import etree
import sys
import os
from you_get import common as you_get
import time
import ffmpy

url = "https://search.bilibili.com/all?keyword=%E6%9D%8E%E7%9F%A5%E6%81%A9&from_source=webtop_search&spm_id_from=333.1007&search_source=5"
header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'referer': 'https://search.bilibili.com/all?keyword=%E6%9D%8E%E7%9F%A5%E6%81%A9&from_source=webtop_search&spm_id_from=333.1007&search_source=5',
    'cookie': "buvid3=EE26C87B-4D71-DDB1-E3EF-7C231D141FDE66254infoc; b_nut=1676099166; i-wanna-go-back=-1; _uuid=EEA6D79B-8E44-283C-4B1A-F63391023FC41071505infoc; buvid4=8BD6A57D-1756-0D2F-2D58-824CE069B0CF82025-023021115-3r0csnyFmYTJnqj7nA8pAw%3D%3D; DedeUserID=703170552; DedeUserID__ckMd5=921efa783160cc40; rpdid=|(YumR|Yk)|0J'uY~Y|mmklY; b_ut=5; nostalgia_conf=-1; header_theme_version=CLOSE; buvid_fp_plain=undefined; hit-dyn-v2=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; CURRENT_QUALITY=116; LIVE_BUVID=AUTO5716781015889927; hit-new-style-dyn=1; CURRENT_PID=114c35b0-cd23-11ed-a99d-39a1565dc8a4; fingerprint=07652cefeee9b3af116a4e8892842b91; home_feed_column=5; FEED_LIVE_VERSION=V8; SESSDATA=4afb5a37%2C1696835970%2Cf0b52%2A42; bili_jct=00e8099da712cb9a9738ad46d90f6d21; sid=8tpyjca9; bp_video_offset_703170552=783637244587016200; is-2022-channel=1; buvid_fp=07652cefeee9b3af116a4e8892842b91; PVID=2; b_lsid=D3D108210E_1877853C1F0; innersign=0"
}

response = requests.get(url, headers=header)
# print(response.text)

html = etree.HTML(response.text)
div_list = html.xpath('//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div/div[1]/div/div')
print(len(div_list))

path = "iu_video/"

for i in div_list[:5]:
    v_url = i.xpath('.//a/@href')[0]
    v_url = "https:" + v_url
    # print(v_url)
    # v_title = i.xpath('./div/div[2]/a/div/div[1]/picture/img/@alt')
    v_title = (i.xpath('.//a/div/div[1]/picture//@alt')[0])
    print(v_url, v_title)
    try:
        # sys.argv = ['you-get', '-o', path, v_url]
        # you_get.main()
        os.system(f'you-get -o {path} {v_url}')
        print(v_url, "下载成功")
    except:
        print(Exception)
        print(v_url, v_title, "下载失败")
    else:
        time.sleep(2)

爬取到的资源包括XML类型文件和FLV类型文件,XML类型文件是弹幕文件,FLY类型文件是视频文件,特定播放器可以直接播放,我们也可以将其转换为mp4文件

四、FLV文件转码为MP4文件

安装ffmpy资源包,找到ffmgep.exe将视频文件转码为mp4文件

pip install ffmpy
import ffmpy
import os

folder_path = "./iu_video/"
for filename in os.listdir(folder_path):
    try:
        if ".flv" in filename:
            filename = folder_path + filename
            sink_file = filename[:-3] + "mp4"
            ff = ffmpy.FFmpeg(
                executable="C:\\Program Files (x86)\\Common Files\DVDVideoSoft\\lib\\ffmpeg.exe",
                inputs={filename: None},
                outputs={sink_file: None}
            )
            ff.run()
            print(filename, "转码成功")
    except:
        print(Exception)
        print(filename, "转码失败")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PROFINET1.8.0.5协议移植问题汇总

注&#xff1a;记录个人移植过程遇到的问题&#xff0c;正在更新。。。 PROFINET1.8.0.5协议移植遇到问题汇总&#xff1a; 软件环境&#xff1a;TIA_V17 硬件环境&#xff1a;stm32F205_ZET6主控芯片TPS-1 PROFINET IO 20500PF00&#xff08;芯片物料编码B0001.0.2&#xff09…

LabVIEW-数组数据类型

数组是将一系列、同一类型的数据组合到一起。在LabVIEW 中&#xff0c;数组可以是字符串类型、数值型或者布尔型等多种数据类型中的同类数据的集合。但不能创建以数组为元素的数组&#xff0c;也不能创建图标和图形数组。 目录 创建数组 ​编辑 数组相关函数 求数组大小 初…

并发集合ConcurrentHashMap、CopyOnWriteArrayList

一、ConcurrentHashMap 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CAS+synchronized实现的线程安全 CAS:在没有hash冲突时(Node要放在数组上时) synchronized:在出现hash冲突时(Node存放的位置已经有数据了) 存储的结构:…

移动机器人路径跟踪的设计和仿真模型预测控制(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在轨迹跟踪应用领域&#xff0c;通常 MPC 建模可根据机器人的控制方式选择基于运动学运动状态方程建模或者基于动力学运动状态…

【JavaEE初阶】计算机工作原理

摄影分享~ 文章目录冯诺依曼体系操作系统操作系统的定位进程/任务&#xff08;process/task&#xff09;内存管理冯诺依曼体系 线代的计算机&#xff0c;大多遵守冯诺依曼体系结构。 CPU 中央处理器: 进行算术运算和逻辑判断. 存储器: 分为外存和内存, 用于存储数据(使用二进…

从架构的角度看搜索与推荐

搜索与推荐的区别 1. 场景需求不同 搜索的场景故名思义&#xff0c;就是用户提供想要寻找的内容的描述&#xff0c;系统返回给用户匹配到的结果&#xff0c;常见的场景如文字输入框的搜索&#xff0c;图片搜索&#xff0c;听音识曲&#xff0c;标签筛选等&#xff0c;看似很多…

TypeScript - 泛型 Generics(通俗易懂详细教程)

前言 关于概念&#xff0c;本文不会过多叙述。 先来看个例子&#xff0c;体会一下泛型解决的问题吧。 我们定义一个 print 函数&#xff0c;这个函数的功能是把传入的参数打印出来&#xff0c;最后再返回这个参数&#xff0c;传入参数的类型是 string&#xff0c;函数返回类型…

Kyligence Zen 产品体验 --- 全方位总结

Kyligence Zen 是一个企业级大数据分析平台&#xff0c;基于 Hadoop 和 Spark 技术栈&#xff0c;具有高性能、可扩展性和易用性等优点。本文将从体验者角度出发&#xff0c;对 Kyligence Zen 进行详细的描述&#xff0c;包括使用场景、功能特点和使用体验。 一、使用场景 Kyl…

springboot 统一异常处理 + 日志记录

在项目的开发中&#xff0c;在某些情况下&#xff0c;比如非业务的操作&#xff0c;日志记录&#xff0c;权限认证和异常处理等。我们需要对客户端发出的请求进行拦截&#xff0c;常用的API拦截方式有Fliter&#xff0c;Interceptor&#xff0c;ControllerAdvice以及Aspect。先…

JavaScript【四】JavaScript中的函数

文章目录&#x1f31f;前言&#x1f31f;什么是函数?&#x1f31f;函数声明方式&#x1f31f; function关键字&#x1f31f; 字面量定义(匿名函数)&#x1f31f; 实例化构造函数&#x1f31f;函数调用方式&#x1f31f;通过括号调用&#x1f31f;自调用(IIFE)&#x1f31f;通过…

企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

windows安装Metasploit

近期在大佬群里各种炫技&#xff0c;各种工具使用&#xff0c;漏洞利用与复现&#xff0c;感觉自己常规安全测试就是个小学生&#xff0c;于是好心的大佬发了个Rapid7Setup-Windows64.exe的渗透工具&#xff0c;但是自己的电脑安装了&#xff0c;破解不了&#xff0c;导致失败&…

计算机组成原理——第四章指令系统(上)

提示&#xff1a;待到秋来九月八&#xff0c;我花开后百花杀 文章目录前言4.1.1 指令格式4.1.2 扩展操作码指令格式4.2.1 指令寻址4.2.2 数据寻址4.2.3 偏移寻址4.2.4 堆栈寻址汇总前言 通过第二章我们学习了运算器是如何进行加减乘除&#xff0c;移位运算操作的&#xff0c;通…

【密码算法 之七】GCM 浅析

文章目录1. 概述1.1 GHASH1.3 GCTR2. GCM 加密3. GCM 解密4. 总结在我的另一篇博客【密码算法 之三】分组密码工作模式 &#xff08;ECB \ CBC \ CFB \ OFB \ CTR \ XTS&#xff09;浅析 中已经详细的介绍了对称算法&#xff08;也称为“分组密码算法”&#xff09;的各种工作模…

排序算法(一)

一、排序算法 排序算法就是将数组按照数值或者字母序排列&#xff0c;常用的排序算法有很多&#xff0c;如下&#xff1a; 详细细节可以直接看维基百科&#xff1a;https://zh.wikipedia.org/zh-cn/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95 C的库中实现了常用的排序算法&#x…

Linux_红帽8学习笔记分享_4

Linux_红帽8学习笔记分享_4 文章目录Linux_红帽8学习笔记分享_41.用户管理useradd命令的使用1.1使用useradd添加用户1.2 Linux系统底层的四个连锁反应2.账户信息文件/etc/passwd中七个字段的含义3.组信息文件/etc/group中四个字段的含义4.影子文件/etc/shadow两个字段的含义5.相…

C++STL——map与set介绍及使用

map与set介绍及使用关联式容器健值对setmultisetmapmultimap关联式容器 之前我们学的list&#xff0c;vector等等是序列式容器&#xff0c;这里的set和map和之后的哈希表都是关联式容器&#xff0c;比如说搜索二叉树我们想插入一个值&#xff0c;不能随意的插入&#xff0c;因…

【JVM】JVM之执行引擎

文章目录前言名词解释机器码指令指令集汇编语言高级语言字节码虚拟机&物理机前端编译器&后端编译器JVM之执行引擎执行引擎是如何工作的&#xff1f;解释器即时编译器&#xff08;JIT&#xff09;分层编译策略虚拟机执行模式热点代码&探测方式1&#xff09;方法调用…

Android 屏蔽锁屏界面上的通知显示

一. 前言 [定制需求描述]:在插入SD后, 锁屏状态下&#xff0c; 去掉提示“SD卡可用于传输照片和媒体文件” 需求拆解: 要求正常显示在SystemUI下拉状态栏, 只需要屏蔽在锁屏状态下的通知. 二. 发送通知 首先来找找这个字符串"可用于传输照片和媒体文件" 是在/f…

buuctf_随便注

根据题目猜测这是一道SQL注入的题目输入一个单引号触发报错&#xff0c;根据报错信息得知闭合条件就是一对单引号继续构造表达式&#xff0c;得出一共包含两个回显位构造表达式求出当前数据库的名称&#xff0c;但是根据回显数据和实践来看&#xff0c;此题是对select进行了过滤…