用 Python 中的 Parsel 进行网络抓取:2025 指南
在本文中,我将向您介绍使用 帕塞尔本指南将帮助你从刮擦简单数据到处理分页等更复杂的情况。无论你是刚入门还是想提高技能,本指南都能帮你搞定。让我们深入了解并开始刮擦!
更智能的 Parsel 网络抓取替代方案
虽然 Parsel 提供了强大的网络搜刮工具,但管理反僵尸措施、IP 禁止和 JavaScript 繁重的网站也是一项挑战。
以下是我推荐的 5 大抓取 API:
- Bright Data: 功能强大的基于代理的刮擦功能可满足复杂的需求。
- ScraperAPI: 为不受保护的网站提供经济实惠的多语言支持。
- Oxylabs: 高质量代理,基于人工智能的数据解析。
- ScrapingBee: 通过验证码解决具有挑战性的网站问题。
- Apify: 易于使用的平台,预置刮板。
我与上述任何提供商均无关联。
什么是 Parsel?
Parsel 是一个 Python 库,用于从 HTML、XML 和 JSON 文档中解析和提取数据。它以 lxml 库为基础,后者为处理 XML 和 HTML 内容提供了一套更先进的工具。不过,Parsel 提供了一个更简单、更友好的用户界面,使其成为网络搜刮任务的最佳选择。
有了 Parsel,你可以使用 XPath 或 CSS 选择器轻松地从 HTML 文档中提取数据,从而使其灵活地兼容各种网络搜刮要求。它还集成到 Scrapy 框架中,后者是大规模网络搜刮项目的常用工具。
为什么使用 Parsel 进行网络抓取?
Parsel 之所以能脱颖而出,成为一款出色的网络搜刮工具,有几个原因:
- XPath 和 CSS 选择器:Parsel 允许您使用以下两种方法提取数据 XPath 和 CSS 选择器.这是识别网页元素的两种不同方法,拥有这两种选项使得 Parsel 非常通用。
- 数据提取:Parsel 可以提取各种类型的数据,如文本内容、属性(如 href 或 src),甚至嵌套元素。
- 链式选择器:Parsel 允许您将选择器串联起来,以完善数据提取流程,确保您能准确定位所需的数据。
- 可扩展性:无论您是搜索小型博客还是海量数据库,Parsel 都能高效处理,因此适用于各种规模的项目。
- 与 Scrapy 集成:如果您正在使用 Scrapy 框架中集成了 Parsel,因此您可以在使用 Parsel 进行解析的同时利用 Scrapy 的功能。
如何使用 Python 中的 Parsel 进行网络抓取:分步教程
在开始搜索前,请确保您的环境已为 Parsel 做好准备。以下是设置 Parsel 进行网络搜刮所需的步骤:
先决条件
- Python:确保您有 Python 3.10.1 或更高版本。
- 虚拟环境:在虚拟环境中工作是一种很好的做法,可以将依赖关系隔离开来。
要创建和激活虚拟环境,请运行以下命令:
python -m venv venv
适用于 Windows:
v venv脚本启动
适用于 macOS 和 Linux:
source venv/bin/activate
安装依赖项
现在虚拟环境已搭建完毕,请安装所需的依赖项:
pip install parsel requests
- 帕塞尔:这是解析 HTML 的主要库。
- Requests:这是一个简单的 HTTP 库,可让您请求从网页中获取 HTML 内容。我建议你也学习如何使用 请求的代理.
使用 Parsel 进行网络抓取:分步教程
让我们深入了解使用 Parsel 的刮擦过程。在本示例中,我们将从一个网站中抓取一个简单的表格。我们将指导你完成从定义 URL 到提取数据和处理分页的各个步骤。
第 1 步:定义目标 URL 并解析内容
首先导入所需的库,如用于发出 HTTP 请求的 requests 和用于解析 HTML 的 parsel。
import requests
from 解析 import 选择器
url = "https://www.example.com"
response = requests.get(url)
selector = Selector(text=response.text)
上面的代码定义了要抓取的 URL,使用 requests.get() 获取页面内容,并使用 Parsel 的 Selector() 解析内容。
步骤 2:从表中提取数据
假设目标网页包含一个数据表,如运动队列表。检查 HTML 后,您发现表格的类为 .table,而行则标记为 .team 类。
要选择表格的所有行,请使用 CSS 选择器:
行 = selector.css("table.table tr.team")
这样就选中了表格中所有带有团队类别的行。现在,您可以循环浏览这些行,提取必要的数据。
步骤 3:从每行提取数据
表格中的每一行都包含多列数据。例如,球队名称位于 .name 类的元素中,获胜场数位于 .wins 类中。下面是提取数据的方法:
data = []
for row in 行:
name = row.css("td.name::text").get()
year = row.css("td.year::text").get()
wins = row.css("td.wins::text").get()
losses = row.css("td.losses::text").get()
pct = row.css("td.pct::text").get()
data.append({
"name": name.strip()、
"year": year.strip()、
"赢": wins.strip()、
"损失": losses.strip()、
"pct": pct.strip()、
})
print(data)
这里,.css("td.name::text").get() 从带有 name 类的 td 元素中提取文本内容。 .strip() 用于删除前导和尾部空白。
步骤 4:处理分页
如果网站有多个数据页面,则需要处理分页。分页链接通常包含在 ul.pagination 元素中。您可以使用以下函数抓取所有页面的 URL:
from urllib.parse import URLjoin
def get_all_page_urls(base_url="https://www.example.com"):
response = requests.get(base_url)
selector = Selector(text=response.text)
page_links = selector.css("ul.pagination li a::attr(href)").getall()
full_urls = [urljoin(base_url, link) for link in 页面链接]
return 满耳
该函数可检索分页链接,并返回每个页面的完整 URL 列表。然后,您就可以逐一抓取每个页面。
page_urls = get_all_page_urls()
data = []
for url in page_urls:
page_data = scrape_page(url) # 为每个页面调用刮擦功能
data.extend(page_data)
print(data)
步骤 5:合并所有内容
现在,让我们将所有内容整合在一起。下面是一个完整的脚本,可以从多个页面中获取数据:
import requests
from 解析 import 选择器
from urllib.parse import URLjoin
def scrape_page(url):
response = requests.get(url)
selector = Selector(text=response.text)
数据 = []
行 = selector.css("table.table tr.team")
for row in 行:
name = row.css("td.name::text").get()
year = row.css("td.year::text").get()
wins = row.css("td.wins::text").get()
losses = row.css("td.losses::text").get()
pct = row.css("td.pct::text").get()
data.append({
"name": name.strip()、
"year": year.strip()、
"赢": wins.strip()、
"损失": losses.strip()、
"pct": pct.strip()、
})
return data
def get_all_page_urls(base_url="https://www.example.com"):
response = requests.get(base_url)
selector = Selector(text=response.text)
page_links = selector.css("ul.pagination li a::attr(href)").getall()
full_urls = [urljoin(base_url, link) for link in 页面链接]
return 满耳
# 搜索所有网页
page_urls = get_all_page_urls()
data = []
for url in page_urls:
page_data = scrape_page(url)。
data.extend(page_data)
print(data)
高级网络抓取方案
除了基本的网络搜刮功能外,您可能还会遇到需要额外功能的更高级场景。
1.通过文本选择元素
有时,您需要根据文本内容提取元素。例如,您可能想查找包含 "test "一词的所有段落。您可以使用 XPath 来做到这一点:
测试段落 = selector.xpath("//p[包含(文本(),'测试')]/文本()").getall()
这将选择文本中包含 "测试 "一词的所有段落。
2.使用正则表达式
Parsel 还支持使用正则表达式过滤数据。例如,您可以使用 re:test() 只提取符合特定模式的元素,如电话号码或电子邮件地址。
电子邮件 = selector.xpath("//p[re:test(text(), '[a-zA-Z0-9._% -] @[a-zA-Z0-9.-] \.[a-zA-Z]{2,}')]/text()").getall()
这将提取包含电子邮件地址的段落。
3.浏览 HTML 树
您可以使用 XPath 浏览 HTML 树并选择父元素或同级元素。例如,要获取特定元素的父元素,可使用
parent_of_p = selector.xpath("//p/parent::*").get()
这将选择 p 标签的父元素。
结论
现在,您已经对如何使用 Parsel 在 Python 中进行网络搜刮有了扎实的了解。您已经学会了如何使用 CSS 选择器和 XPath 提取数据、处理分页以及处理更复杂的刮擦任务。Parsel 的功能使其成为一款强大而简单的工具,可用于数据搜刮和项目自动化。
请记住,网络搜索应始终遵循道德规范。在对网站进行搜索前,请查看其服务条款,以确保您没有违反任何规则或法律。负责任的网络搜索可确保您的项目顺利进行且合法合规,因此在提取数据时应始终牢记相关准则。