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

目录

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


写在前面

仅作个人学习与记录用。主要整理使用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元素的列表。

5. 常见问题

(1)网页中的中文内容在使用requests获取后,中文乱码无法识别:【解决方法】

持续更新

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git revert的使用

由于某种原因我们需要撤销掉之前某一次的修改&#xff0c;但是这个修改已经提交&#xff0c;并且后面又经历了好几轮的提交。可能如下这种情况&#xff1a; 那么此时使用git revert再合适不过啦。git revert ${commit_id}就可以将指定commit id的修改撤销&#xff0c;然后提交…

Java从菜鸟到高手①

目录 1.数据类型 2.定义变量 2.1.编码方式 2.2.布尔型变量boolean 2.3.隐式类型转化和强制类型转化 2.4类型提升 3.字符串类型 4.运算符 4.1.取余 4.2. &#xff0c;- 4.3逻辑运算&& || &#xff01; 4.4.位运算 4.5.条件运算符 1.数据类型 Java中&#…

Linux:使用匿名管道对进程池的模拟实现

目录 一、Makefile 二、processpool.cc 2.1创建通信管道和子进程 2.2控制子进程 2.3回收进程 三、task.hpp 四、完整代码 接下来我们将模拟实现一个进程池&#xff0c;进程池广泛应用与各个领域和方向&#xff0c;比如我们打开电脑后同时打开很多个进程&#xff08;也就是软…

SpringBoot对接前端传递的base64编码的图片信息,转成图片以Get请求进行浏览器文件下载,不下载到本地。

一、问题描述 1.1需求描述。 前端将浏览器展示的图片以base64编码的形式传递给后端&#xff0c;以此实现文件下载的功能&#xff0c;在浏览器弹出文件下载框。效果如下 1.2实现思路 将前端传递的base64进行解码&#xff0c;设置响应头返回响应体&#xff0c;代码如下。 pu…

如何安全的使用密码登录账号(在不知道密码的情况下)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具&#xff0c;进入账号密码模块&#xff0c;如图 2、看到鼠标移动到密码那一栏有提示&#xff0c;按住Ctrl或者Alt点击或者双击就能复制内容&…

【大前端】ECharts 绘制立体柱状图

立体柱状图分为&#xff1a; 纯色立体柱状图渐变立体柱状图 常用实现方式 纯色立体柱状图 纯色立体柱状图&#xff0c;使用MarkPoint和颜色渐变就实现&#xff0c;如下代码 import * as echarts from "echarts";var chartDom document.getElementById("main&…

Window(Qt/Vs)软件添加版本信息

Window&#xff08;Qt/Vs&#xff09;软件添加版本信息 文章目录 Window&#xff08;Qt/Vs&#xff09;软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

rust疑难杂症

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

环形链表的经典问题

环形链表 环形链表的介绍链表中是否带环返回链表开始入环的第一个节点 本文主要介绍如何判断一个链表是否是环形链表&#xff0c;以及如何得到环形链表中的第一个节点。 环形链表的介绍 环形链表是一种链表数据结构&#xff0c;环形链表是某个节点的next指针指向前面的节点或指…

【linux学习指南】linux 环境搭建

文章目录 &#x1f4dd;前言&#x1f320; 云服务器的选择&#x1f320;阿里云&#x1f320;腾讯云&#x1f320;华为云 &#x1f320;使用 XShell 远程登陆到 Linux&#x1f309;下载 XShell &#x1f320;查看 Linux 主机 ip&#x1f309; XShell 下的复制粘贴&#x1f309; …

大数据信用花了,一般多久能正常?

在当今数字化时代&#xff0c;大数据技术被广泛应用于各个领域&#xff0c;包括金融、电商、社交等。然而&#xff0c;随着大数据技术的普及&#xff0c;个人信用问题也日益凸显&#xff0c;其中“大数据信用花”现象尤为引人关注。那么&#xff0c;大数据信用花究竟是什么?一…

【linuxC语言】exec函数族

文章目录 前言一、exec函数族二、示例代码2.1 代码12.2 代码22.3 代码3 总结 前言 在Linux环境下&#xff0c;C语言提供了一组强大的函数族&#xff0c;即exec函数族&#xff0c;用于执行其他程序。这些函数允许程序在运行时加载并执行不同的程序&#xff0c;从而实现了程序之…

Android(Java)项目支持Kotlin语言开发

Android&#xff08;Java&#xff09;项目通过相关Kotlin设置后&#xff0c;允许同时使用Java语言和Kotlin语言进行开发代码的。 示例环境&#xff1a; Android Studio Giraffe | 2022.3.1 Patch 3 Java 8 Kotlin 1.9.20 设置Kotlin选项&#xff1a; 第一步&#xff1a;在项…

AI大模型探索之路-训练篇9:大语言模型Transformer库-Pipeline组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Sentinel 控制台学习

引言 上篇文章已经讲过 SpringCloud Sentinel集成到微服务项目中&#xff0c;接下来我们继续学习怎么使用sentinel控制台对微服务进行限流&#xff0c;熔断&#xff0c;降级等一系列操作。 控制台 接下来我们单独讲解每一个菜单按钮 实时监控 实时监控&#xff1a; 可以看到…

必应广告投放怎么做?怎么开户推广?

今天搜索引擎广告依旧是企业提升品牌知名度、吸引潜在客户的关键渠道之一&#xff0c;必应Bing&#xff0c;作为全球第二大搜索引擎&#xff0c;不仅拥有庞大的用户基础&#xff0c;更以其精准的定向能力和高效的转化效率&#xff0c;成为众多企业拓展市场的优选平台。 一、必…

【Java探索之旅】包管理精粹 Java中包的概念与实践

文章目录 &#x1f4d1;前言一、封装1.1 封装的概念1.2 访问限定修饰符 二、封装扩展&#xff08;包&#xff09;2.1 包的概念2.2 带入包中的类2.3 自定义包2.4 常见的包 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;封装是面向对象编程的核心概念之一…

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…

【R语言数据分析】数据类型与数据结构

R的数据类型有数值型num&#xff0c;字符型chr&#xff0c;逻辑型logi等等。 R最常处理的数据结构是&#xff1a;向量&#xff0c;数据框&#xff0c;矩阵&#xff0c;列表。 向量有数值型向量&#xff0c;字符型向量&#xff0c;逻辑型向量等&#xff0c;字符型向量就是反应…

二维码门楼牌管理应用平台建设:实现用户权限的高效管理

文章目录 前言一、用户权限管理的重要性二、用户管理中心的构建三、用户权限管理的实施策略四、用户权限管理的挑战与应对五、结语 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台已成为城市管理的重要组成部分。本文将深入探讨如何通过用户权限管理&#…