BeautifulSoup数据抓取优化

优化 BeautifulSoup 数据抓取可以帮助提高数据抓取的效率和性能,优化的数据抓取方式更加友好,减少了对目标网站的访问压力,降低了被封禁或限制访问的风险。那边在日常中会遇到一些复杂的问题,如何解决?看看下面的几种解决方案。

在这里插入图片描述

1、问题背景

我正在使用BeautifulSoup库来抓取一个网站上的数据。网站的数据结构如下:

<table><tbody><tr><td class="comtext">公司名称</td><td class="comuser">联系人</td><td class="com">地址</td><td class="com">电话</td><td class="com">邮箱</td></tr><tr><td class="comtext">公司名称2</td><td class="comuser">联系人2</td><td class="com">地址2</td><td class="com">电话2</td><td class="com">邮箱2</td></tr>...</tbody>
</table>

我使用如下代码来抓取数据:

from bs4 import BeautifulSoup
import urllib2page = urllib2.urlopen("http://example.com/directory.html")
soup = BeautifulSoup(page.read(), "html.parser")for row in soup.find_all("tr"):cells = row.find_all("td")company_name = cells[0].textcontact_person = cells[1].textaddress = cells[2].textphone_number = cells[3].textemail = cells[4].textprint("{},{},{},{},{}".format(company_name, contact_person, address, phone_number, email))

但是,输出的结果是:

公司名称,联系人,地址,电话,邮箱
公司名称2,联系人2,地址2,电话2,邮箱2
...

也就是每一行的值都出现在下一行中,没有被正确地分开。

2、解决方案

为了解决这个问题,我们需要对代码进行修改,以便正确地将每一行的值分开。

方法1:使用zip函数

一种方法是使用zip函数。zip函数可以将多个列表中的元素一一对应地组合成元组。我们可以将每一行的单元格列表作为参数传递给zip函数,得到一个由元组组成的列表。然后,我们可以遍历这个列表,并将每一个元组中的元素组合成一个字符串,作为一行输出。

修改后的代码如下:

from bs4 import BeautifulSoup
import urllib2page = urllib2.urlopen("http://example.com/directory.html")
soup = BeautifulSoup(page.read(), "html.parser")for row in soup.find_all("tr"):cells = row.find_all("td")company_name, contact_person, address, phone_number, email = zip(*cells)print("{},{},{},{},{}".format(company_name, contact_person, address, phone_number, email))

输出结果为:

公司名称,联系人,地址,电话,邮箱
公司名称2,联系人2,地址2,电话2,邮箱2
...

方法2:使用切片操作

另一种方法是使用切片操作。我们可以使用切片操作来将每一行的单元格列表分为多个子列表,子列表中包含了每一行的值。然后,我们可以遍历这些子列表,并将子列表中的元素组合成一个字符串,作为一行输出。

修改后的代码如下:

from bs4 import BeautifulSoup
import urllib2page = urllib2.urlopen("http://example.com/directory.html")
soup = BeautifulSoup(page.read(), "html.parser")for row in soup.find_all("tr"):cells = row.find_all("td")company_name = cells[0].textcontact_person = cells[1].textaddress = cells[2].textphone_number = cells[3].textemail = cells[4].textprint("{},{},{},{},{}".format(company_name, contact_person, address, phone_number, email))

输出结果为:

公司名称,联系人,地址,电话,邮箱
公司名称2,联系人2,地址2,电话2,邮箱2
...

优化后的数据抓取代码通常能够更快速地获取所需数据,减少了资源的浪费,提高了程序的运行效率。

数据抓取优化不仅能够提高程序的性能和效率,还能够降低资源消耗,改善用户体验,降低被封禁风险,提高可维护性和可扩展性,以及降低错误和异常情况的发生,从而为数据抓取任务带来更多的好处和优势。所以说,其实懂得并不难,如果大家有任何问题都可以留言讨论。

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

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

相关文章

React项目如何捕获错误

React项目如何捕获错误 1. 错误捕获的基本方法1.1 组件级别的错误处理1.2 使用错误处理库1.3 React的错误边界&#xff08;Error Boundaries&#xff09; 2. 错误边界的限制 在构建React应用程序时&#xff0c;错误处理是一个不可忽视的重要方面。有效地捕获和处理错误不仅可以…

【C++】详解vector二维数组的全部操作(超细图例解析!!!)

目录 一、前言 二、 深度理解vector 的二维数组&#xff08;重点&#xff01;&#xff09; 三、vector 二维数组的空间理解&#xff08;重点&#xff01;&#xff09; ✨问题分析 ✨如何合理定制vector的内存空间 四、vector 二维数组的初始化 五、vector 二维数组的 添加…

性能优化 - 你能说一说,为什么做了骨架屏,FCP的指标还是没有提升吗

难度级别:中高级及以上 提问概率:80% FCP的全程是First Contentful Paint,是衡量网页性能的一个重要指标,很多人把FCP理解为元素内容首次渲染到浏览器上的时间。但由于现在比较流行的Vue或是React项目中,HTML文档最初只有一个id为app的DIV…

自建ceph存储集群方案之从零到一

概述 根据硬件摩尔定律&#xff0c;硬件成本随时间越来越低&#xff0c;性能较之前越来越高&#xff0c;尤其是随着pcie全闪灯普及&#xff0c;理论上作为云服务的基础设施&#xff0c;存储应该越来越便宜。然而&#xff0c;购置商用sds产品的成本却一直居高不下&#xff0c;越…

在unbuntu服务器上使用nginx+uwsgi部署django项目

一、配置nginx 1. 安装nginx apt-get install nginx2. 编写nginx配置文件 进入nginx.conf文件路径&#xff1a;/etc/nginx/nginx.conf 编写以下内容&#xff1a; events {worker_connections 1024; # 工作进程的最大连接数量 }http{include mime.types;# 日志格式及保存路径…

