爬虫数据解析

news2024/11/14 15:29:36

## 数据解析

聚焦爬虫

爬取页面中指定的页面内容

  • 编码流程
    1. 指定url
    2. 发起请求
    3. 获取响应数据
    4. 数据解析
    5. 持久化存储

数据解析分类

  • 正则
  • bs4
  • xpath(***)

数据解析原理概述

  • 解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
  • 进行指定标签的定位
  • 标签或者标签对应的属性中存储的数据值进行提取(解析)

数据解析——正则表达式

常用正则表达式
限定符
  • ?表示前面的字母出现0次或者1次

    例如:used? :可以用来匹配use和used

  • ❤ 匹配0个或者多个字符

    例如:ab*c :表示b可以没有也可以出现多次

  • 加号 匹配1个及以上

    例如:ab+c :表示b出现1次或者1次以上

  • {} 表示字符出现的次数

    例如:ab{6}c :表示b出现6次

    ​ ab{2,6}c :表示b出现2-6次

    ​ ab{2,}c :表示b出现2次以上

“或”运算
  • | :或运算

    例如:a(cat|dog)

字符类
  • [] 匹配集合中任意一个字符

    例如:[a-z] :表示匹配所有的小写字母

元字符
  • \d :数字字符
  • \w :单词字符(英文字符、数字、下划线)
  • \s :空白符(包含tab和换行符)
  • \D :非数字字符
  • \W :非单词字符
  • \S :非空白符
  • . :代表任意字符但不包括换行符
  • ^ :匹配行首
  • $ :匹配行尾
贪婪与懒惰匹配

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

爬取pinterest中的指定图片

import requests
url='https://wwd.com/wp-content/uploads/2024/08/Fall-Trends-Report-Newsroom-Header-1.jpg?w=1000&h=563&crop=1&resize=681%2C383'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}
#content返回的是二进制形式的图片数据
#text(字符串) content(二进制) json(对象)
img_data=requests.get(url=url,headers=headers).content
with open('./qiutu.jpg', 'wb') as f:
    f.write(img_data)
print('over')

数据解析——bs4解析

  • bs4数据解析的原理:

    (1)实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中

    (2)通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取

  • 环境安装:

    (1)pip install bs4

    (2) pip install lxml

  • 如何实例化BeaytifulSoup对象

    (1)from bs4 import BeautifulSoup

    (2)对象的实例化:

    • 将本地的html文档中的数据加载到该对象中

      fp=open('./sogou.html','r',encoding='utf-8')
      soup=BeautifulSoup(fp,'lxml')
      

    • 将互联网上获取的页面源码加载到该对象中

      page_text=response.text
      soup=BeautifulSoup(page_text,'lxml)
      

    (3) 提供的用于数据解析的方法和属性

    • soup.tagName 例如:soup.a soup.div 返回的是html中第一次出现的标签内容

    • soup.find():

      (a) find(‘tagName’):等同于soup.div

      (b)属性定位:soup.find(‘div’,class_/id/attr=‘song’)

    • soup.find_all(‘tagName’):返回符合要求的所有标签(列表)

    • soup.select():

      (a) select(‘某种选择器(id,class,标签……选择器)’),返回的是一个列表。

      (b)层级选择器:

      • soup.select(‘.tang>ul>li>a’): >表示的是一个层级
      • soup.select(‘.tang>ul a’): 空格表示的是多个层级
    • 获取标签之间的文本数据:soup.a.text/string/get_text()

      注:text 和get_text()可以获取这个标签下的所有的文本内容 ;string只能获取该标签下面直系的文本。

    • 获取标签中的属性值:soup.a[‘href’]

bs4实战需求:爬取三国演义小说所有的章节标题和章节内容

import requests
from bs4 import BeautifulSoup
#对首页的页面数据进行爬取
url='https://www.shicimingju.com/book/sanguoyanyi.html'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}
page_text=requests.get(url=url,headers=headers).content.decode('utf-8')

#在首页中解析出章节的标题和详情页的url
#1.实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中
soup=BeautifulSoup(page_text,'lxml')
#解析章节标题和详情页的url
li_list=soup.select('.book-mulu > ul > li')
fp=open('./sanguo.txt','w',encoding='utf-8')
for li in li_list:
    title=li.a.string
    detail_url='https://www.shicimingju.com'+li.a['href']
    #对详情页发起请求,解析出章节内容
    detail_page_text=requests.get(url=detail_url,headers=headers).content.decode('utf-8')
    #解析出详情页中相关的章节内容
    detail_soup=BeautifulSoup(detail_page_text,'lxml')
    div_tag=detail_soup.find('div',class_='chapter_content')
    #解析到了章节的内容
    content=div_tag.text
    fp.write(title+content+'\n')
    print(title,'爬取成功')


