使用 Python 网页抓取克服 pandas.read_html 的限制

2023-10-21

熊猫 read_html函数是一个非常有用的工具,用于从网页中快速提取 HTML 表格。

它允许您仅用一行代码从 HTML 内容中提取表格数据。
然而,read_html有一些限制。

本教程将指导您应对其中一些挑战,并提供克服这些挑战的解决方案。

为了本教程的目的,我们将使用这个示例 HTML 文件从中提取数据。

 

 

导航动态内容(JavaScript 交互)

网页通常包含动态内容,其中网页的结构随着时间的推移而变化。

在这种情况下,我们可以结合使用美丽汤 and Selenium与此动态内容进行交互。


from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
url = 'http://localhost/test.html'
driver = webdriver.Firefox()
driver.get(url)
button = driver.find_element('id', 'loadMoreButton')
button.click()
html_content = driver.page_source
soup = BeautifulSoup(html_content, "lxml")
table = soup.find_all('table')[0]
dfs = pd.read_html(str(table))

print(dfs[0])
  

Output


   Column1 Column2 Column3
0       a1      b1      c1
1       a2      b2      c2
2       a3      b3      c3
3       a4      b4      c4
4       a5      b5      c5
  

在此脚本中,Selenium 不仅用于打开网页,还用于与其交互。

The loadMoreButton单击元素将其他数据加载到表中,然后使用 BeautifulSoup 和pandas.read_html.

 

表格提交和认证

另一个限制是pandas.read_html是它不支持表单提交或身份验证。这两个任务都可以使用 Selenium 和 BeautifulSoup 来执行。
以下是表单提交和身份验证的示例:


from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd

url = 'http://localhost/test.html'
driver = webdriver.Firefox()
driver.get(url)
username = driver.find_element('id', 'username')
password = driver.find_element('id', 'password')
username.send_keys('test_user')
password.send_keys('test_password')
login_button = driver.find_element('id', 'login')
login_button.click()
html_content = driver.page_source
soup = BeautifulSoup(html_content, "lxml")
table = soup.find_all('table')[0]
dfs = pd.read_html(str(table))
print(dfs[0])
  

Output


   Column1 Column2 Column3
0       a1      b1      c1
1       a2      b2      c2
2       a3      b3      c3
  

在上面的脚本中,Selenium 用于自动化登录网站的过程。该脚本查找用户名和密码字段的元素,输入登录凭据,然后单击登录按钮。

一旦脚本通过身份验证,它就会获取页面的 HTML 内容并提取 HTML 表数据。

 

复杂的 CSS 选择器

While pandas.read_html对于结构良好的表格效果很好,但在处理复杂的 CSS 选择器时却表现不佳。

BeautifulSoup 对此派上用场,它允许我们使用 CSS 选择器来导航和搜索解析树。
以下是将 CSS 选择器与 BeautifulSoup 一起使用的示例:


from bs4 import BeautifulSoup
import requests
import pandas as pd
url = 'http://localhost/test.html'
html_content = requests.get(url).text
soup = BeautifulSoup(html_content, "lxml")
table = soup.select('div.content > table.table-class')[0]
dfs = pd.read_html(str(table))
print(dfs[0])
  

Output


   Column1 Column2 Column3
0       a1      b1      c1
1       a2      b2      c2
2       a3      b3      c3
  

在这个脚本中,BeautifulSoup 的select函数与针对第一个表(table.table-class)在一个div与班级content.

这种定位 HTML 内容特定部分的精确度是无法通过以下方式实现的:pandas.read_html alone.

 

多页抓取

网页抓取的一个常见问题是处理分页内容。pandas.read_html没有内置支持自动浏览多个页面。

我们可以用Scrapy,一个强大的 Python 抓取库,可以处理这个问题:


