Python 请求分页以抓取多个页面

Python 请求分页以抓取多个页面

在本文中,我将逐步向你展示如何处理分页和从多个页面中抓取数据,以便你能获得所需的完整数据集。

什么是网络抓取?

网页抓取是从网站中提取数据的过程。Python 提供了诸如 requests 之类的库用于发起 HTTP 请求以访问网页,以及 BeautifulSoup 用于解析 HTML 并提取所需内容。抓取简单网站很容易,但许多现代网站会使用分页把内容分散到多个页面中。如果你不知道如何处理分页,就可能只抓到单个页面的数据,而漏掉其余内容。

为什么分页很重要?

在扫描数据时,网站通常会将信息分割到多个页面,以避免一次性加载所有内容,从而降低页面性能。例如,一个电子商务网站可能会列出数千种产品,每种产品都有自己的页码。分页可以确保用户浏览不同页面,查看更多产品。对于网页抓取来说,这意味着要收集所有产品,就需要逐个抓取每个页面并抓取数据。

处理分页的更智能方法 🚀🧠

虽然 Python 的 requests 该库非常适合抓取简单的分页网站,但当页面使用 JavaScript、无限滚动或 "加载更多 "按钮动态加载内容时,该库就显得力不从心了。这时 扫描浏览器 进来!🖥️✨

Scraping 浏览器就像一个真正的浏览器--它会像人一样加载 JavaScript、滚动、点击和浏览页面。因此,它非常适合处理复杂的分页方案,这些方案包括 requests 单靠它无法处理。而且,它针对大规模抓取进行了优化,内置代理管理和会话控制。🌍🔄

如果你在抓取现代网站,并且需要一种更可靠的方式来处理分页,使用抓取浏览器可以帮你节省大量时间和精力。

不同类型的分页

在开始刮分之前,了解网站上常见的分页类型非常重要:

  1. 带页码的经典分页:这是最常见的分页形式。URL 通常包括页码(如 page=2 或 /page/2/)。网站将在每页显示一定数量的项目,用户可点击页码浏览下一组结果。
  2. 下一页按钮:有些网站使用 "下一页 "按钮进入下一页。页面 URL 保持不变,但网站会根据页码更改内容。
  3. 无限滚动:这种技术用于在向下滚动时加载内容的网站。它可以在不更改页面或 URL 的情况下动态加载新内容。
  4. 加载更多按钮:使用 "加载更多 "按钮的网站允许用户点击按钮加载更多内容,而不是转到新页面。

为网络抓取设置 Python

在开始刮削之前,让我们先确保已准备好所需的工具:

安装所需程序库:首先,我们需要安装两个库:requests 和 beautifulsoup4。你可以使用以下命令进行安装:

pip install requests
pip install beautifulsoup4

导入图书馆:安装完成后,我们就可以将它们导入脚本。Requests 将处理向网站发出的 HTTP 请求,BeautifulSoup 将解析 HTML 并允许我们提取特定元素。

import requests
from bs4 import BeautifulSoup

从多个页面抓取数据

现在,让我们来浏览一下具有多个分页的网站。在这个示例中,我们假设要扫描一个虚构的电子商务网站,该网站在多个页面上列出了产品。我们将检索产品名称和价格。

步骤 1:检查网站

在编写任何代码之前,您需要了解网站的结构。在浏览器中打开网站,右键单击页面,选择 "检查 "查看 HTML 结构。查找包含产品列表和分页控件(如页码或下一页按钮)的部分。

分页链接通常出现在 HTML

<航行 class="分页">
<a href="page/1">1</a>
<a href="page/2">2</a>
<a href="page/3">3</a>
<a href="下一个" class="下一个">Next</a>
</航行>

在这种情况下,我们可以使用 "下一页 "链接移动到下一页,页码可以用来确定总页数。

第 2 步:扫描第一页

让我们从抓取第一页开始。我们将编写一个函数,请求网站、解析 HTML 并提取产品名称和价格。

