当前位置: 首页 > news >正文

【爬虫】requests 结合 BeautifulSoup抓取网页数据

一、BeautifulSoup使用步骤

BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库。以下是如何使用 BeautifulSoup 来解析 HTML 并提取信息的基本步骤:

1、安装

如果你还没有安装 BeautifulSoup,你可以使用 pip 来安装它。BeautifulSoup 通常与 lxmlhtml.parser 这样的解析器一起使用,但 lxml 通常提供更快的解析和更全面的功能。

pip install beautifulsoup4 lxml

2、导入库

在你的 Python 脚本中,你需要导入 BeautifulSoup 和一个解析器。

from bs4 import BeautifulSoup
import requests

注意:这里我也导入了 requests 库,它用于从网络获取 HTML 内容。如果你已经有了 HTML 内容,你可以直接用它来创建 BeautifulSoup 对象。
3、获取 HTML 内容

使用 requests 库从网页获取 HTML 内容。

url = 'http://example.com'
response = requests.get(url)
response.raise_for_status()  # 如果请求失败,这会抛出一个异常
html_content = response.text

4、解析 HTML

使用 BeautifulSoup 和解析器来解析 HTML 内容。

soup = BeautifulSoup(html_content, 'lxml')

5、提取数据

使用 BeautifulSoup 的各种方法和选择器来提取你感兴趣的数据。例如,使用 .find().find_all() 方法来查找标签,并使用 .get_text() 方法来获取标签内的文本。

# 查找所有的段落标签 <p>
paragraphs = soup.find_all('p')# 打印每个段落的文本内容
for paragraph in paragraphs:print(paragraph.get_text())# 查找具有特定类名的标签
divs_with_class = soup.find_all('div', class_='some-class')# 使用 CSS 选择器查找元素
links = soup.select('a[href]')  # 查找所有带有 href 属性的 <a> 标签

6、处理属性

你也可以获取和处理 HTML 标签的属性。例如,要获取一个链接的 href 属性,你可以这样做:

for link in soup.find_all('a'):print(link.get('href'))

7、清理和关闭

在处理完 HTML 后,你可能想要关闭任何打开的文件或连接(尽管在使用 requestsBeautifulSoup 时通常不需要手动关闭它们)。但是,如果你的脚本涉及其他资源,请确保正确关闭它们。

8、注意事项

  • 尊重网站的 robots.txt 文件和版权规定。
  • 不要过度请求网站,以免对其造成负担。
  • 考虑使用异步请求或线程/进程池来加速多个请求的处理。
  • 使用错误处理和重试逻辑来处理网络请求中的常见问题。

二、示例1:抓取百度百科数据

1)抓取百度百科《青春有你第三季》数据

抓取链接是:https://baike.baidu.com/item/青春有你第三季?fromModule=lemma_search-box#4-3

import json
from bs4 import BeautifulSoup
import requestsheaders = {"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","cache-control": "max-age=0"
}def getAllUsers():url = "https://baike.baidu.com/item/%E9%9D%92%E6%98%A5%E6%9C%89%E4%BD%A0%E7%AC%AC%E4%B8%89%E5%AD%A3?fromModule=lemma_search-box#4-3"response = requests.get(url, headers=headers)response.raise_for_status()  # 如果请求失败,这会抛出一个异常html_content = response.textsoup = BeautifulSoup(html_content, 'lxml')trs = soup.find('div', attrs={'data-uuid': "go12lpqgpn"}).find_all(name='tr')listUser = []for tr in trs[1:]:tds = tr.find_all('td')name = tds[0].find('a').get_text()head_href = tds[0].find('a').attrs['href']head_id = head_href.split('/')[3].split('?')[0]provice = tds[1].find('span').get_text()height = tds[2].find('span').get_text()weight = tds[3].find('span').get_text()company = tds[4].find('span').get_text()user = {'name': name, 'head_id': head_id, 'provice': provice, 'height': height, 'weight': weight,'company': company}listUser.append(user)print(listUser)return listUserif __name__ == '__main__':listUser = getAllUsers()with open('user.json', 'w', encoding='utf-8') as f:json.dump(listUser, f, ensure_ascii=False, indent=4)

大致结果数据如下:

