【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

news2024/12/26 23:39:43

目录

  • 写在前面
  • 1. 环境配置
  • 2. 获取网页数据
  • 3. 解析网页数据
  • 4. 提取所需数据
    • 4.1 简单提取
    • 4.2 多级索引提取


写在前面

仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时,请确保遵守相关法律法规和网站的服务条款,尊重数据版权和用户隐私。同时,合理安排爬虫的访问频率,避免对目标网站造成不必要的负担。

1. 环境配置

安装Requests
直接通过pip安装即可:pip install requests

安装BeatifulSoup
直接通过pip安装即可:pip install beautifulsoup4
注意导入库时不能import beautifulsoup4,需要import bs4

2. 获取网页数据

import requests
from bs4 import BeautifulSoup
#res = requests.post('url')
res = requests.get('url')

nginx等web服务器不允许post访问静态资源。因此如果使用post访问页面也是报错,可以尝试使用get方式访问。

如果在使用requests.get()requests.post()访问https请求时出现了SSLError,即显示Can’t connect to HTTPS URL because the SSL module is not available.时,需要将下述两种文件从bin文件夹复制到DLLs文件夹下:

libcrypto-1_1-x64.*
libssl-1_1-x64.*
[Anaconda安装路径]\Library\bin -> [Anaconda安装路径]\DLLs

如果是anaconda虚拟环境,需要将文件拷贝到相应的环境DLLs文件夹下,例如:

[Anaconda安装路径]\envs\[虚拟环境名]\Library\bin -> [Anaconda安装路径]\envs\[虚拟环境名]\DLLs

3. 解析网页数据

BeautifulSoup 是一个 Python 库,用于从 HTML 或 XML 文件中提取数据。它可以将复杂的 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为四种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

以下是使用 BeautifulSoup 解析网页数据的代码:

import requests
from bs4 import BeautifulSoup
res = requests.get('url')
html = response.text
#利用BS库对网页进行解析,得到解析对象soup
soup = BeautifulSoup(html,'html.parser')

其中html.parser是Python 标准库中的内置解析器,不需要额外安装,但在某些情况下可能不如其他解析器强大或快速。以下是一些常用的第三方解析器:

  • lxml 解析器
    lxml 是一个第三方库,它提供了一个快速的 HTML 解析器。要使用 lxml 解析器,需要先安装 lxml 库。
    pip install lxml
    
    然后,在 BeautifulSoup 中使用它:
    soup = BeautifulSoup(html, 'lxml')
    
  • html5lib 解析器
    html5lib 是一个用于解析 HTML 的库,它根据 HTML5 标准来解析 HTML 文档。要使用 html5lib 解析器,您需要先安装 html5lib 库。
    pip install html5lib
    
    然后,在 BeautifulSoup 中使用它:
    soup = BeautifulSoup(html, 'html5lib')
    

在选择解析器时,lxml 通常是速度最快的选择。但是如果只需要解析基本的 HTML 文档,html.parser 可能就足够了。如果需要严格的 HTML5 解析,html5lib 是不错的选择,尽管它可能比其他解析器慢。

4. 提取所需数据

4.1 简单提取

得到目标网页的解析对象soup后,接下来将鼠标光标移动到所需的数据上,比如一个链接、一张图片或者一段文字。在鼠标定位到所需数据上之后,右键点击鼠标,会弹出一个上下文菜单。接下来在弹出的上下文菜单中选择“检查”(Chrome、Firefox、Edge等常用浏览器都有此选项),或者通过快捷键(Ctrl+Shift+I)直接打开。

最后需要定位HTML元素:点击“检查”后,浏览器会打开开发者工具,并自动选中与鼠标位置相对应的HTML元素。在这里,可以找到该数据在网页源代码中的位置和结构。

例如抓取下述图书的名称:

在这里插入图片描述得到:

在这里插入图片描述可以发现图书名称是在如下标签中的:

<span property="v:itemreviewed">景观社会</span>

因此可以设计如下代码查询:

book_title_tag = soup.find("span", property="v:itemreviewed")
book_title_tag = book_title_tag.contents[0]
if book_title_tag:
    book_title = book_title_tag.get_text()
    print('书名:', book_title)
else:
    print('未找到书名')

find方法只会返回第一个匹配的元素。如果你需要查找所有的匹配元素,可以使用find_all方法,它会返回一个包含所有匹配元素的列表ResultSet。

注意find_all()方法和find()函数返回的分别是ResultSet和一个Tag,访问ResultSet和Tag的内容需要使用下标:

.content[n]	

而访问列表元素的下一级元素同样使用.contents[n]来访问:

.content[n].contents[m]	

