爬虫之数据解析

何为数据解析
  • 概念:就是将爬取到数据中局部的指定的数据进行提取
  • 作用:实现聚焦爬虫
  • 数据解析通用原理:
    • html是用来展示数据,html中展示的数据正是我们要爬取或者采集的数据
    • 数据解析的通用原理:
      • 标签定位
      • 提取标签中存储的数据
  • 聚焦爬虫编码流程
    • 指定url
    • 发起请求
    • 获取响应数据
    • 数据解析
    • 持久化存储
图片的获取
  • 如何爬取多媒体资源(图片,音频等)
方式1:
import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36X-Requested-With: XMLHttpRequest'
}
# 获取图片地址:通常为img标签的src属性值
img_src = 'https://pic.netbian.com/uploads/allimg/231102/092518-169888831897c3.jpg'
# 对图片发起请求
response = requests.get(url=img_src, headers=headers)
# 获取图片数据:content返回的是二进制形式的响应数据
img_data = response.content
# 持久化存储
with open('./demo.jpg', 'wb') as fp:fp.write(img_data)
方式2:
- ```pythonfrom urllib import requestimg_src = 'https://pic.netbian.com/uploads/allimg/231102/092518-169888831897c3.jpg'#urlretrieve可以直接对图片发起请求,且将请求到的图片数据进行持久化存储request.urlretrieve(img_src,'./456.jpg')```
bs4
  • 环境安装:pip install bs4

  • bs4数据解析的流程

    • 1.实例化一个BeautifulSoup的对象,然后把即将被解析的页面源码数据加载到该对象中
      • BeautifulSoup(fp,‘lxml’):fp表示本地的一个文件,该种方式是将本地存储的html文件进行数据解析
      • BeautifulSoup(page_text,‘lxml’):page_text是网络请求到的页面源码数据,该种方式是直接将网络请求到的页面源码数据进行数据解析
    • 2.调用BeautifulSoup对象中相关的属性和方法实现标签定位和数据提取
  • 具体解析的操作:

    • 在当前目录下新建一个test.html文件,然后将下述内容拷贝到该文件中

      • <html lang="en">
        <head><meta charset="UTF-8" /><title>测试bs4</title>
        </head>
        <body><div><p>百里守约</p></div><div class="song"><p>李清照</p><p>王安石</p><p>苏轼</p><p>柳宗元</p><a href="http://www.song.com/" title="赵匡胤" target="_self"><span>this is span</span>宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a><a href="" class="du">总为浮云能蔽日,长安不见使人愁</a><img src="http://www.baidu.com/meinv.jpg" alt="" /></div><div class="tang"><ul><li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li><li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li><li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li><li><a href="http://www.sina.com" class="du">杜甫</a></li><li><a href="http://www.dudu.com" class="du">杜牧</a></li><li><b>杜小月</b></li><li><i>度蜜月</i></li><li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li></ul></div>
        </body>
        </html>
        
    • 有了test.html文件后,在练习如下操作

     from bs4 import BeautifulSoup#fp就表示本地存储的一个html文件fp = open('./test.html','r',encoding='utf-8')#解析本地存储的html文件中的内容#实例化BeautifulSoup对象,然后把即将被解析的页面源码数据加载到了该对象中soup = BeautifulSoup(fp,'lxml') #参数2,lxml是固定形式,表示指定的解析器#标签定位#方式1:soup.tagName,只会定位到符合条件的第一个标签tag1 = soup.title #定位到了title标签tag2 = soup.div#方式2:属性定位,find函数,findall函数#find('tagName',attrName='attrValue'):find只会定位到满足要的第一个标签tag3 = soup.find('div',class_='song')#定位class属性值为song的div标签tag4 = soup.find('a',id='feng')#定位id属性值为feng的a标签#findAll('tagName',attrName='attrValue'):可以定位到满足要求的所有标签tag5 = soup.findAll('div',class_='song')#方式3:选择器定位:soup.select('选择器')#id选择器:#feng  ----id为feng#class选择器:.song ----class为song#层级选择器:大于号表示一个层级,空格表示多个层级tag6 = soup.select('#feng') #定位到所有id属性值为feng的标签tag7 = soup.select('.song')#定位到所有class属性值为song的标签tag8 = soup.select('.tang > ul > li') #定位到了class为tang下面的ul下面所有的li标签tag9 = soup.select('.tang li')#提取标签中的内容#1.提取标签中间的内容:#tag.string:只可以提取到标签中直系的文本内容#tag.text:可以提取到标签中所有的文本内容# p_tag = soup.p# print(p_tag.string)# print(p_tag.text)# div_tag = soup.find('div',class_='song')# print(div_tag.text)#2.提取标签的属性值#tag['attrName']img_tag = soup.imgprint(img_tag['src']) #提取img标签的src的属性值
