如何使用 Python 搜刮 AliExpress 数据

评论: 0

从阿里巴巴(AliExpress)等网络零售商处挖掘信息对于收集产品信息、监控价格波动、收集评论等都大有裨益。在本文中,我们将探讨获取产品信息(如名称、价格、评级等)的过程,并对产品评论进行审查。我们还将演示如何通过传递产品 URL、自动检索产品 ID 并将数据保存到 CSV 文件中来使搜刮器动态化。

本教程将使用 Playwright 渲染动态内容并请求获取评论数据。我们还将确保刮板符合道德规范和最佳实践。

要求

开始之前,请确保已安装以下 Python 库:

  • Playwright: 用于与浏览器交互并呈现动态内容。
  • Requests: 用于通过 AliExpress API 获取评论。
  • lxml: 用于解析 HTML 内容。
  • Pandas: 用于将数据保存到 CSV 文件。

运行以下命令即可安装这些软件包:


# 安装 Playwright
pip install playwright


# 安装 Requests
pip install requests


# 安装用于解析 HTML 的 lxml
pip install lxml


# 安装用于数据处理和保存的 Pandas
pip install pandas

安装 Playwright 后,还需要安装所需的浏览器二进制文件:


playwright install

这将下载并设置必要的浏览器,以便 Playwright 正常运行。

第 1 步。使用 Playwright 发送请求

AliExpress 的产品页面是动态的,这意味着它们通过 JavaScript 加载内容。为了处理这个问题,我们将使用 Playwright,这是一个允许您控制无头浏览器并与动态内容交互的 Python 库。

以下是您发送请求并导航到产品页面的方法:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # 如果需要,使用代理启动浏览器(如果不使用代理,则可移除)。
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # 提取页面内容
        content = await page.content()
        await browser.close()
        
        return content

# URL 示例
url = 'https://www.aliexpress.com/item/3256805354456256.html'

第 2 步。提取产品数据

获得页面内容后,我们可以使用 lxml 和 XPath 查询提取产品数据。我们将收集产品标题、价格、评级、评论数和已售商品数等详细信息。


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # 使用 XPath 提取产品详细信息
    title = parser.xpath('//h1[@data-pl="product-title"]/text()')[0].strip()
    price = parser.xpath('//div[@class="price--current--I3Zeidd product-price-current"]/span/text()')[0].strip()
    rating = ' '.join(parser.xpath('//a[@class="reviewer--rating--xrWWFzx"]/strong/text()')).strip()
    total_reviews = parser.xpath('//a[@class="reviewer--reviews--cx7Zs_V"]/text()')[0].strip()
    sold_count = parser.xpath('//span[@class="reviewer--sold--ytPeoEy"]/text()')[0].strip()

    product_data = {
        'title': title,
        'price': price,
        'rating': rating,
        'total_reviews': total_reviews,
        'sold_count': sold_count
    }

    return product_data


该代码使用 XPath 从页面的 HTML 内容中提取相关产品的详细信息。

步骤 3.搜索产品评论

AliExpress 有一个单独的 API 端点用于获取产品评论。您可以从 URL 中动态提取产品 ID,并通过请求获取评论。在此功能中

  1. 产品 ID 是动态从产品 URL 中提取的。
  2. 我们使用阿里巴巴评论 API 获取评论。
  3. 提取评论文本并以列表形式返回。

import requests

def extract_product_id(url):
    # 从 URL 中提取产品 ID
    product_id = url.split('/')[-1].split('.')[0]
    return product_id

def scrape_reviews(product_id, page_num=1, page_size=10):
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'en-IN,en;q=0.9',
        'referer': f'https://www.aliexpress.com/item/{product_id}.html',
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    }

    params = {
        'productId': product_id,
        'lang': 'en_US',
        'country': 'US',
        'page': str(page_num),
        'pageSize': str(page_size),
        'filter': 'all',
        'sort': 'complex_default',
    }

    response = requests.get('https://feedback.aliexpress.com/pc/searchEvaluation.do', params=params, headers=headers)
    reviews = response.json()['data']['evaViewList']

    # 仅提取审查文本
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

