电商网站抓取指南

在这份逐步指南中,学习如何使用Playwright和Bright Data的Scraping Browser抓取电商网站。
5 min read
电商网站抓取指南

在快节奏的电商世界中,保持竞争优势意味着要时刻关注竞争对手。通过网络抓取技术,从网站上提取数据是一种方法。不论你是经验丰富的开发者,还是刚涉足数据提取领域的新手,本文将帮助你了解抓取电商网站的方方面面。

你可能出于各种原因对抓取电商网站感兴趣,包括竞争分析、市场调研、价格监控、潜在客户生成或数据驱动的决策制定。

在本教程中,你将学习抓取电商网站时常见的一些挑战,以及如何使用Python库Playwright和Bright Data的Scraping Browser进行抓取。

使用本地浏览器进行网络抓取的问题

虽然编写抓取器来提取大量数据非常棒,但第一次进行时可能会遇到各种挑战。例如,使用本地浏览器时,开发者经常会遇到各种问题,影响他们的效率和效果。以下是一些最常见的问题:

  1. IP封锁:网站经常跟踪发出请求的IP地址。如果检测到来自单个IP的异常数量请求(通常在网络抓取或暴力破解中),它们可能会封锁该IP。使用本地浏览器时,所有请求都来自单个IP,这成为一个重大问题。
  2. 速率限制:许多网站实施速率限制,在给定时间内只允许来自一个IP地址的某些数量请求。如果超出此限制,进一步的请求可能会被封锁或减慢,妨碍抓取过程。
  3. 缺乏代理:没有代理池,抓取操作中的所有请求都来自同一个IP地址。这使得网站更容易检测并封锁抓取活动。相反,使用代理池可以使请求来自不同的IP地址,降低被检测到的风险。
  4. 验证码挑战:网站可能使用验证码挑战来验证用户是人类而不是机器人。本地浏览器通常缺乏自动解决这些挑战的功能,使其成为抓取工作中的一个重大障碍。
  5. 动态网站内容:许多现代网站使用JavaScript动态加载内容。本地浏览器可能难以准确抓取这些网站,因为在抓取开始之前内容可能尚未完全加载。

在使用本地浏览器进行抓取的情况下,这些问题叠加使网络抓取变得困难。缺乏高级功能,如IP轮换和自动验证码解决,会减慢抓取过程,降低收集到的数据的质量和数量。开发者必须意识到这些常见问题,并寻求工具和技术来有效地绕过它们。

下一部分将讨论Bright Data Scraping Browser如何帮助解决这些问题,使网络抓取变得更加顺畅和高效。

如何使用Bright Data Scraping Browser进行抓取

在网络抓取的世界中,Bright Data作为领先的提供商脱颖而出,其核心产品之一就是其网络抓取浏览器,这是一款专为解决数据提取中的挑战而设计的工具。

Scraping Browser轻松解决任何IP封锁问题,因为它可以访问庞大的住宅和移动IP池。这意味着你可以轮换IP并模拟有机用户行为,显著降低被封锁的风险。

同样,利用Bright Data的广泛IP池,Scraping Browser可以在多个IP间分配请求,有效缓解速率限制问题。此外,使用Scraping Browser,你可以获得自动代理管理。这意味着Scraping Browser处理代理轮换,确保抓取活动不需要手动干预。

Scraping Browser还提供高级浏览器指纹保护,使你可以模拟真实用户。这使得网站更难检测和封锁你的抓取工作:

抓取浏览器 CP

考虑到这些功能,深入学习教程,了解如何使用Bright Data Scraping Browser抓取电商网站。这里你将使用Python作为编程语言。

步骤1:设置新的Python项目

本教程的第一步是设置一个新的Python项目。这是你执行抓取任务的工作区。你可以使用任何文本编辑器或集成开发环境(IDE)。

此外,确保你的机器上已安装Python。你可以通过在终端中输入python --version确认。如果安装了Python,该命令会显示其版本。如果没有,需要安装Python