import scrapy
import pandas as pd
import pandas as pd
class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://localhost/test.html']
    def parse(self, response):
        dfs = pd.read_html(response.text)
        print(dfs[0])
        next_page = response.css('a.next-page::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)
  

Output


Page 1
   Column1 Column2 Column3
0       a1      b1      c1
1       a2      b2      c2
2       a3      b3      c3
...
Page 2
   Column1 Column2 Column3
0       a4      b4      c4
1       a5      b5      c5
2       a6      b6      c6
...
...
  

在上面的脚本中,创建了一个 Scrapy 蜘蛛来浏览多个页面。这parse为初始 URL 和每个后续页面调用方法。

它使用以下命令从当前页面中提取 HTML 表pandas.read_html然后使用 CSS 选择器找到下一页的链接。如果找到下一页,蜘蛛就会跟踪链接并重复该过程。

 

处理非表格数据

另一个限制是pandas.read_html是它只提取表格数据。如果您感兴趣的数据存储在另一个 HTML 结构(例如列表)中,您将需要另一个工具。

这是使用 BeautifulSoup 提取项目列表的示例:


from bs4 import BeautifulSoup
import requests
url = 'http://localhost/test.html'
html_content = requests.get(url).text
soup = BeautifulSoup(html_content, "lxml")
items = soup.select('ul.item-list > li')
items_text = [item.get_text() for item in items]
print(items_text)
  

Output


['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5']
  

在这个脚本中,BeautifulSoup 的select函数与 CSS 选择器一起使用,该选择器针对所有lia 内的元素ul与班级item-list。每个项目的文本都被提取到一个列表中。

 

HTTP 标头和 Cookie

又一个限制pandas.read_html其缺点是它不允许控制 HTTP 标头或 cookie,而这些通常是访问某些网页所必需的。我们可以使用requests库来处理这个:


import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'http://localhost/test.html'
headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'session_id': '1234567890'}
response = requests.get(url, headers=headers, cookies=cookies)
soup = BeautifulSoup(response.text, "lxml")
table = soup.find_all('table')[0]
dfs = pd.read_html(str(table))
print(dfs[0])
  

Output


   Column1 Column2 Column3
0       a1      b1      c1
1       a2      b2      c2
2       a3      b3      c3
  

在这个脚本中,requests.get用于获取 HTML 内容,但这次我们传递一个 HTTP 标头字典和一个 cookie 字典。

例如,这使我们能够假装是某种类型的浏览器或跨多个请求维护会话。

然后使用 BeautifulSoup 解析 HTML 内容,并使用以下命令提取表格pandas.read_html.

 

尊重 robots.txt

网页抓取应始终以尊重和道德的方式进行。大多数网站都包含一个robots.txt文件,说明网站的哪些部分不应被抓取或抓取。