bs4案例应用:小说批量爬取
  • url:https://www.shicimingju.com/book/sanguoyanyi.html

  • 需求:将每一个章节的标题和内容进行爬取然后存储到一个文件中

    • 步骤:
      • 1.请求主页的页面源码数据
      • 2.数据解析:
        • 章节标题
        • 章节详情页的链接
      • 3.解析章节详细内容
      • 4.将解析的章节标题和内容进行存储
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
# 首页地址
main_url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
# 发起请求,获取了主页页面源码
response = requests.get(url=main_url, headers=headers)
response.encoding = 'utf-8'
# response.encoding = 'gbk'
page_text = response.text
# print(page_text)
# 或者使用获得的进行解码
# print(response.content.decode(response.encoding))# 数据解析:章节标题+详情页链接
soup = BeautifulSoup(page_text, 'lxml')
a_list = soup.select('.book-mulu > ul > li > a')
fp = open('./sanguo.txt', 'w', encoding='utf-8')
#encode 是编码
# decode是解码
for a in a_list:title = a.string  # 章节标题detail_url = 'https://www.shicimingju.com' + a['href']  # 详情页地址# 请求详情页的页面源码数据response = requests.get(url=detail_url, headers=headers)response.encoding = 'utf-8'detail_page_text = response.text# 解析:解析章节内容d_soup = BeautifulSoup(detail_page_text, 'lxml')div_tag = d_soup.find('div', class_='chapter_content')content = div_tag.text  # 章节内容fp.write(title + ':' + content + '\n')print(title, '爬取保存成功!')
fp.close()
Xpath
  • 环境安装:pip install lxml

  • xpath解析的编码流程

    • 1.创建一个etree类型的对象,然后把即将被解析的页面源码数据加载到该对象中
    • 2.调用etree对象的xpath方法结合着不同形式的xpath表达式,进行标签定位和数据提取
  • xpath表达式如何理解?

    • html中的标签是遵从树状结构的。
    from lxml import etree #如果这种方式报错,使用下面方式导入etree# from lxml.html import etreefp = open('test.html','r')#1.将本地存储好的文件中的数据加载到etree对象中进行数据解析tree = etree.parse(fp)#2.调用etree对象的xpath方法结合不同形式的xpath表达式进行标签定位和数据提取#xpath返回的一定是列表,列表中存储的是定位到的标签对象# title_tag = tree.xpath('/html/head/title')# title_tag = tree.xpath('/html//title')# title_tag = tree.xpath('//head/title')# title_tag = tree.xpath('//title') #推荐#最左侧为/:表示必须从树的根标签(html标签)开始进行定位#最左侧为//:可以从任意位置进行标签的相对位置定位#非最左侧的/:表示一个层级#非最左侧的//:表示多个层级# tag = tree.xpath('//div') #定位所有的div标签#属性定位:根据标签的属性定位标签#//tagName[@attrName="attrValue"]# tag = tree.xpath('//div[@class="song"]')#定位class属性值为song的div标签# tag = tree.xpath('//a[@id="feng"]')# tag = tree.xpath('//div[@class="tang"]/ul/li/a[@id="feng"]')#索引定位:索引是从1开始的# tag = tree.xpath('//div[@class="tang"]/ul/li[3]')#定位到第三个li标签#获取定位到标签中的文本内容# /text()获取标签中直系的文本内容:返回的列表中只会有一个列表元素# //text()获取标签中所有的文本内容:通常返回列表中存在多个元素# tag = tree.xpath('//div[@class="song"]/p[3]/text()')# tag = tree.xpath('//div[@class="song"]//text()')#获取定位到标签中的属性值://tag/@attrNametag = tree.xpath('//img/@src')print(tag)
Xpath案例应用:
  • http://pic.netbian.com/4kmeinv/

    • 将爬取到的图片存储到指定的文件夹中

    • 爬取第一页