确保已安装Python后,创建项目目录。打开终端,导航到你希望项目所在的位置,然后输入以下命令:

mkdir ecommerce-scraping   # This command creates a new directory named ecommerce-scraping.
cd ecommerce-scraping      # This command navigates into the newly created directory.
python -m venv env         # This command creates a new virtual environment in your project directory.
source env/bin/activate    # This command activates the virtual environment.

创建虚拟环境是个好习惯,因为它将你的项目及其依赖关系与其他Python项目隔离,防止不同版本的库之间发生冲突。

步骤2:在项目中导入Playwright

Playwright是一个用于自动化和测试Web浏览器的Python库。你将使用它来控制你的Scraping Browser。

要安装Playwright,使用pip,这是Python的包安装器:

pip install playwright

安装Playwright后,需要运行playwright install命令。这会下载Playwright需要的浏览器二进制文件:

playwright install

步骤3:创建新的Bright Data账户

接下来,你需要一个Bright Data账户。如果你还没有,前往Bright Data网站注册。注册后,你可以创建和管理你的Scraping Browser实例,并获取你的唯一凭据:

Bright Data注册凭证

步骤4:创建新的Scraping Browser实例

拥有Bright Data账户后,登录并导航到Scraping Browser部分,在这里你可以创建一个新的Scraping Browser实例。

记录你的Host ID,因为在连接到Scraping Browser时需要用到:

抓取浏览器设置

步骤5:连接到Scraping Browser实例

现在是时候将Playwright连接到你的Scraping Browser实例了。Bright Data在其文档中提供了一个示例脚本,你可以用它作为起点。记得用你实际的Bright Data凭据和你创建的Scraping Browser实例的ID替换YOUR_ZONE_USERNAMEYOUR_ZONE_PASSWORDYOUR_ZONE_HOST

import asyncio
from playwright.async_api import async_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting');
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected');
        page = await browser.new_page()
        print('goto')
        await page.goto('https://example.com', timeout=120000)
        print('done, evaluating')
        print(await page.evaluate('()=>document.documentElement.outerHTML'))
        await browser.close()

asyncio.run(main())

将此文件保存为main.py在你的项目目录中。然后使用以下命令运行脚本:

python main.py

该脚本启动一个新的Chromium浏览器实例并导航到你指定的URL。然后它会打印网页的内容并关闭浏览器。

此时,你已经验证了可以连接到Scraping Browser实例。由于这是你的基线脚本,快速浏览代码:

  • import asyncio, async_playwright是脚本所需的导入。asyncio是一个用于编写协程的单线程并发代码库,async_playwright是Playwright库的异步API。
  • auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'通过利用你的区域的用户名和密码设置Bright Data Scraping Browser的身份验证。
  • browser_url = f'wss://{auth}@YOUR_ZONE_HOST构建连接到Bright Data Scraping Browser的WebSocket URL。
  • browser = await pw.chromium.connect_over_cdp(browser_url)使用Chromium浏览器连接到Bright Data Scraping Browser。await关键字在连接建立之前暂停函数执行。
  • await page.goto('https://example.com', timeout=120000)导航页面到指定的URL。timeout参数指定在抛出错误之前等待导航完成的时间。
  • print(await page.evaluate('()=>document.documentElement.outerHTML'))在页面上下文中评估JavaScript代码并打印结果。在这种情况下,JavaScript代码返回整个页面的HTML内容。

步骤6:抓取电商网站

连接到Scraping Browser实例后,你已经准备好开始抓取了。在本教程中,你将抓取Books to Scrape,这是一个允许抓取的沙箱电商网站。

打开你的main.py文件并替换以下代码;然后在终端中运行脚本:

import asyncio
from playwright.async_api import async_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting');
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected');
        page = await browser.new_page()
        print('goto')
        await page.goto('https://books.toscrape.com', timeout=120000)
        print('done, evaluating')
        print(await page.evaluate('()=>document.documentElement.outerHTML'))
        await browser.close()

