什么是屏幕抓取以及如何操作?

在本文中,我将通过实际示例向你介绍什么是屏幕抓取、不同类型的屏幕抓取以及如何进行屏幕抓取。如果你已经准备好学习如何从不便访问的地方抓取数据,请继续阅读!

什么是屏幕抓取?

刮网 是指从软件程序或网站的界面或显示中提取信息的过程。虽然 API(应用程序编程接口)是获取数据的首选方式,但许多程序和网站并不提供 API。在这种情况下,屏幕刮擦就提供了一种可行的解决方案。

这种技术可以从多种类型的接口采集数据,包括

  • 网页
  • GUI(图形用户界面)
  • 终端输出(控制台或命令行)

使用应用程序接口时,数据通常是结构化的,更易于管理,而屏幕刮擦则不同,它需要直接从显示输出中提取数据的方法,通常需要额外的工具和脚本。

抓屏类型

屏幕刮擦有不同的类型,每种类型都针对特定的环境和数据源。最常见的三种类型是

网络抓取

网络抓取 是最流行、最著名的屏幕刮擦形式。它包括通过解析网页的 HTML 内容从网站中提取数据。网页抓取通常使用库或工具来获取 HTML 数据并提取相关信息。

例如,使用 Python 的 `requests` 和 `BeautifulSoup`,我们可以像这样从网站提取数据:

import requests
from bs4 import BeautifulSoup
url = 'https://example.com'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text、 html.parser)
links = soup.find_all('a')
for link in links:
print(f "链接: {link.get_text()} | URL: {link.get('href')}")
else:
print(f "检索页面失败。状态代码: {response.status_code}")

这段简单的代码可以获取网页中的所有链接。但是,有些网站使用 JavaScript 动态加载内容,这就使得使用 BeautifulSoup 等工具进行刮擦变得无效。为了处理这种情况,我们使用了像 Selenium 这样可以呈现 JavaScript 的无头浏览器。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument(" - 无头")
驱动程序 = webdriver.Chrome(options=options)
driver.get("https://quotes.toscrape.com/js/")
quotes = driver.find_elements_by_class_name("引用")
for quote in 报价:
print(引用文本)
driver.quit()

图形用户界面抓取

GUI 抓取用于从图形用户界面中提取数据。这种抓取方式模拟人类与界面的交互,例如点击按钮或读取屏幕上显示的文本。像 `pyautogui` 这样的 GUI 抓取工具通过模拟鼠标和键盘输入来帮助自动化这一过程。

GUI 抓取的一个示例如下:

导入 pyautogui
# 截图并保存
screenshot = pyautogui.screenshot()
screenshot.save("截图.png")

虽然 GUI 爬取可能很有用,但由于屏幕分辨率差异和图形界面的不可预测性,它通常很慢且不可靠。

终端扫描

终端搜索或命令行搜索是从终端或命令提示符输出中提取数据。许多命令行工具以 JSON 或 CSV 等易于解析的结构化格式提供数据。

例如,我们可以在 Linux 系统上使用 df -h 命令获取磁盘使用数据,并使用 shell 脚本处理输出:

df -h | sed '$d' | awk 'NR>1 { 打印 $5 "上使用的" $9 }'

该脚本可从 df -h 输出中提取磁盘使用百分比和挂载位置。

屏幕抓取网站

谈到网页抓取,有多种工具和方法可以用于从网站提取数据。最简单的方式是使用 HTTP 客户端获取 HTML 内容,然后解析其中的数据。

下面是一个从网站上抓取网页标题的例子:

from 请求_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com')
if response.status_code == 200:
page_title = response.html.find('h1',第一=True).文本
print(f "页面标题: {网页标题}")
else:
print("检索页面失败")

This code uses requests-html,这是一个支持渲染 JavaScript 的库,以防内容是动态加载的。

在收件箱中接收《数据日报》的报道

如果需要提取页面中的所有链接,可以使用 BeautifulSoup:

import requests
from bs4 import BeautifulSoup
url = 'https://example.com'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text、 html.parser)
links = soup.find_all('a')
for link in links:
print(f "链接: {link.get_text()} | URL: {link.get('href')}")
else:
print("检索页面失败")

利用 OpenAI 进行搜索

屏幕刮擦还可以利用 OpenAI 等人工智能工具进行基于图像的刮擦。例如,OCR(光学字符识别)可用于从图像或屏幕截图中提取文本。

下面是一个使用 OpenAI 的视觉 API 从屏幕截图中提取文本的示例:

import base64
import pyautogui
from 开放式 import OpenAI
from io import BytesIO
客户端 = OpenAI(api_key="你的钥匙")
screenshot = pyautogui.screenshot()
缓冲区 = BytesIO()
screenshot.save(buffer、 格式="巴新")
img_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8")
response = client.chat.completions.create(
模型="gpt-4o",
messages=[
{
"角色": "用户",
"content": [
{"类型": "文本", "文本": "请从这张截图中提取所有可见文字"。},
{"类型": "image_url", "image_url": {"url": f "data:image/png;base64、{img_base64}"}}
]
}
],
max_tokens=1000
)
print("结果:", response.choices[0].message.content.strip())

本示例演示了如何使用 OpenAI 的 API 从图像中读取并提取数据。这在数据嵌入在图像中的 GUI 抓取场景中尤其有用。

我建议您进一步了解如何使用 用于网页抓取的 ChatGPT.

屏幕扫描的挑战

虽然屏幕抓取功能强大,但也存在一些挑战:

  1. 防窃听措施:网站通常采用验证码、速率限制和 IP 阻断等技术来防止抓取。使用以下技术可以绕过这些措施 验证码解决服务 和 旋转 IP 代理.
  2. 动态内容:现代网站使用 JavaScript 动态加载内容。在这种情况下,BeautifulSoup 等传统抓取方法可能不起作用。无头浏览器,如 Selenium 需要在提取数据前完全渲染页面。
  3. 数据质量和结构:提取数据的结构可能并不总是易于使用。不连贯的 HTML、频繁的页面更改或设计不佳的界面都会导致难以可靠地解析数据。

屏幕抓取的道德规范

屏幕抓取与任何网络抓取活动一样,都应遵循道德规范。网站通常会有一个 robots.txt 文件,规定是否允许抓屏。遵守这些规则对避免法律问题非常重要。例如,LinkedIn 起诉 hiQ Labs 抓取其数据,法院支持 LinkedIn 的诉讼请求。

在抓取网站之前,请务必检查 robots.txt 文件,确保没有违反任何服务条款。以下是 robots.txt 文件的示例:

用户-agent: *
不允许: /private/
网站地图: https://example.com/sitemap.xml

结论

在没有应用程序接口(API)的情况下,屏幕抓取是一种提取数据的多功能工具。无论是抓取网站、图形用户界面还是终端输出,都可以根据数据类型和来源应用各种工具和技术。然而,反抓取措施和动态内容等挑战需要额外的工具,如 Selenium 或无头浏览器。

通过了解道德准则和负责任地实施抓取,你可以为你的项目有效地提取有价值的数据。因此,请使用本指南中概述的技术,开始抓取吧!

类似文章