在网络抓取中掌握分页方法

掌握网络抓取中的分页:完全指南

在本指南中,我们将深入探讨分页,为什么分页对网络搜刮很重要,最重要的是,如何顺利解决分页问题。在本指南结束时,你将能够自信地从多页面网站中刮取数据,而不会感到不知所措。让我们一起来解决分页问题。

处理分页的自动化解决方案

无论是代理服务还是全自动 API,这 3 项服务都能帮助你完成分页搜索的每一个步骤:

  1. Bright Data - 最适合高级搜索;具有广泛的代理管理和可靠的应用程序接口。
  2. Octoparse - 用户友好的无代码工具,用于从网站自动提取数据。
  3. ScrapingBee - 面向开发人员的应用程序接口,可高效处理代理、浏览器和验证码。

我与其中任何一家都没有任何关系。

什么是分页?

电子商务平台、招聘网站和社交媒体等网站使用分页来处理大量数据。在一个页面上显示所有内容会减慢下载速度并占用过多内存。分页将内容分割到多个页面,使其更易于管理。它还增加了简单的导航功能,如 "下一页 "按钮、页码或自动滚动。这样就能保持浏览的快速性和有序性。分页可确保用户快速找到所需内容,而不会使系统不堪重负。

分页类型

分页的复杂程度各不相同。它既有简单的方法,也有更高级的技术,如无限滚动。根据我的经验,我总结出了网站常用的三种主要分页方式:

  1. 编号页码: 这种方法允许用户使用编号链接浏览不同的页面。用户点击编号,即可看到不同的内容集。
  2. 点击加载分页: 在这种方法中,用户点击一个按钮,如 "加载更多",即可显示更多内容。这样就能更有控制地加载数据。
  3. 无限滚动: 利用无限滚动功能,内容会随着用户向下滚动页面而自动加载。这就创造了一种无缝浏览体验,而无需点击页面。

编号分页

编号分页使用离散的页面链接,通常显示在网站底部,允许用户直接从一个页面跳转到另一个页面。这种方法是最容易采集的方法之一,因为 URL 通常是递增变化的(例如,/page=2、/page=3),因此可以直接通过编程迭代页面。

要抓取带编号分页的网站,我们需要

  • 识别基本 URL 和 URL 模式。
  • 在循环中递增页面参数,直到达到最后一页。

使用 Python 的 BeautifulSoup 示例:

import requests
from bs4 import BeautifulSoup
base_url = "https://example.com/items?page="
page_num = 1
while True:
response = requests.get(base_url +) str(page_num))
if response.status_code != 200:
break
soup = BeautifulSoup(response.text、 html.parser)
# Extract the data you need from soup object here
print(f"Scraping page {page_num}...")
# If no next page link or last page is reached, exit loop
if not soup.find('a', {'class': 'next-page'}):
break
page_num += 1

在上述代码中,爬虫会继续递增 page_num 变量并爬取每个页面,直到找不到 "下一页 "按钮为止。

挑战:

  • 有些网站可能有动态页码或使用 JavaScript 加载内容。
  • 并非所有编号分页都能在 URL 中看到;有时会涉及 AJAX 调用,需要进行更深入的检查。

点击加载分页

点击加载分页通常以 "加载更多 "按钮的形式实现,动态加载同一页面上的新内容。这就要求搜刮器反复模拟点击事件,以加载所有可用内容。

使用 Selenium 处理点击加载分页:

由于点击加载分页通常依赖于 JavaScript,因此使用 Selenium 或 Playwright 等工具非常有效。这些工具允许我们与页面元素交互并加载所需的内容。

使用 Selenium 的示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://example.com/items")
while True:
try:
load_more_button = driver.find_element(By.XPATH、 "//button[text()='Load More']")
load_more_button.click()
time.sleep(2) # Give time for content to load
except:
break
# After loading all items, scrape the data
items = driver.find_elements(By.CLASS_NAME、 "item")
for item in items:
print(item.text)
driver.quit()

在上面的示例中,使用 find_element 方法找到 "加载更多 "按钮,然后调用 click() 加载更多内容,直到按钮不再出现。

挑战:

  • 需要与 JavaScript 交互。
  • 多次点击可能会触发费率限制或验证码。

无限滚动

无限滚动会在用户向下滚动时自动加载更多内容,因此无需分页按钮。虽然这对用户来说很方便,但由于依赖 JavaScript 和动态加载的内容,它使网络搜索变得更加复杂。

与剧作家一起处理无限卷轴:

Playwright 支持基于 Chromium 浏览器的自动化,可以处理无限滚动。这种技术包括模拟用户的滚动操作,直到不再加载内容为止。

使用剧作家的示例:

import asyncio
from playwright.async_api import async_playwright
async def scroll_to_bottom(page):
while True:
previous_height = await page.evaluate("document.body.scrollHeight)
await page.evaluate("window.scrollTo(0,document.body.scrollHeight)")
await asyncio.sleep(2)
new_height = await page.evaluate("document.body.scrollHeight)
if new_height == previous_height:
break
async def scrape_infinite_scroll(url):
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto(url)
await scroll_too_bottom(page)
# Extract data after fully loading the page
content = await page.content()
print(content)
await browser.close()
asyncio.run(scrape_infinite_scroll("https://example.com/items"))

代码会向下滚动,直到不再加载内容,确保页面上的所有项目都可见,以便进行刮擦。

挑战:

  • 检测何时停止滚动并非总是那么简单。
  • 一些网站采取的措施包括 懒装在这种情况下,只有当图像在视口中可见时才会加载。

分页的挑战

在处理分页内容时,必须考虑几种风险。其中一个重大挑战是可能被网站屏蔽。有些网站可能只打开一页就会阻止访问。例如,如果您试图从亚马逊等电子商务网站抓取数据,可能会遇到验证码等障碍。

亚马逊验证码挑战

让我们向亚马逊主页提出申请,看看会发生什么。

import requests
url = "https://www.amazon.com/"
response = requests.get(url)
print(f"Status code: {response.status_code}")

在这种情况下,您可能会收到 403 状态代码.

此状态表示亚马逊已检测到您的请求来自机器人或刮擦器,从而导致验证码挑战。如果您继续发送多个请求,您的 IP 地址可能会立即被阻止。

要克服这些障碍并有效收集所需数据,可以使用 Python Requests 代理。这种技术有助于 避免 IP 禁止.此外,您还可以通过旋转用户代理来模拟真实浏览器。不过,必须注意的是,这些方法不能保证成功对抗高级僵尸检测系统。

结论

处理分页对于从分段显示内容的网站收集完整数据至关重要。在这里,我介绍了分页的主要类型:编号、点击加载和无限滚动。我还介绍了如何使用 BeautifulSoup、Selenium 和 Playwright 等工具来管理这些分页。

工具的选择取决于分页的类型。我通常可以使用简单的循环来进行编号分页,而点击加载和无限滚动则需要自动化框架来模仿用户的操作。

为了提高网络搜刮项目的可靠性,我遵循以下最佳做法 节流请求顺利处理错误和旋转代理。了解这些技术有助于我为任何分页内容创建有效的网络刮擦工具。

类似文章