[{"name": "爱尔法·金","head_id": "55898952","provice": "中国新疆","height": "184cm","weight": "65kg","company": "快享星合"},{"name": "艾克里里","head_id": "19441668","provice": "中国广东","height": "174cm","weight": "55kg","company": "领优经纪"},{"name": "艾力扎提","head_id": "55898954","provice": "中国新疆","height": "178cm","weight": "56kg","company": "简单快乐"},// ...    
]

2)图表展示抓取到的数据

import pandas as pd
import matplotlib.pyplot as pltdf = pd.read_json('user.json')province_counts = df['provice'].value_counts().reset_index()
province_counts.columns = ['provice', 'count']
print(province_counts)# 设置字体为支持中文的字体,比如'SimHei'(黑体),确保你的系统中安装了该字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号# # 创建一个尺寸为 16x10 英寸、分辨率为 200dpi 的图形窗口
plt.figure(figsize=(16, 10), dpi=200)
plt.bar(province_counts['provice'], province_counts['count'])
plt.title('每个省份的人数')
plt.xlabel('省份')
plt.ylabel('人数')
plt.xticks(rotation=45)  # 如果省份名称过长,可以旋转x轴标签以便更好地显示
plt.show()

打印如下数据

      provice  count
0     中国广东     14
1     中国江苏      9
2     中国山东      8
3     中国浙江      7
4     中国辽宁      7
5     中国湖南      6
6     中国四川      5
7     中国北京      5
8     中国贵州      5
9     中国河南      5
10    中国湖北      4
11    中国河北      4
12    中国重庆      3
13   中国内蒙古      3
14    中国新疆      3
15    中国安徽      3
16   中国黑龙江      2
17    中国江西      2
18    中国上海      2
19     加拿大      2
20    中国台湾      2
21    中国澳门      2
22    中国吉林      2
23    中国天津      2
24      美国      2
25    中国广西      1
26    中国甘肃      1
27      中国      1
28   中国哈尔滨      1
29      日本      1
30    中国宁夏      1
31    马来西亚      1
32    中国福建      1
33    中国云南      1
34    中国山西      1

输出图表:
在这里插入图片描述

参考

  • https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/
  • https://requests.readthedocs.io/projects/cn/zh-cn/latest/

相关文章:

【爬虫】requests 结合 BeautifulSoup抓取网页数据

一、BeautifulSoup使用步骤 BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库。以下是如何使用 BeautifulSoup 来解析 HTML 并提取信息的基本步骤&#xff1a; 1、安装&#xff1a; 如果你还没有安装 BeautifulSoup&#xff0c;你可以使用 pip 来安装它。…...

安全测试框架 二

使用安全测试框架进行测试&#xff0c;可以遵循以下步骤进行&#xff0c;以确保测试的全面性和系统性&#xff1a; 一、明确测试目标和需求 确定测试的范围和重点&#xff0c;明确要测试的系统或应用的安全性方面的关键点和重要性。根据业务需求和安全标准&#xff0c;制定详…...

安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易

安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易 安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易 2024年5月中旬&#xff0c;我安徽京准科技生产研发的NTP时钟服务器成功投运甘南州公共资源交易中心&#xff0c;为该中心的计算机网络系统及其他各业务子系统提供…...

大数据—什么是大数据?

大数据是指所涉及的资料量规模巨大到无法透过主流软件工具&#xff0c;在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。想要更加全面地了解大数据的概念&#xff0c;可以从以下几个维度进行介绍&#xff1a; 大数据的定义&#xff1a; 基本…...

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第十一周) - 自然语言处理扩展研究

自然语言处理扩展研究 1. 多语言研究2. 语言锚定3. 伦理问题 1. 多语言研究 多语言(Multilinguality)是NLP的一个重要研究方向&#xff0c;旨在开发能够处理多种语言的模型和算法。由于不同语言在语法、词汇和语义结构上存在差异&#xff0c;这成为一个复杂且具有挑战性的研究…...

支持向量机(SVM)中核函数的本质意义

本质上在做什么&#xff1f; 内积是距离度量&#xff0c;核函数相当于将低维空间的距离映射到高维空间的距离&#xff0c;并非对特征直接映射。 为什么要求核函数是对称且Gram矩阵是半正定&#xff1f; 核函数对应某一特征空间的内积&#xff0c;要求①核函数对称&#xff1b;②…...

SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)

