如何使用 Python 搜刮沃尔玛数据指南

评论: 0

商业智能、研究和分析仅仅是网络搜索所带来的无限可能性中的一小部分。像沃尔玛这样成熟的商业实体为我们收集必要的信息提供了一个完美的结构。我们可以使用各种刮擦技术,从沃尔玛的众多网站中轻松刮擦名称、价格和评论信息等数据。

在这篇文章中,我们将详细介绍:如何刮取沃尔玛数据。我们将使用 requests 发送 HTTP 请求,使用 lxml 解析返回的 HTML 文档。

为什么使用 Python 抓取沃尔玛数据?

在多个零售网站上搜索产品数据时,Python 是最有效的选择之一。下面介绍它如何无缝集成到提取项目中:

  1. 高级库。有了用于网络交互的请求和用于 HTML 解析的 lxml,你就可以极其轻松有效地搜索庞大的在线目录。
  2. 易于使用。由于语法简单易用,用户几乎不需要任何经验就能对数据检索流程进行编程,从而直接开展业务。
  3. 社区支持。零售网站的复杂性意味着有大量的合格资源和社区支持来帮助你解决出现的问题。
  4. 处理数据。深入分析。借助用于处理数据的 Pandas 和用于可视化表示的 Matplotlib,Python 可以让用户在更大范围内分析数据,如收集和分析。
  5. 动态内容管理。有了 Selenium,与动态网页元素的交互成为可能,这确保了广泛的数据收集,甚至是从 JavaScript 加载的网页中收集数据。
  6. 有效扩展。Python 能够管理海量和微小的数据集,即使在进行大量数据提取活动时,也能长时间保持出色的性能。

在零售业项目中使用这种语言,不仅可以简化技术方面的工作,还可以提高效率,扩大分析范围,使其成为旨在深入了解市场的专家的首选。这些方面在决定搜索沃尔玛数据时可能特别有用。

现在,让我们从构建沃尔玛网络搜刮工具开始。

设置搜索沃尔玛数据的环境

首先,确保计算机上安装了 Python。可以使用 pip 下载所需的库:


pip install requests
pip install  lxml
pip install urllib3

现在,让我们导入这些库:

  • requests - 通过 HTTP 获取网页;
  • lxml - 用于生成 HTML 文档树;
  • CSV - 用于将收集的数据写入 CSV 文件;
  • random - 用于选择代理和用户代理字符串。

import requests
from lxml import html
import csv
import random
import urllib3
import ssl

定义产品 URL

可以像这样添加产品 URL 列表,以刮取沃尔玛数据。


product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

用户代理字符串和代理

在对沃尔玛进行网络搜刮时,为了模仿真实的浏览器,必须提供正确的 HTTP 标头,尤其是 User-Agent 标头。此外,还可以通过使用旋转代理服务器来规避网站的反僵尸系统。在下面的示例中,将介绍用户代理字符串以及通过 IP 地址添加代理服务器授权的说明。


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

请求标题

请求标头的设置应能伪装成来自用户浏览器。这将大大有助于沃尔玛数据搜刮。下面是一个示例:


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

初始化数据存储

首要步骤是创建一个可接受产品信息的结构。


product_details = []

枚举 URL 页面的工作方式如下:对于每个 URL 页面,都会使用随机选择的用户代理(User-Agent)和代理发起 GET 请求。在返回 HTML 响应后,对其进行解析,以获取产品详细信息,包括名称、价格和评论。相关详细信息会保存在字典数据结构中,随后会添加到之前创建的列表中。


for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # 向 URL 发送 HTTP GET 请求
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # 使用 lxml 解析 HTML 内容
   parser = html.fromstring(response.text)
   # 提取产品标题
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # 提取产品价格
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # 提取审查详情
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # 将提取的详细信息存储在字典中
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # 将产品详细信息添加到列表中
   product_details.append(product_detail)

标题:

1.png

价格:

2.png

审查细节:

3.png

将数据保存为 CSV

  1. 创建一个新文件,文件类型指定为 CSV,并将其设置为写入模式。
  2. 指定 CSV 文件字段名(列)。
  3. 要将字典写入 CSV 文件,请创建一个 csv.DictWriter 对象。
  4. 写入 CSV 文件的标题行。
  5. 对 product_details 中的每个字典进行循环,并将字典作为一行写入 CSV 文件。

with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

完整代码

当 Web scraping Walmart 完成后,Python 的完整脚本将如下所示。这里还有一些注释,便于您理解每个部分。


import requests
from lxml import html
import csv
import random
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# 搜索沃尔玛数据的产品 URL 列表
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# 用于匿名的随机用户代理字符串
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# IP 轮换代理列表
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# 模仿浏览器请求的标头
headers = {
   'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
   'accept-language': 'en-IN,en;q=0.9',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   'sec-ch-ua-mobile': '?0',
   'sec-ch-ua-platform': '"Linux"',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'none',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
}

# 初始化一个空列表,用于存储产品详细信息
product_details = []

# 循环浏览每个产品的 URL
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # 向 URL 发送 HTTP GET 请求
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # 使用 lxml 解析 HTML 内容
   parser = html.fromstring(response.text)
   # 提取产品标题
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # 提取产品价格
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # 提取审查详情
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # 将提取的详细信息存储在字典中
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # 将产品详细信息添加到列表中
   product_details.append(product_detail)

# 将提取的数据写入 CSV 文件
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

其他建议

对于使用 Python 与沃尔玛搜索 API(Walmart scraping API)接口的用户来说,开发能够有效搜索沃尔玛价格和沃尔玛评论结果的强大方法至关重要。该 API 提供了一个直接获取大量产品数据的管道,有助于对价格和客户反馈进行实时分析。

采用这些特定策略可提高信息收集的精确度和范围,使企业能够快速适应市场变化和消费趋势。通过战略性地应用 Python 中的沃尔玛 API,企业可以优化其数据收集流程,确保进行全面的市场分析并做出明智的决策。

结论

在本教程中,我们介绍了如何使用 Python 库抓取沃尔玛数据并将其保存为 CSV 文件,以便日后进行分析。给出的脚本是基本的,可以作为一个起点,您可以对其进行修改,以提高抓取过程的效率。改进措施可能包括在请求之间添加随机时间间隔以模拟人类浏览,使用用户代理和代理掩盖机器人,以及实施高级错误处理以处理刮擦中断或失败。


评论:

0 评论