(译) 理解 Elixir 中的宏 Macro, 第五部分:组装 AST

Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics[2] (译) Understanding Elixir Macros, Part 2 - Macro Theory[3] (译) Understanding Elixir Macros, Part 3 - Getting into the AST[4] (译) Understanding Elixir Macros, Part 4 - Divin…

【Labview】虚拟仪器技术

一、背景知识 1.1 虚拟仪器的定义、组成和应用 虚拟仪器的特点 虚拟仪器的突出特征为“硬件功能软件化”&#xff0c;虚拟仪器是在计算机上显示仪器面板&#xff0c;将硬件电路完成信号调理和处理功能由计算机程序完成。 虚拟仪器的组成 硬件软件 硬件是基础&#xff0c;负责将…

数字化转型回归底层逻辑

2024年第一季度已然过去&#xff0c;对于我们每个人而言&#xff0c;这都是一次严峻的挑战。2015年&#xff0c;蚓链数字化营销系统踏上研发之路。让我们回顾数字技术对企业的影响阶段&#xff1a;2012-2015 年&#xff0c;互联网在消费端产生巨大影响&#xff0c;引发了虚拟经…

清空nginx缓存并强制刷新

当对nginx的文件进行修改或更新时&#xff0c;可能会出现旧文件被缓存而无法立即生效的问题&#xff0c;此时需要清空nginx的文件缓存并强制刷新。可以通过以下步骤实现&#xff1a; 登录nginx服务器执行命令&#xff1a;sudo nginx -s reload &#xff08;重新加载nginx配置&…

YOLOv5改进--轻量化YOLOv5s模型

文章目录 1、前言2、轻量化模型结构&#xff1a;3、模型对比4、训练结果图5、目标检测文章 1、前言 在边缘设备的场景下&#xff0c;目前的YOLOv5s&#xff0c;虽然能够快速实现目标检测&#xff0c;但是运行速度依旧稍慢点&#xff0c;本文在牺牲一点精度前提下&#xff0c;提…

Web漏洞-文件上传常见验证

后缀名&#xff1a;类型&#xff0c;文件头等 后缀名&#xff1a;黑白名单 文件类型&#xff1a;MIME信息 文件头&#xff1a;内容头信息 常见黑名单&#xff08;明确不允许上传的格式后缀&#xff09;&#xff1a;asp、php、jsp、aspx、cgi、war &#xff08;如果没有完整…

vscode:插件开发

文档&#xff1a; 连接 终端执行 sudo pnpm install -g yo generator-codeyo code// 这里建议选择 JavaScript 很少出错 # ? What type of extension do you want to create? New Extension (JavaScript) # ? Whats the name of your extension? HelloWorld ### Press <…

nacos derby.log无法的读取+derby数据库启动失败分析解决

排查思路分析 日志报错&#xff1a; derby.log文件权限不够&#xff08;root权限&#xff09;&#xff0c;无法读取&#xff0c;我用普通用户启动。 使用命令chown xx:xx derby.log修改属主和属组为普通用户后&#xff0c;又报出其他错误。 数据库启动不了&#xff0c;无…

Composer Windows 安装

Composer 的下载地址为&#xff1a;Composer 1 运行安装程序 当启动安装程序后单击下一步继续。 选择 PHP 路径 如果你的计算机上没有安装 PHP 的话&#xff0c;Composer 的安装无法继续。 你需要选择你本地安装的 PHP 路径。 配置代理地址 默认的情况下&#xff0c;可以不…

【LeetCode刷题记录】15. 三数之和

15 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [ n u m s [ i ] , n u m s [ j ] , n u m s [ k ] ] [nums[i], nums[j], nums[k]] [nums[i],nums[j],nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 n u m s [ i ] n u m s [ j ] n u …

java基础语法(11)| 内部类

1. 内部类 1.1 什么是内部类 将一个类A定义在另一个类B里面&#xff0c;里面的那个类A就称为内部类&#xff0c;B则称为外部类。 1.2 内部类的分类 成员内部类 局部内部类 匿名内部类 1.3 成员内部类 在描述事物时&#xff0c;若一个事物内部还包含其他事物&#xff0c;就…

基于starganvc2的变声器论文原理解读

数据与代码见文末 论文地址&#xff1a;https://arxiv.org/pdf/1907.12279.pdf 1.概述 什么是变声器&#xff0c;变声器就是将语音特征进行转换&#xff0c;而语音内容不改变 那么我们如何构建一个变声器呢&#xff1f; 首先&#xff0c;我们肯定不能为转换的每一种风格的声…

JavaEE初阶——多线程(一)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第一部分:引入线程以及创建多线程的几种方式 此文章是建立在前一篇文章进程的基础上的 如果有不足的或者错误的请您指出! 1.认识线程 我们知道现代的cpu大多都是多核心…

【Figma】安装指南及基础操作

先前做UI设计一直都是用PS等绘图软件设计&#xff0c;但发现在纠结像素和排版问题上会花很多时间&#xff0c;再加上AI没来得及上手&#xff0c;就需要迅速出成图&#xff0c;此时通过论坛发现了figma&#xff0c;基本上可以满足足够的需求&#xff0c;并且可以在windows系统上…

【云开发笔记NO.27】分布式数据库

在云原生开发中&#xff0c;分布式数据库是一种特殊类型的数据库管理系统&#xff0c;其数据不是存储在单个集中的服务器上&#xff0c;而是分散在网络中的多个节点或服务器上。这种分散存储的方式使得分布式数据库具有很高的可扩展性、容错性和性能优势。云原生环境下的分布式…