def scrape_page(url):
response = requests.get(url)
if response.status_code != 200:
print(f "检索页面失败: {response.status_code}")
return
soup = BeautifulSoup(response.text、 html.parser)
product_cards = soup.find_all(div, class_=产品卡)
for product in 产品卡
name = product.find('h2', class_=产品标题).text
price = product.find(`'跨度'`, class_='价格').文本
print(f "名称: {name}, 价格: {价格}")

在这段代码中,我们向页面发送请求,检查请求是否成功,然后使用 BeautifulSoup 解析内容。然后,我们找到所有产品卡并提取产品名称和价格。

步骤 3:处理分页

现在我们可以抓取第一页了,我们需要处理分页问题。带有 "下一页 "链接的网站通常会包含下一页的 URL。我们可以修改函数,使其跟随 "下一页 "链接并抓取下一页。让我们添加一些逻辑来处理这个问题。

def scrape_all_pages(start_url):
url = start_url
while url:
print(f "扫描页面: {url}")
scrape_page(url)
# 获取下一页 URL
response = requests.get(url)
soup = BeautifulSoup(response.text、 html.parser)
next_page = soup.find('a', class_=下一个)
if next_page:
url = next_page.get(href)
else:
print("没有更多的页面可刮")
break

在这个函数中,我们从给定的 URL 开始抓取。抓取内容后,我们会检查是否存在“下一页”链接。如果存在,就继续跟踪该链接抓取下一页。循环会一直持续到没有更多页面可抓取为止。

第 4 步:扫描所有页面

现在,我们有了一个可以抓取所有页面的函数,我们可以用第一页的起始 URL 调用它。下面是运行搜索器的方法:

start_url = 'https://example.com/products'
scrape_all_pages(start_url)

这将从第一页开始刮擦,直到刮擦完所有页面。

高级分页技术

更改 URL 中的页码

有些网站直接在 URL 中使用页码(例如:、 https://example.com/products?page=2). 在这种情况下,我们只需更改 URL 中的页码,即可遍历所有页面。具体方法如下

def 按页码搜索(起始URL, 总页数):
for page in range(1, 总页数   1):
url = f"{start_url}?page={页}"
print(f "扫描页面: {url}")
scrape_page(url)

在该函数中,我们遍历指定数量的页面,并通过追加页码为每个页面构建 URL。然后,我们刮取该页面并转到下一页。

无限滚动和 AJAX 请求

有些网站使用无限滚动功能,在你向下滚动页面时加载更多内容。这些内容通常通过 AJAX 请求动态加载。要抓取这些页面,我们需要观察浏览器在滚动时发出的网络请求。

您可以在浏览器的开发工具(网络选项卡)中监控这些请求。一旦确定了获取更多内容的请求 URL,就可以在 Python 中使用加载额外数据的请求来模拟这些请求。

def scrape_infinite_scroll(url):
页 = 1
while True:
# 为下一批内容构建 URL
request_url = f"{url}?page={页}"
response = requests.get(request_url)
if response.status_code != 200:
print("检索更多数据失败"。)
break
data = response.json() # 假设数据以 JSON 格式返回
for product in 数据[项目]:
print(f "名称: {产品['名称']}, 价格: {产品['价格']}")
if not 数据[更多]:
print("没有更多的东西要刮了")
break
页 = 1

在本例中,我们向每个数据页面的动态 URL 提出 HTTP 请求。响应假定为 JSON 格式,包含产品信息和一个标志(has_more),表示是否有更多数据需要加载。

处理 "加载更多 "按钮

有些网站使用 "加载更多 "按钮来代替分页链接。您可以通过向相应的 URL 或 API 端点发送请求来模拟按钮点击,就像无限滚动一样。监控网络请求,了解点击按钮后网站如何加载更多内容。

处理分页是网页抓取中的一项基本技能。无论是简单的基于页码的分页,还是更复杂的“加载更多”按钮或无限滚动,关键都在于仔细观察网站结构,并理解新内容是如何加载的。使用 Python 的 requests 和 BeautifulSoup 库,你可以自动化抓取多个页面的过程,并收集所需的数据。

通过应用本文讨论的技术,你可以高效地从分页网站上抓取内容。只需记住尊重网站的服务条款,避免在短时间内向其服务器发出过多请求。

 

类似文章