以下列举的是一些常用的提取方法:

  1. 通过标签名查找

        title = soup.find('title')
        print(title.text)  # 输出标签内的文本
    
  2. 通过属性查找

        link = soup.find('a', {'href': 'http://example.com'})
        print(link.text)
    
  3. 提取所有匹配的元素

    links = soup.find_all('a')
    for link in links:
        print(link.get('href'))
    
  4. 嵌套选择

    div = soup.find('div', {'class': 'some-class'})
    links = div.find_all('a')
    
  5. 提取标签内的文本

    p = soup.find('p')
    print(p.text)
    
  6. 提取属性

    img = soup.find('img')
    print(img.get('src'))
    
  7. 提取多个属性

    img = soup.find('img')
    attributes = img.attrs
    print(attributes['src'], attributes['alt'])
    
  8. 按类查找

    items = soup.find_all(class_='item')
    
  9. 按 ID 查找

    element = soup.find(id='some-id')
    
  10. 使用 CSS 选择器

    paragraphs = soup.select('p.some-class')
    for p in paragraphs:
        print(p.text)
    

4.2 多级索引提取

与上一节的简单提取方法不同,在BeautifulSoup中,多级索引是指通过多个层级的选择来定位特定的HTML元素。这通常涉及到使用不同的HTML标签和属性来逐步缩小搜索范围,直到找到需要的特定元素。

以下是一个使用BeautifulSoup进行多级索引的示例:

import requests
from bs4 import BeautifulSoup

url = 'http://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 假设要找的元素在一个id为'parent'的div内,然后是一个class为'child'的span内
parent_div = soup.find('div', id='parent')
if parent_div:
    child_span = parent_div.find('span', class_='child')
    if child_span:
        # 现在我们可以提取child_span中的文本或者执行其他操作
        text = child_span.get_text()
        print('找到的文本:', text)
    else:
        print('未找到class为child的span')
else:
    print('未找到id为parent的div')

首先通过find方法找到了idparentdiv元素,然后在这个div元素中继续使用find方法查找classchildspan元素。这种方法可以一直递归下去,直到找到所需要的特定元素。
此外,BeautifulSoup还支持CSS选择器,这使得多级索引更加直观。例如,如果你想要选择idparentdiv内所有classchildspan元素,可以使用如下选择器:

child_spans = soup.select('div#parent > span.child')

这将返回一个包含所有匹配span元素的列表。

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

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

相关文章

c调用python , 有参无参

文章目录 1. c语言调用python 的步骤1.1 包含头文件1.2 初始化Python解释器1.3 添加当前路径到sys.path 中1.4 导入要调用的模块1.5 获取函数对象1.5.1 检查函数对象是否可被调用 1.6 构造参数1.7 调用函数并获取返回值1.8 返回值解析1.9 释放引用的所有python对象1.10 关闭pyt…

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time 问题描述解决办法方式一方式二 小结 问题描述 在Android应用开发过程中&#xff0c;经常需要自定义控件&#xff0c;并且定义控件的属性&#xff0c;方便灵活的修改控件的显示样式&#xff0c;提…

【CLion】clion无法加载或找不到cmakekists文件

一、问题表象 最近工作中&#xff0c;在git pull远程仓库最新版本程序后&#xff0c;平时打开CLion自动加载的工程CMakeLists文件突然失效&#xff08;显示找不到可编译的文件&#xff09;&#xff0c;无法debug程序。 二、原因分析 基于平时的编码经验和之前git pull也出现…

李沐64_注意力机制——自学笔记

注意力机制 1.卷积、全连接和池化层都只考虑不随意线索 2.注意力机制则显示的考虑随意线索 &#xff08;1&#xff09;随意线索倍称之为查询(query) &#xff08;2&#xff09;每个输入是一个值value&#xff0c;和不随意线索key的对 &#xff08;3&#xff09;通过注意力池…

Oracle集群ORA-03113:end-of-file on communication channel

一、问题场景描述 今天Oracle集群要更新各数据库的数据&#xff0c;折腾的启动不了了&#xff1a; --》数据量比较大&#xff0c;数据泵方式导出的dmp文件 准备导入集群 --》由于之前的生产数据库数据比较少&#xff0c;需要增大表空间。 --》于是在sqlplus命令窗口&#xff0c…

ChatGPT4.0知识问答、DALL-E生成AI图片、Code Copilot辅助编程,打开新世界的大门

目录 1、DALL-E 文字转图片 在线AI修改2、Write For Me3、Code Copilot 目前最强的AI编程大模型4、Diagrams: Show Me5、Instant Website [Multipage] 网站合成神器6、AskYourPDF Research Assistant 无限PDF7、Diagrams & Data: Research, Analyze, Visualize 精读Excel …

kuramoto模型 - 简要介绍

Kuramoto模型源远流长&#xff0c;这里不会对它做过于理论方面的讲解&#xff0c;只是面向动力学重构的工作中&#xff0c;可能要用到Kuramoto模型的相关介绍。 假设读者了解的常微分方程基本概念&#xff0c;图论知识&#xff0c;了解邻接矩阵&#xff0c; 通过本文&#xf…

归并排序详解

目录 归并排序的核心思想&#xff1a; 递归实现&#xff1a; 非递归实现&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#xff1a; 应用场景&#xff1a; 本文全部以升序为例&#xff1a; 归并排序的核心思想&#xff1a; 先分解在合并&#xff1a; 1.归并的归&…