from lxml import etree
import requests
from fake_useragent import UserAgentua = UserAgent()
import os# 新建一个文件夹
dirName = 'girls'
if not os.path.exists(dirName):  # 如果文件夹不存在,则新建,否则不新建os.mkdir(dirName)
headers = {'User-Agent': ua.chrome}url = 'https://pic.netbian.com/4kmeinv/index.html'
response = requests.get(url=url, headers=headers)
response.encoding = 'gbk'page_text = response.text
# response.encoding='gbk'
# print(page_text) # ISO-8859-1
# 数据解析:图片地址+图片名称
tree = etree.HTML(page_text)  # HTML()专门用来解析网络请求到的页面源码数据
# 该列表中存储的是每一个li标签
li_list = tree.xpath('//div[@class="slist"]/ul/li')
for li in li_list:# 局部解析:将li标签中指定的内容解析出来# 使用 . 调用当前标签 凭借# 每一次都是 获得列表img_title = li.xpath('./a/b/text()')[0] + '.jpg'  # 左侧./表示xpath的调用者对应的标签img_src = 'https://pic.netbian.com' + li.xpath('./a/img/@src')[0]print(img_title, img_src)# 对图片发起请求,存储图片数据img_data = requests.get(url=img_src, headers=headers).content# girls/123.jpgimg_path = dirName + '/' + img_titleprint(img_path)# with open(img_path, 'wb') as fp:#     fp.write(img_data)# print(img_title, '下载保存成功!')

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

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

相关文章

Please No More Sigma(构造矩阵)

Please No More Sigma 给f(n)定义如下&#xff1a; f(n)1 n1,2; f(n)f(n-1)f(n-2) n>2; 给定n&#xff0c;求下式模1e97后的值 Input 第一行一个数字T&#xff0c;表示样例数 以下有T行&#xff0c;每行一个数&#xff0c;表示n。 保证T<100&#xff0c;n<100000…

使用Filter实现登录验证

1、什么是Filter Filter可认为是Servlet的一种特殊用法&#xff0c;主要是对用户发起的请求进行预处理或后处理&#xff0c;意思就是在请求到达用户想请求的地址之前先进入Filter&#xff0c;或者在离开用户请求之后进入Filter。Filter类似于门卫&#xff0c;你在进入之前门卫…

51单片机入门

一、单片机以及开发板介绍 写在前面&#xff1a;本文为作者自学笔记&#xff0c;课程为哔哩哔哩江协科技51单片机入门教程&#xff0c;感兴趣可以看看&#xff0c;适合普中A2开发板或者HC6800-ESV2.0江协科技课程所用开发板。 工具安装请另行搜索&#xff0c;这里不做介绍&…

数值分析算法(简介)

数值分析是研究使用数值计算方法解决数学问题的领域。当在比赛中使用高级语言进行编程时&#xff0c;可以编写相应的库函数来实现数值分析中常用的算法&#xff0c;如方程组求解、矩阵运算和函数积分等算法。下面我将介绍一些常用的数值分析算法以及可能需要编写的库函数。 方…

CompareM-平均氨基酸一致性(AAI)计算

文章目录 Comparem简介比较基因组统计基因组使用模式其他 安装使用基于基因组计算氨基酸一致性基于基因组蛋白计算氨基酸一致性 结果转变成矩阵参考 Comparem简介 CompareM 是一个支持进行大规模基因组比较分析的软件工具包。它提供跨基因组&#xff08;如氨基酸一致性&#x…

《未来之路:技术探索与梦想的追逐》

创作纪念日 日期&#xff1a;2023年07月05日文章标题&#xff1a;《从零开始-与大语言模型对话学技术-gradio篇&#xff08;1&#xff09;》成为创作者第128天 在这个平凡的一天&#xff0c;我撰写了自己的第一篇技术博客&#xff0c;题为《从零开始-与大语言模型对话学技术-…

阅读是一座随身携带的避难所:毛姆读书随笔

>> 我想要指明的第一件事就是阅读应当是享受的。当然&#xff0c;为了应对考试或学习知识&#xff0c;我们需要阅读许多书&#xff0c;这类阅读中是不存在什么享受的。我们只是为了获得知识而进行阅读。唯一能做的便是祈祷因为我们需要它&#xff0c;所以我们不至于在通读…

深度学习的集体智慧:最新发展综述

一、说明 我们调查了来自复杂系统的想法&#xff0c;如群体智能、自组织和紧急行为&#xff0c;这些想法在机器学习中越来越受欢迎。人工神经网络正在影响我们的日常生活&#xff0c;从执行预测性任务&#xff08;如推荐、面部识别和对象分类&#xff09;到生成任务&#xff08…

RT-DETR算法改进:更换损失函数DIoU损失函数,提升RT-DETR检测精度