要遵守这些规则,您可以手动检查robots.txt文件(通常位于网站的根目录,例如http://localhost/robots.txt),或者使用类似的库robotexclusionrulesparser自动遵守规则:


from robotexclusionrulesparser import RobotExclusionRulesParser
url = 'http://localhost'
rp = RobotExclusionRulesParser()
rp.fetch(url + '/robots.txt')
can_fetch_page = rp.can_fetch('*', url + '/test.html')
print(can_fetch_page)
  

Output


True
  

在此脚本中,我们使用RobotExclusionRulesParser获取并解析robots.txt来自目标网站的文件。

The can_fetch方法用于检查是否可以抓取特定页面(根据robots.txt rules).

The '*'参数意味着我们正在检查适用于所有网络爬虫的规则。如果输出是True,这意味着我们可以抓取页面。
请记住,遵守这些规则至关重要,这不仅是出于对网站运营商的尊重,也是为了避免潜在的法律问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 网页抓取克服 pandas.read_html 的限制 的相关文章

随机推荐

  • 使用 PHPMailer 发送电子邮件

    电子邮件发送功能是许多 Web 应用程序的重要组成部分 从帐户验证电子邮件到忘记密码提醒 电子邮件有助于在您的应用程序与其用户之间建立沟通桥梁 PHPMailer 是从 PHP 应用程序发送电子邮件的最流行的库之一 它具有许多功能 使其成为
  • 如何在 Ubuntu 18.04 LTS 上安装 Swift

    Swift 是一种安全 快速 富有表现力的通用编程语言 专为软件设计模式而构建 它最适合系统编程 移动和桌面应用程序 Swift 提供了大量功能 使编程变得更加容易 同时为开发人员提供了真正的系统编程语言所需的控制能力 本教程将帮助您在 U
  • 解决 MySQL 错误 1041 (HY000):内存不足

    在使用 MySQL 时 您可能偶尔会遇到以下情况 错误 1041 HY000 内存不足错误 此错误表明 MySQL 服务器 mysqld 在尝试执行操作时内存不足 此类问题可能有点令人困惑 特别是如果您的服务器似乎有足够的可用内存 让我们深
  • 什么是 500 内部服务器错误

    浏览网页时最常见的错误之一是 500 内部服务器错误 此消息表明网络服务器遇到技术问题 本文解释了 500 错误的含义 为什么会收到 HTTP 500 代码以及如何解决这些错误 什么是 HTTP 500 错误 每次打开网页时 浏览器都会向托
  • Linux 中的 Basename 命令

    basename是一个命令行实用程序 可以从给定的文件名中删除目录和尾随后缀 使用basename命令 The basename命令支持两种语法格式 basename NAME SUFFIX basename OPTION NAME bas
  • 如何在 Linux 上创建可启动的 Ubuntu U 盘

    在本教程中 我们将向您展示如何从 Linux 终端创建可启动的 Ubuntu U 盘 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 运行任何 Li
  • 如何在 Ubuntu 20.04 上安装 Odoo 14

    Odoo 是一款流行的开源商业应用程序套件 可帮助公司管理和运营其业务 它包括广泛的应用程序 例如 CRM 电子商务 网站构建器 计费 会计 制造 仓库 项目管理 库存等等 所有这些都无缝集成 Odoo根据使用案例和可用技术 可以以不同的方
  • Linux 中的 Ping 命令

    The ping命令是最常用的用于故障排除 测试和诊断网络连接问题的工具之一 Ping 的工作原理是向网络上指定的目标 IP 发送一个或多个 ICMP 互联网控制消息协议 回显请求包 并等待回复 当目的地收到数据包时 它会使用 ICMP 回
  • Linux 中的 Gzip 命令

    Gzip 是最流行的压缩算法之一 它允许您减小文件的大小并保留原始文件模式 所有权和时间戳 Gzip 还指 gz文件格式和gzip用于压缩和解压缩文件的实用程序 在本教程中 我们将向您展示如何使用gzip命令 gzip命令语法 的一般语法为
  • 如何在 Debian 10 上安装 Skype

    Skype是世界上最流行的通信应用程序之一 它允许您免费拨打在线音频和视频电话 并以经济实惠的价格拨打全球手机和固定电话 本文介绍如何在 Debian 10 Linux 上安装最新版本的 Skype 在 Debian 上安装 Skype S
  • 如何在 Ubuntu 20.04 上安装 PHP

    PHP 是最常用的服务器端编程语言之一 许多流行的 CMS 和框架 例如 WordPress Magento 和 Laravel 都是用 PHP 编写的 本指南介绍了在 Ubuntu 20 04 上安装 PHP 并将其与 Nginx 和 A
  • 如何在 Ubuntu 中更改用户密码

    定期更新密码并为每个帐户使用唯一的密码始终是个好主意 作为 Ubuntu 中的普通用户 您只能更改自己的密码 root 用户和具有 sudo 权限的用户可以更改其他用户的密码并定义如何使用或更改密码 本教程介绍如何从命令行或通过 Ubunt
  • 如何在 Ubuntu 20.04 上安装 Nginx

    Nginx 发音为 engine x 是一个开源 高性能的 HTTP 和反向代理服务器 负责处理互联网上一些最大站点的负载 它可以用作独立的 Web 服务器 负载均衡器 内容缓存和反向代理适用于 HTTP 和非 HTTP 服务器 与 Apa
  • 如何在 CentOS 7 上安装 Tomcat 9

    Tomcat 是 Java Servlet JavaServer Pages Java 表达式语言和 Java WebSocket 技术的开源实现 本教程介绍了在 CentOS 7 上安装 Tomcat 9 0 所需的步骤 先决条件 您登录
  • 如何使用 nmap 命令

    Nmap 是一款功能强大的网络扫描工具 用于安全审计和渗透测试 它是网络管理员用来解决网络连接问题和解决问题的基本工具之一端口扫描 Nmap还可以检测Mac地址 OS type 服务版本等等 本文介绍了如何使用的基础知识nmap命令来执行各
  • 在 Linux 中安装、配置和保护 FTP 服务器

    FTP或文件传输协议是计算机之间传输文件的常用协议 一个充当客户端 另一个充当服务器 在这篇文章中 我们将讨论 Linux 系统中的 FTP 服务器 特别是 Very Secure FTP Daemon vsftpd vsftpd 程序是当
  • Linux curl 命令:来自 Shell 的 Web 交互

    curl是一个功能强大的命令 可让您将数据传输到服务器或从服务器传输数据 它支持多种协议 并且无需用户交互即可处理各种与网络相关的任务 目录 hide 1 安装卷曲 2 支持的协议 3 URL 通配符
  • Pandas isin 方法:Python 中的高效数据过滤

    The isin中的方法Pandas用于过滤 DataFrame 和 Series 它允许您选择一列 或多列 包含特定值的行 在本教程中 我们将探讨其语法和参数 过滤行的基本用法 使用字典和集合进行查找 处理多个条件等等 目录 hide 1
  • 您每天需要的 20 个主要 Linux 命令

    在上一篇文章中 我们讨论了如何安装Linux 现在 我们要谈谈Linux中最强大的功能 那就是Linux命令或shell命令 有关Linux命令的完整文档 您可以查看Linux 文档 Linux 的强大之处在于您可以使用的命令的强大功能 我
  • 使用 Python 网页抓取克服 pandas.read_html 的限制

    熊猫 read html函数是一个非常有用的工具 用于从网页中快速提取 HTML 表格 它允许您仅用一行代码从 HTML 内容中提取表格数据 然而 read html有一些限制 本教程将指导您应对其中一些挑战 并提供克服这些挑战的解决方案