运算符重载(2)

1.赋值运算符重载 #include<iostream> using namespace std;class Person { friend void test01(); public:Person(int age){m_Age new int(age);}/*堆区的数据由程序员手动开辟并手动释放*/~Person(){if (m_Age ! NULL){delete m_Age;}}Person& operator(Person &a…

Python_AI库 Matplotlib的应用简例:绘制与保存折线图

本文默认读者已具备以下技能&#xff1a; 熟悉Python基础语法&#xff0c;以自行阅读python代码块熟悉Vscode或其它编辑工具的应用 在数据可视化领域&#xff0c;Matplotlib无疑是一个强大的工具。它允许我们创建各种静态、动态、交互式的可视化图形&#xff0c;帮助我们更好…

币圈资讯Cryptosquare论坛

在加密货币世界中&#xff0c;信息的及时获取对于投资者和交易者至关重要。今天&#xff0c;我将向大家介绍Cryptosquare这个综合性资讯论坛&#xff0c;它汇集了币圈新闻、空投信息、社会热点以及与Web3相关的工作信息。让我们一起解锁加密世界的种种可能性&#xff0c;探索Cr…

鹏哥C语言复习——字符函数与字符串函数

目录 一.字符函数 1.字符分类函数 2.字符转换函数 二.基础字符串函数 1.strlen函数 2.strcpy函数 3.strcat函数 4.strcmp函数 三.基础字符串函数优化 1.strncpy函数 2.strncat函数 3.strncmp函数 四.进阶字符串函数 1.strstr函数 2.strtok函数 3.strerror函数 一…

Eclipse 如何导入一个 Maven 项目

如果你的项目是 Maven 项目的话&#xff0c;导入的时候需要使用 Import&#xff0c;而不能使用打开项目的方式。 选择导入 选择导入 Maven 项目 然后选择 Maven 项目&#xff0c;开始导入。 选择目录后导入 然后选择你需要导入的目录后&#xff0c;单击导入。 Eclipse 如何导…

Llama-7b-Chinese本地推理

Llama-7b-Chinese 本地推理 基础环境信息&#xff08;wsl2安装Ubuntu22.04 miniconda&#xff09; 使用miniconda搭建环境 (base) :~$ conda create --name Llama-7b-Chinese python3.10 Channels:- defaults Platform: linux-64 Collecting package metadata (repodata.js…

【MySQL精炼宝库】数据库的约束 | 表的设计 | 聚合查询 | 联合查询

目录 一、数据库约束 1.1 约束类型&#xff1a; 1.2 案例演示&#xff1a; 二、表的设计 2.1 一对一: 2.2 一对多: 2.3 多对多: 2.4 内容小结&#xff1a; 三、新增 四、查询 4.1 聚合查询&#xff1a; 4.1.1 聚合函数&#xff1a; 4.1.2 GROUP BY子句&#xff1a…

nginx配置ip_hash负载均衡策略

一、nginx配置ip_hash负载均衡策略 nginx默认的负载均衡策略为轮询&#xff0c;某些场景需要使用ip_hash负载策略&#xff0c;即&#xff1a;同一个ip地址&#xff0c;永远访问nginx后面同一台tomcat。配置示例如下&#xff0c;主要是设置ip_hash&#xff1a; upstream www.ab…

B站美化插件,支持自定义,太酷辣~

大公司的软件和网站通常具有优雅的默认界面设计。 以国内二次元聚集地B站为例&#xff0c;可以说它的UI设计非常吸引人。与其他视频网站繁复的设计相比&#xff0c;B站的界面设计可以说是遥遥领先 然而&#xff0c;总有些人对默认的用户界面感到不满意&#xff0c;他们渴望尝试…

Arm功耗管理精讲与实战

安全之安全(security)博客目录导读 思考 1、为什么要功耗管理&#xff1f;SOC架构中功耗管理示例&#xff1f;功耗管理挑战&#xff1f; 2、从单核->多核->big.LITTLE->DynamIQ&#xff0c;功耗管理架构演进? 3、什么是电压域&#xff1f;什么是电源域&#xff1f…

C#上位机与S7-200Smart通信注意事项

S7-200SMART连接 问题描述 我们使用C#开发上位机和S7-200Smart系列PLC交互数据时&#xff0c;大多会用到Sharp7、Snap7之类的通信类库。有些通信类库默认的使用的是PG连接资源&#xff0c;而对于S7-200Smart来说&#xff0c;它的PG连接资源只有1个。 官网200smart提到的连接数…

smart200 做client,modbus_tcp读取modbus_slave

这里还隐藏一个重要的设置&#xff0c;就是站地址。这个在库函数里。不同plc位置会不一样&#xff0c;我这里是vb1651对应modbus的地址为255&#xff0c;这个值我们可以自己更改&#xff0c;范围为1-247. 打开modbus_slave 软件&#xff0c;