第 4 步。将数据保存到 CSV 文件中

在获取产品详细信息和评论后,我们使用 pandas 库将数据保存到 CSV 文件中。


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # 将产品详细信息保存为 CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # 将评论保存为 CSV
    df_reviews = pd.DataFrame({'reviews': reviews})
    df_reviews.to_csv(f'product_{product_id}_reviews.csv', index=False)
    
    print(f"Data saved for product {product_id}.")

产品详细信息和评论将保存到单独的 CSV 文件中,文件名中包含产品 ID,以便于识别。

步骤 5.动态产品 ID 检索

以下是完整动态工作流程的工作原理:

  1. 传递任何 AliExpress 产品 URL。
  2. 产品 ID 从 URL 中提取。
  3. 刮板获取产品数据和评论。
  4. 数据保存为 CSV 文件,其中包含产品 ID。

# 从 URL 中提取产品 ID
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

最终完整代码


from playwright.async_api import async_playwright
from lxml.html import fromstring
import requests
import pandas as pd

# 使用 Playwright 获取页面内容
async def get_page_content(url):
    async with async_playwright() as p:
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# 提取产品数据
def extract_product_data(content):
    parser = fromstring(content)
    title = parser.xpath('//h1[@data-pl="product-title"]/text()')[0].strip()
    price = parser.xpath('//div[@class="price--current--I3Zeidd product-price-current"]/span/text()')[0].strip()
    rating = ' '.join(parser.xpath('//a[@class="reviewer--rating--xrWWFzx"]/strong/text()')).strip()
    total_reviews = parser.xpath('//a[@class="reviewer--reviews--cx7Zs_V"]/text()')[0].strip()
    sold_count = parser.xpath('//span[@class="reviewer--sold--ytPeoEy"]/text()')[0].strip()

    return {
        'title': title,
        'price': price,
        'rating': rating,
        'total_reviews': total_reviews,
        'sold_count': sold_count
    }

# 从 URL 中提取产品 ID
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# 搜索评论
def scrape_reviews(product_id, page_num=1, page_size=10):
    headers = {
        'accept': 'application/json, text/plain, */*',
        'referer': f'https://www.aliexpress.com/item/{product_id}.html',
        'user-agent': 'Mozilla/5.0'
    }
    params = {
        'productId': product_id,
        'lang': 'en_US',
        'page': str(page_num),
        'pageSize': str(page_size),
    }
    response = requests.get('https://feedback.aliexpress.com/pc/searchEvaluation.do', params=params, headers=headers)
    reviews = response.json()['data']['evaViewList']
    return [review['buyerFeedback'] for review in reviews]

# 将产品数据和评论保存为 CSV
def save_to_csv(product_data, reviews, product_id):
    pd.DataFrame([product_data]).to_csv(f'product_{product_id}_data.csv', index=False)
    pd.DataFrame({'reviews': reviews}).to_csv(f'product_{product_id}_reviews.csv', index=False)
    print(f'Saved into: product_{product_id}_data.csv')
    print(f'Saved into: product_{product_id}_reviews.csv')

# 主要功能
async def main(url):
    content = await get_page_content(url)
    product_data = extract_product_data(content)
    product_id = extract_product_id(url)
    reviews = scrape_reviews(product_id)
    save_to_csv(product_data, reviews, product_id)

# 运行刮刀
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

伦理考虑因素

刮擦数据时,遵守道德准则非常重要:

  1. 尊重 AliExpress 的服务条款:刮擦网站之前,请务必查看服务条款。避免违反其规则,以防被禁用。
  2. 限制您的请求:在短时间内发送过多请求会导致其服务器超载。考虑在请求之间增加延迟。
  3. 避免个人数据:未经适当同意,请勿收集或搜索个人信息。

遵循这些指导原则将有助于您以道德和负责任的方式进行搜刮,从而将用户和 AliExpress 系统的风险降至最低。

评论:

0 评论