前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BeautifulSoup数据抓取优化

BeautifulSoup数据抓取优化

原创
作者头像
华科云商小徐
发布2024-04-08 11:31:06
530
发布2024-04-08 11:31:06
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫

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

1、问题背景

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

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
from bs4 import BeautifulSoup
import urllib2
​
page = 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].text
    contact_person = cells[1].text
    address = cells[2].text
    phone_number = cells[3].text
    email = cells[4].text
​
    print("{},{},{},{},{}".format(company_name, contact_person, address, phone_number, email))

但是,输出的结果是:

代码语言:javascript
复制
公司名称,联系人,地址,电话,邮箱
公司名称2,联系人2,地址2,电话2,邮箱2
...

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

2、解决方案

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

方法1:使用zip函数

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

修改后的代码如下:

代码语言:javascript
复制
from bs4 import BeautifulSoup
import urllib2
​
page = 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))

输出结果为:

代码语言:javascript
复制
公司名称,联系人,地址,电话,邮箱
公司名称2,联系人2,地址2,电话2,邮箱2
...

方法2:使用切片操作

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

修改后的代码如下:

代码语言:javascript
复制
from bs4 import BeautifulSoup
import urllib2
​
page = 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].text
    contact_person = cells[1].text
    address = cells[2].text
    phone_number = cells[3].text
    email = cells[4].text
​
    print("{},{},{},{},{}".format(company_name, contact_person, address, phone_number, email))

输出结果为:

代码语言:javascript
复制
公司名称,联系人,地址,电话,邮箱
公司名称2,联系人2,地址2,电话2,邮箱2
...

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档