asyncio.run(main())

你会看到Books to Scrape主页的内容被打印出来。此时,运行这个脚本不会返回任何有用的信息;你只会得到目标网站的全部HTML内容。

步骤7:提取结构化信息

为了使本教程更有用,提取一些结构化数据。这个过程因你感兴趣的具体数据而异,但在这个例子中,提取主页上的书名和价格。

首先检查books.toscrape.com主页,确定包含书名和价格的HTML元素。书名在<h3>标签内,价格在相同<article>标签内的<p class="price_color">标签内。

以下是修改脚本以提取这些信息的方法:

from playwright import sync_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting')
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected')
        page = await browser.new_page()
        print('goto')
        await page.goto('https://books.toscrape.com', timeout=120000)
        print('done, evaluating')

        # Find all the books in the article elements
        books = await page.query_selector_all('article.product_pod')

        # Extract and print each book details in a loop
        async def get_book_details(book):
            # Extract and print book name and price
            book_name_element = await book.query_selector('h3 > a')
            book_name = await book_name_element.get_attribute('title')
            book_price_element = await book.query_selector('div.product_price > p.price_color')
            book_price = await book_price_element.inner_text()
            print(f'{book_name}: {book_price}')

        # Use asyncio.gather() to execute all async calls concurrently
        await asyncio.gather(*(get_book_details(book) for book in books))

        await browser.close()

asyncio.run(main())

当你运行这个脚本时,你会看到一个书名及其价格的列表打印在你的终端中。看起来像这样:

运行脚本后的代码

这是一个非常简单的例子,但它展示了如何使用Playwright和Bright Data提取网站上的结构化数据。你可以调整这个脚本,以抓取不同页面或网站的不同类型的数据。

现在,进一步生成包含抓取数据的CSV文件。

步骤8:将抓取的数据保存到CSV文件

为了将抓取的数据保存到CSV文件,需要导入csv模块,并在main()函数中创建一个新的CSV文件。然后可以在get_book_details()函数中写入抓取的数据。

打开你的main.py文件并添加以下代码:

import asyncio
import csv
from playwright.async_api import async_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting')
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected')
        page = await browser.new_page()
        print('goto')
        await page.goto('https://books.toscrape.com', timeout=120000)
        print('done, evaluating')

        # Find all the books in the article elements
        books = await page.query_selector_all('article.product_pod')

        async def get_book_details(book):
            # Extract book name and price
            book_name_element = await book.query_selector('h3 > a')
            book_name = await book_name_element.get_attribute('title')
            book_price_element = await book.query_selector('div.product_price > p.price_color')
            book_price = await book_price_element.inner_text()

            return book_name, book_price

        # Use asyncio.gather() to execute all async calls concurrently
        book_details = await asyncio.gather(*(get_book_details(book) for book in books))

        # Write book details to a CSV file
        with open('books.csv', 'w', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['Book Name', 'Price'])  # Write header
            writer.writerows(book_details)  # Write book details

        await browser.close()

asyncio.run(main())

如果你运行这个脚本,你会在项目目录中看到一个名为books.csv的新文件。打开这个文件,你会看到CSV格式的抓取数据,如下所示:

使用抓取浏览器后的代码

结论

在本教程中,你学习了如何使用Playwright和Bright Data抓取电商网站的数据。本教程仅触及了使用Playwright和Bright Data Scraping Browser(一种针对使用高级反机器人检测技术的网站解锁数据收集的代理浏览器解决方案)可以完成的工作的一小部分。本文讨论的基础知识可以组合成更高级的工作流程,以自动化价格匹配、市场分析和潜在客户生成等任务 。

在幕后,Bright Data使用完整的代理基础设施,通过数百万个IP池路由你的请求。这使你能够从网站抓取数据而不会被封锁或禁止。注册免费试用,立即开始使用Scraping Browser进行实验!

想要跳过抓取电商网站,直接获取数据?购买电商数据集