1.为什么要有这个需求&#xff1f; 一般当我们自己练习的时候&#xff0c;username和password直接是爆露出来的 假如别人路过你旁边时看到了你的数据库账号密码&#xff0c;他跑到他的电脑打开navicat直接就是一顿连接&#xff0c;直接疯狂删除你的数据库&#xff0c;那可就废…...

Python日志配置策略

1 三种情况下都能实现日志打印&#xff1a; 被库 A 调用&#xff0c;使用库 A 的日志配置。被库 B 调用&#xff0c;使用库 B 的日志配置。独立运行&#xff0c;使用自己的日志配置。 需要实现一个灵活的日志配置策略&#xff0c;使得日志记录器可以根据调用者或运行环境自动…...

想学编程,什么语言最好上手?

Python是许多初学者的首选&#xff0c;因为它的语法简洁易懂&#xff0c;而且有丰富的资源和社区支持。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;…...

binlog和redolog有什么区别

在数据库管理系统中&#xff0c;binlog&#xff08;binary log&#xff09;和 redolog&#xff08;redo log&#xff09;是两种重要的日志机制&#xff0c;它们在数据持久性和故障恢复方面扮演着关键角色。虽然它们都用于记录数据库的变化&#xff0c;但它们的目的和使用方式有…...

Linux笔记--ubuntu文件目录+命令行介绍

文件目录 命令行介绍 当我们在ubuntu中命令行处理位置输入ls后会显示出其所有目录&#xff0c;那么处理这些命令的程序就是shell&#xff0c;它负责接收用户的输入&#xff0c;并根据输入找到其他程序并运行 命令行格式 linux的命令一般由三部分组成&#xff1a;command命令、…...

71、最长上升子序列II

最长上升子序列II 题目描述 给定一个长度为N的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 100000…...

解决必剪电脑版导出视频缺斤少两的办法

背景 前几天将电脑重置了&#xff0c;今天想要剪辑一下视频&#xff0c;于是下载了必剪&#xff0c;将视频、音频都调整好&#xff0c;导出&#xff0c;结果15分钟的视频只能导出很短的时长&#xff0c;调整参数最多也只能导出10分钟&#xff0c;My God&#xff01; 解决 首…...

新人学习笔记之(常量)

一、什么是常量 1.常量&#xff1a;在程序的执行过程中&#xff0c;其值不能发生改变的数据 二、常量的分类 常量类型说明举例整型常量整数、负数、0123 456实型常量所有带小数点的数字1.93 18.2字符常量单引号引起来的字母、数字、英文符号S B字符串常量双引号引起来的&…...

Lua解释器裁剪

本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程&#xff1a; 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪&#xff0c;很简单~ 1、引言 在嵌入式中使用lua解释器&#xff0c;很多时候会面临资源紧张的情况。 同时&#xff0c…...

web前端设计nav:深入探索导航栏设计的艺术与技术

web前端设计nav&#xff1a;深入探索导航栏设计的艺术与技术 在web前端设计中&#xff0c;导航栏&#xff08;nav&#xff09;扮演着至关重要的角色&#xff0c;它不仅是用户浏览网站的指引&#xff0c;更是网站整体设计的点睛之笔。本文将从四个方面、五个方面、六个方面和七…...

分析解读NCCL_SHM_Disable与NCCL_P2P_Disable

在NVIDIA的NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;库中&#xff0c;NCCL_SHM_Disable 和 NCCL_P2P_Disable 是两个重要的环境变量&#xff0c;它们控制着NCCL在多GPU通信中的行为和使用的通信机制。下面是对这两个环境变量的详细解读&#xff1…...

使用 Python 进行测试(6)Fake it...

总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…...

Flink Watermark详解

Flink Watermark详解 一、概述 Flink Watermark是Apache Flink框架中为了处理乱序和延迟事件时间数据而引入的一种机制。在流处理中&#xff0c;由于数据可能不是按照事件产生的时间顺序到达的&#xff0c;Watermark被用来告知系统在该时间戳之前的数据已经全部到达&#xff…...

LeetCode538.把二叉搜索树转换为累加树

class Solution { public:int sum 0; TreeNode* convertBST(TreeNode* root) { if (root){convertBST(root->right);sum root->val;root->val sum;convertBST(root->left);}return root;}};...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...