数据解析——xpath解析

最常用且最便捷高效的一种解析方式。通用性最强的解析方式。

  • xpath解析原理

    (1)实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中

    (2)调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获

  • 环境的安装

    (1) pip install lxml

  • 如何实例化一个etree对象:from lxml import etree

    (1)将本地的html文档中的源码数据加载到etree对象中:etree.parse(filePath)

    (2)可以将从互联网上获取的页面源码数据加载到该对象中:etree.HTML(‘page_text’)

    (3)xpath(‘xpath表达式’)

    • / 表示的是从根节点开始定位。表示的是一个层级
    • // 表示的是多个层级。可以表示从任意位置开始定位
    • 属性定位://div[@class=‘song’] tag[@attrName=“attrValue”]
    • 索引定位://div[@class=‘song’]/p[3] 索引是从1开始的
    • 取文本:
      • /text() 获取的是标签中直系的文本内容
      • //text() 标签中非直系的文本内容(所有的文本内容)
    • 取属性:
      • /@attrName ==>img/src
        xml import etree

    (1)将本地的html文档中的源码数据加载到etree对象中:etree.parse(filePath)

    (2)可以将从互联网上获取的页面源码数据加载到该对象中:etree.HTML(‘page_text’)

    (3)xpath(‘xpath表达式’)

    • / 表示的是从根节点开始定位。表示的是一个层级
    • // 表示的是多个层级。可以表示从任意位置开始定位
    • 属性定位://div[@class=‘song’] tag[@attrName=“attrValue”]
    • 索引定位://div[@class=‘song’]/p[3] 索引是从1开始的
    • 取文本:
      • /text() 获取的是标签中直系的文本内容
      • //text() 标签中非直系的文本内容(所有的文本内容)
    • 取属性:
      • /@attrName ==>img/src

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

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

相关文章

最小生成树的两种算法模板

第一种模板&#xff1a; 思路&#xff1a;对于prime算法来说其实与朴素的dij算法差不多&#xff0c;都是找到最近的点然后更新其他的点 模板&#xff1a; #include<bits/stdc.h>using namespace std;const int N 100010;int n; int g[110][110]; int dis[110]; int st…

VMware Workstation 17.6 Pro 发布下载,新增功能概览

VMware Workstation 17.6 Pro 发布下载&#xff0c;新增功能概览 VMware Workstation 17.6 Pro for Windows & Linux - 领先的免费桌面虚拟化软件 基于 x86 的 Windows、Linux 桌面虚拟化软件 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-workstation-17/…

Linux日志-wtmp日志

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

B端系统门门清之:QMS-质量管理,泰山之重。

质量重于泰山&#xff0c;QMS&#xff08;质量管理系统&#xff09;在生产企业的经营中非常重要&#xff0c;质量的积累可以成就一个企业&#xff0c;想要毁掉一个企业&#xff0c;也是瞬间的事情&#xff0c;本文就和大家重点分享一下QMS系统。 一、什么是QMS系统&#xff0c…

SpringCloud开发实战(二):通过RestTemplate实现远程调用

目录 SpringCloud开发实战&#xff08;一&#xff09;&#xff1a;搭建SpringCloud框架 RestTemplate介绍 RestTemplate 是 Spring 框架中的一个类&#xff0c;它用于促进 HTTP 请求的发送和接收&#xff0c;并且简化了与 RESTful 服务的交互。RestTemplate 提供了许多便利的方…

C++ 学习 2024.9.3

封装栈与队列 栈: #include <iostream>using namespace std;class Stack { private:int *a; //动态数组存储元素int size; //栈容量int top; //栈顶元素索引 public://有参构造Stack(int size):size(size),top(-1){anew int[size];}//析构~Stack(){delete[]a…

八月二十九日(day 39)docker6

1.前端&#xff08;nginx&#xff09; [rootlocalhost ~]# docker pull nginx //拉取nginx镜像 [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 5ef79149e0ec 2 we…

【Godot4.3】基于纯绘图函数自定义的线框图控件