💡本篇内容:RT-DETR算法改进:更换损失函数DIoU损失函数 💡本博客 改进源代码改进 适用于 RT-DETR目标检测算法(ultralytics项目版本) 按步骤操作运行改进后的代码即可🚀🚀🚀 💡改进 RT-DETR 目标检测算法专属 文章目录 一、DIoU理论部分 + 最新 RT-DETR算法…

从0到0.01入门React | 008.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

深度学习/pytoch/pycharm学习过程中遇到的问题

1.在pycharm中打断点后&#xff0c;debug无反应&#xff0c;直到程序退出。 解决&#xff1a;将项目目录中的.idea文件夹删除&#xff0c;重启pycharm可解决 2.plt.imshow(img),plt.show()不显示图片。 解决&#xff1a;import matplotlib&#xff0c;matplotlib.use(TkAgg)…

自动计算零售数据分析指标?BI软件表示可行

随着BI技术的飞速发展&#xff0c;借助系统来计算分析指标也不是什么难事&#xff0c;即便是面对组合多变的零售数据分析指标&#xff0c;奥威BI软件也依旧可以又快又精准地完成指标计算。 BI软件可以自动计算零售数据分析指标&#xff0c;如销售额、库存量、订单量等。在计算…

JavaWeb篇_07——Tomcat组件介绍

Tomcat组件 Server组件 启动一个server实例&#xff08;即一个JVM进程&#xff09;&#xff0c;它监听在8005端口以接收shutdown命令。Server的定义不能使用同一个端口&#xff0c;这意味着如果在同一个物理机上启动了多个Server实例&#xff0c;必须配置它们使用不同的端口。…

[工业自动化-11]:西门子S7-15xxx编程 - PLC从站 - 分布式IO从站/从机

目录 一、什么是以分布式IO从站/从机 二、分布式IO从站的意义 三、ET200分布式从站系列 一、什么是以分布式IO从站/从机 在工业自动化领域中&#xff0c;分布式 IO 系统是目前应用最为广泛的一种 I/O 系统&#xff0c;其中分布式 IO 从站是一个重要的组成部分。 分布式 IO …

问答推广怎么做?问答口碑营销的优势有哪些?

互联网问答平台上线以来&#xff0c;问答口碑营销一直是企业进行网络营销推广不可缺少的一种方式&#xff0c;那么&#xff0c;什么是问答营销推广呢&#xff1f;如何开展问答营销推广&#xff1f;问答营销有哪些优势呢&#xff1f;小马识途营销顾问在本文分析一下。 什么是问答…

Redis系列-四种部署方式-单机部署+主从模式+哨兵模式【7】

目录 Redis系列-四种部署方式-单机部署主从模式【7】redis-四种部署模式单机模式主从模式数据同步的方式全量数据同步增量数据同步 Redis哨兵模式总结缺点&#xff1a;哨兵模式应用sentinel.conf配置项 REF 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持…

移动医疗科技:开发互联网医院系统源码

在这个数字化时代&#xff0c;互联网医院系统成为了提供便捷、高效医疗服务的重要手段。本文将介绍利用移动医疗科技开发互联网医院系统的源码&#xff0c;为医疗行业的数字化转型提供有力支持。 智慧医疗、互联网医院这一类平台可以通过线上的形式进行部分医疗服务&#xff…

59基于matlab的爬行动物搜索算法(Reptile search algorithm, RSA)

基于matlab的爬行动物搜索算法&#xff08;Reptile search algorithm, RSA&#xff09;一种新型智能优化算法。该算法主要模拟鳄鱼的捕食行为&#xff0c;来实现寻优求解&#xff0c;具有收敛速度快&#xff0c;寻优能力强的特点。程序已调通&#xff0c;可直接运行。 59matlab…

云原生微服务架构及实现技术

云原生是一种技术理念和架构方法&#xff0c;它充分利用云计算的优势&#xff0c;将应用程序和基础设施进行优化&#xff0c;以适应云环境的特性。云原生的设计原则主要包括弹性、韧性、安全性、可观测性、灰度等&#xff0c;旨在让企业在云环境中实现轻量、敏捷、高度自动化的…

从0开始python学习-33.夹具@pytest.fixture(scope=““,params=““,autouse=““,ids=““,name=““)

目录 1. 创建夹具 1.1 pytest方式 1.2 unittest方式 2. 使用夹具 2.1 通过参数引用 2.2 通过函数引用 3. 参数详解 3.1 scope&#xff1a;作用域 3.2 params-参数化 3.3 autouseTrue表示自动使用&#xff0c;默认为False 3.4 ids&#xff1a;设置变量名 3.5 name&am…