概述 同样是来自2023年7月份的一项实验性工作&#xff0c;基于纯绘图函数扩展的一套线框图控件。初期只实现了三个组件&#xff0c;矩形、占位框和垂直滚动条。 本文中的三个控件类已经经过了继承化的修改&#xff0c;使得代码更少。它们的继承关系如下&#xff1a; 源代码 W…

抽象和接口

a.抽象&#xff08;abstract&#xff09; 1. 定义 a. 抽象类&#xff1a;在普通类里增加了抽象方法。 b. 抽象方法&#xff1a;没有具体的执行方法&#xff0c;没有方法体的方法。 2. 总结 a. 因为抽象方法没有方法体&#xff0c;无法执行&#xff0c;所以不能…

WEB服务与虚拟主机/IIS中间件部署

WWW&#xff08;庞大的信息系统&#xff09;是基于客户机/服务器⽅式的信息发现技术和超⽂本技术的综合。网页浏览器//网页服务器 WWW的构建基于三项核⼼技术&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;⽤于在Web服务器和客户端之间传输数据。HTML&#xff1a;⽤…

xml转txt,适应各种图片格式,如jpg,png,jpeg,PNG,JPEG等

xml转txt&#xff0c;适应各种图片格式&#xff0c;如jpg&#xff0c;png&#xff0c;jpeg&#xff0c;PNG&#xff0c;JPEG等 import xml.etree.ElementTree as ET import os import cv2 import numpy as np import globclasses []def convert(size, box):dw 1. / (size[0]…

力扣面试150 旋转链表 闭链成环

Problem: 61. 旋转链表 &#x1f468;‍&#x1f3eb; 力扣官解 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode nex…

一小时教你学会C语言系统!C语言实战教程-学生信息管理系统源码

本次教程带大家做一个C语言学生信息管理系统&#xff0c;带教程视频 C语言实战教程-XX管理系统 期末C语言课设不会做&#xff1f; 想学习一下怎么用C语言做出一个完整的系统&#xff1f;完整的步骤是怎么样的&#xff1f; 本教程就教你怎么从0搭建一个系统并且完美运行起来…

Python基础语法(多进程开发进程建数据共享进程锁进程池)

Python基础语法文章导航&#xff1a; Python基础&#xff08;01初识数据类型&变量&#xff09;Python基础&#xff08;02条件&循环语句&#xff09;Python基础&#xff08;03字符串格式化&运算符&进制&编码&#xff09;Python基础&#xff08;04 基础练习…

93.游戏的启动与多开-进程枚举多开检测

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;92.游戏的启动与多开-多开检测概述 枚举多开检测在事前检测用的很少&#xff0c;在事中…

Https配置免费SSL证书

本文目录 前言一、前提1.1 服务器1.2 域名 二、Certbot简介2.1 Apache服务器2.2 Nginx服务器 三、自动更新证书四、效果 前言 HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的…

【重学 MySQL】二、MySQL 介绍

【重学 MySQL】二、MySQL 介绍 MySQL 概述MySQL 的主要特点MySQL 的应用场景结论 MySQL 发展史初始创建与发布开源与快速成长重要版本发布收购与变革分支与竞争持续发展与现代应用 关于 MySQL8.0主要新特性和改进兼容性和迁移应用场景总结 为什么选择 MySQLOracle VS MySQL基本…

【Elasticsearch】Elasticsearch集群在分布式环境下的管理

文章目录 &#x1f4d1;前言一、集群规划与设计1.1 集群拓扑结构设计1.2 节点角色分配1.3 分片与副本配置 二、集群管理与运维2.1 集群监控2.2 故障处理2.3 性能优化 三、扩展与升级3.1 集群扩展3.2 集群升级3.3 灾备与容灾 &#x1f324;️总结 &#x1f4d1;前言 Elasticsear…

【重构获得模式 Refactoring to Patterns】

重构获得模式 Refactoring to Patterns 面向对象设计模式是“好的面向对象设计”&#xff0c;所谓“好的面向对象设计”指的是那些可以满足“应对变化&#xff0c;提高复用”的设计。 现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点&#xff0c;然后…

2024.9.3 作业

自己封装 栈和队列 #include <iostream>using namespace std;class mystack { private:int *data;int size;int top; public://无参构造mystack():size(10){data new int[size];top -1;size 10;}//有参构造mystack(int s){data new int[s];top -1;size s;}//赋值my…