Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据

一、电商数据的作用

采集电商数据的意义在于通过系统化收集和分析运营中产生的各类信息,为企业提供决策依据、优化业务流程、提升竞争力。其核心作用可简要概括为以下方面:

1.1 支撑科学决策,降低试错成本

  • 市场洞察:通过采集行业趋势、竞品动态、用户需求等数据,帮助企业避开“拍脑袋”决策,制定符合市场规律的战略。
  • 定价优化:分析竞品价格、用户价格敏感度,动态调整定价策略,平衡销量与利润。

1.2 提升运营效率,实现降本增效

  • 供应链优化:基于销售预测和库存数据,实现“以销定产”,减少积压或缺货风险。
  • 物流优化:通过订单分布和配送路径数据,缩短配送时间,降低物流成本。

1.3 深化用户理解,驱动个性化服务

  • 用户画像构建:采集浏览、购买、评价等行为数据,精准定位用户需求,实现个性化推荐和精准营销。
  • 体验提升:分析用户反馈和客服数据,优化产品功能和服务流程,增强用户粘性。

1.4 监测竞品动态,制定差异化策略

  • 竞品分析:实时跟踪竞品价格、促销活动、营销策略,快速响应市场变化,避免同质化竞争。
  • 机会挖掘:通过竞品数据发现市场空白点,为产品创新或细分市场拓展提供方向。

1.5 驱动产品创新,满足用户需求

  • 反馈闭环:通过用户评价、退货原因等数据,发现产品痛点,指导产品迭代和功能优化。
  • C2M定制:基于用户需求数据反向定制产品,降低库存风险,提升市场响应速度。

二、爬取目标

本次的爬取目标是亚马逊电商网站中,苹果最新发布的AirPods Pro3商品信息,字段如下:商品标题、价格、品牌、颜色、耳部放置、外型规格、噪音控制、型号名称、连接技术、无线通信技术、随附部件、商品具体用途、产品的推荐用途、兼容的设备、控制类型、线缆特征、防水级别、控制方法、商品数量、控制器类型、UPC、特殊功能、制造商、包装尺寸、商品重量、ASIN、型号、电池、上架时间、箱内物品:

alt

三、环境准备

Python:3.10

编辑器:PyCharm

第三方模块,自行安装:

pip install requests # 爬虫模块
pip install lxml # 解析网页模块
pip install pandas # 数据处理模块

四、NetNut网页解锁器介绍

4.1 特点

1、先进的反反爬虫技术:有效绕过网站实施的反抓取措施 2、自动轮换IP管理:根据网站复杂程度动态轮换IP地址 3、验证码解决能力:解决验证码,模仿真实用户行为 4、自定义 HTTP 标头管理:适应特定于站点的要求以提高抓取效率

alt

4.2 免费申请

1、打开官网选择注册(Netnut代理IP):

alt

2、注册登录好以后来到控制面板,切换语言为中文:

alt

3、点击集成示例:

alt

4、产品有五种可以供我们选择,这里我们用Web Unblocker(网页解锁器)进行测试: Datacenter:数据中心IP Residential:住宅IP Static Residential:静态住宅IP Mobile:移动IP Web Unblocker:网页解锁器

alt

5、一共有100多个国家代理地址可以供我们选择,可以满足各种跨国业务需求,真的太棒了:

alt

6、选择Python代码进行复制,后续替换代码中的用户名和密码即可:

alt

7、封装为一个函数方便调用,注意这里需要替换为你自己的NetNut代理用户名和密码:

def get_ip():
    proxies = {
        "http": "http://你的用户名:你的密码@unblocker.netnut.io:5959",
        "https": "http://你的用户名:你的密码@unblocker.netnut.io:5959"
    }
    return proxies

五、使用网页解锁器实战

5.1 导入模块

import requests  # python基础爬虫库
from lxml import etree  # 可以将网页转换为Elements对象
import pandas as pd  # pandas,用于写入Excel文件

5.2 发送请求获取网页源码

(1)我们先来试试不使用网页解锁器发送请求:

def get_html_str(url):
    """不使用网页解锁器"""
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.559.400 QQBrowser/19.6.6683.400'
    }
    response = requests.get(url, headers=headers, verify=False)
    html_str = response.text
    print(html_str)
    return html_str

可以看到返回的网页源码特别短,且没有我们需要的数据,这是因为亚马逊电商网站有反爬虫措施识别到了我们的爬虫代码:

alt

(2)我们携带网页解锁器发送请求获取网页源码:

def get_html_str(url):
    headers = {
        'x-netnut-html-render': 'true'
    }
    # 使用网页解析器
    proxies = get_ip()
    response = requests.get(url, headers=headers,proxies=proxies, verify=False)  #
    html_str = response.text
    print(html_str)
    return html_str

可以看到返回的网页源码特别长,并且可以搜到我们需要的数据,NetNut网页解锁器简直太强了,可以有效解决请求头检测、IP检测、验证码检测等,可以模仿真实用户行为进行访问:

alt

5.3 解析数据

我们这里写一个get_data(html_str)函数,传入当前页的网页源码,然后用xpath解析数据:

def get_data(html_str):
    # 将html字符串转换为etree对象方便后面使用xpath进行解析
    html_data = etree.HTML(html_str)
    # 利用xpath取到所有的li标签
    # 标题
    title = html_data.xpath('//span[@id="productTitle"]/text()')[0].strip()
    # 价格
    price = html_data.xpath('//span[@class="a-price-whole"]/text()')[0].strip()
    price = '$' + price
    # 品牌
    Brand = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[1]/td[2]/span/text()')[0].strip()
    # 颜色
    Color = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[2]/td[2]/span/text()')[0].strip()
    # 耳部放置
    Ear_Placement = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[3]/td[2]/span/text()')[0].strip()
    # 外型规格
    Form_Factor = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[4]/td[2]/span/text()')[0].strip()
    # 噪音控制
    Noise_Control = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[5]/td[2]/span/text()')[0].strip()
    # 型号名称
    Model_Name = html_data.xpath('/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[1]/td/text()')
    Model_Name = Model_Name[0].strip().replace('\u200e','')
    # 连接技术
    Connectivity_Technology = html_data.xpath('/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[2]/td/text()')
    Connectivity_Technology = Connectivity_Technology[0].strip().replace('\u200e', '')
    # 无线通信技术
    Wireless_Communication_Technology = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[3]/td/text()')
    Wireless_Communication_Technology = Wireless_Communication_Technology[0].strip().replace('\u200e', '')
    # 随附部件
    Included_Components = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[4]/td/text()')
    Included_Components = Included_Components[0].strip().replace('\u200e', '')
    # 商品具体用途
    Specific_Uses_For_Product = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[5]/td/text()')
    Specific_Uses_For_Product = Specific_Uses_For_Product[0].strip().replace('\u200e', '')
    # 产品的推荐用途
    Recommended_Uses_For_Product = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[6]/td/text()')
    Recommended_Uses_For_Product = Recommended_Uses_For_Product[0].strip().replace('\u200e', '')
    # 兼容的设备
    Compatible_Devices = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[7]/td/text()')
    Compatible_Devices = Compatible_Devices[0].strip().replace('\u200e', '')
    # 控制类型
    Control_Type = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[8]/td/text()')
    Control_Type = Control_Type[0].strip().replace('\u200e', '')
    # 线缆特征
    Cable_Feature = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[9]/td/text()')
    Cable_Feature = Cable_Feature[0].strip().replace('\u200e', '')
    # 防水级别
    Water_Resistance_Level = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[10]/td/text()')
    Water_Resistance_Level = Water_Resistance_Level[0].strip().replace('\u200e', '')
    # 控制方法
    Control_Method = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[11]/td/text()')
    Control_Method = Control_Method[0].strip().replace('\u200e', '')
    # 商品数量
    Number_of_Items = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[12]/td/text()')
    Number_of_Items = Number_of_Items[0].strip().replace('\u200e', '')
    # 控制器类型
    Controller_Type = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[13]/td/text()')
    Controller_Type = Controller_Type[0].strip().replace('\u200e', '')
    # UPC
    UPC = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[14]/td/text()')
    UPC = UPC[0].strip().replace('\u200e', '')
    # 特殊功能
    Special_Feature = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[15]/td/text()')
    Special_Feature = Special_Feature[0].strip().replace('\u200e', '')
    # 制造商
    Manufacturer = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[16]/td/text()')
    Manufacturer = Manufacturer[0].strip().replace('\u200e', '')
    # 包装尺寸
    Package_Dimensions = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[17]/td/text()')
    Package_Dimensions = Package_Dimensions[0].strip().replace('\u200e', '')
    # 商品重量
    Item_Weight = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[18]/td/text()')
    Item_Weight = Item_Weight[0].strip().replace('\u200e', '')
    # ASIN
    ASIN = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[19]/td/text()')
    ASIN = ASIN[0].strip().replace('\u200e', '')
    # 型号
    Item_model_number = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[20]/td/text()')
    Item_model_number = Item_model_number[0].strip().replace('\u200e', '')
    # 电池
    Batteries = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[21]/td/text()')
    Batteries = Batteries[0].strip().replace('\u200e', '')
    # 上架时间
    Date_First_Available = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[22]/td/text()')
    Date_First_Available = Date_First_Available[0].strip().replace('\u200e', '')

    return {'商品标题':title,'价格':price,'品牌':Brand,'颜色':Color,'耳部放置':Ear_Placement,'外型规格':Form_Factor,
             '噪音控制':Noise_Control,
             '型号名称': Model_Name, '连接技术': Connectivity_Technology,
             '无线通信技术': Wireless_Communication_Technology, '随附部件': Included_Components,
             '商品具体用途': Specific_Uses_For_Product, '产品的推荐用途': Recommended_Uses_For_Product,
             '兼容的设备': Compatible_Devices,
             '控制类型': Control_Type, '线缆特征': Cable_Feature, '防水级别': Water_Resistance_Level,
             '控制方法': Control_Method, '商品数量': Number_of_Items,
             '控制器类型': Controller_Type, 'UPC': UPC, '特殊功能': Special_Feature, '制造商': Manufacturer,
             '包装尺寸': Package_Dimensions,
             '商品重量': Item_Weight, 'ASIN': ASIN, '型号': Item_model_number, '电池': Batteries,
             '上架时间': Date_First_Available
             }

5.4 保存数据

将获取到的数据写入Excel,当然如果你有数据库也可以写入数据库:

def save_excel(data):
    # 转换为适合DataFrame的格式
    formatted_data = [{'字段': key, '内容': value} for key, value in data.items()]
    # 创建DataFrame
    df = pd.DataFrame(formatted_data)
    # 写入excel
    df.to_excel('电商数据.xlsx',index=False)

5.5 完整源码

注意:下面get_ip()函数,需要看4.2教程换成自己的NetNut代理的用户名和密码:

import requests  # python基础爬虫库
from lxml import etree  # 可以将网页转换为Elements对象
import pandas as pd  # pandas,用于写入Excel文件


def get_ip():
    proxies = {
        "http": "http://你的用户名:你的密码@unblocker.netnut.io:5959",
        "https": "http://你的用户名:你的密码@unblocker.netnut.io:5959"
    }
    return proxies


# def get_html_str(url):
#     """不使用网页解锁器"""
#     headers = {
#         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.559.400 QQBrowser/19.6.6683.400'
#     }
#     response = requests.get(url, headers=headers, verify=False)
#     html_str = response.text
#     print(html_str)
#     return html_str


def get_html_str(url):
    """使用网页解锁器"""
    headers = {
        'x-netnut-html-render': 'true'
    }
    # 使用网页解析器
    proxies = get_ip()
    response = requests.get(url, headers=headers, proxies=proxies, verify=False)
    html_str = response.text
    print(html_str)
    return html_str


def get_data(html_str):
    # 将html字符串转换为etree对象方便后面使用xpath进行解析
    html_data = etree.HTML(html_str)
    # 利用xpath取到所有的li标签
    # 标题
    title = html_data.xpath('//span[@id="productTitle"]/text()')[0].strip()
    # 价格
    price = html_data.xpath('//span[@class="a-price-whole"]/text()')[0].strip()
    price = '$' + price
    # 品牌
    Brand = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[1]/td[2]/span/text()')[0].strip()
    # 颜色
    Color = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[2]/td[2]/span/text()')[0].strip()
    # 耳部放置
    Ear_Placement = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[3]/td[2]/span/text()')[0].strip()
    # 外型规格
    Form_Factor = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[4]/td[2]/span/text()')[0].strip()
    # 噪音控制
    Noise_Control = html_data.xpath('/html/body/div[2]/div/div/div[12]/div[45]/div/table/tbody/tr[5]/td[2]/span/text()')[0].strip()
    # 型号名称
    Model_Name = html_data.xpath('/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[1]/td/text()')
    Model_Name = Model_Name[0].strip().replace('\u200e','')
    # 连接技术
    Connectivity_Technology = html_data.xpath('/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[2]/td/text()')
    Connectivity_Technology = Connectivity_Technology[0].strip().replace('\u200e', '')
    # 无线通信技术
    Wireless_Communication_Technology = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[3]/td/text()')
    Wireless_Communication_Technology = Wireless_Communication_Technology[0].strip().replace('\u200e', '')
    # 随附部件
    Included_Components = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[4]/td/text()')
    Included_Components = Included_Components[0].strip().replace('\u200e', '')
    # 商品具体用途
    Specific_Uses_For_Product = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[5]/td/text()')
    Specific_Uses_For_Product = Specific_Uses_For_Product[0].strip().replace('\u200e', '')
    # 产品的推荐用途
    Recommended_Uses_For_Product = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[6]/td/text()')
    Recommended_Uses_For_Product = Recommended_Uses_For_Product[0].strip().replace('\u200e', '')
    # 兼容的设备
    Compatible_Devices = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[7]/td/text()')
    Compatible_Devices = Compatible_Devices[0].strip().replace('\u200e', '')
    # 控制类型
    Control_Type = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[8]/td/text()')
    Control_Type = Control_Type[0].strip().replace('\u200e', '')
    # 线缆特征
    Cable_Feature = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[9]/td/text()')
    Cable_Feature = Cable_Feature[0].strip().replace('\u200e', '')
    # 防水级别
    Water_Resistance_Level = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[10]/td/text()')
    Water_Resistance_Level = Water_Resistance_Level[0].strip().replace('\u200e', '')
    # 控制方法
    Control_Method = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[11]/td/text()')
    Control_Method = Control_Method[0].strip().replace('\u200e', '')
    # 商品数量
    Number_of_Items = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[12]/td/text()')
    Number_of_Items = Number_of_Items[0].strip().replace('\u200e', '')
    # 控制器类型
    Controller_Type = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[13]/td/text()')
    Controller_Type = Controller_Type[0].strip().replace('\u200e', '')
    # UPC
    UPC = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[14]/td/text()')
    UPC = UPC[0].strip().replace('\u200e', '')
    # 特殊功能
    Special_Feature = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[15]/td/text()')
    Special_Feature = Special_Feature[0].strip().replace('\u200e', '')
    # 制造商
    Manufacturer = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[16]/td/text()')
    Manufacturer = Manufacturer[0].strip().replace('\u200e', '')
    # 包装尺寸
    Package_Dimensions = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[17]/td/text()')
    Package_Dimensions = Package_Dimensions[0].strip().replace('\u200e', '')
    # 商品重量
    Item_Weight = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[18]/td/text()')
    Item_Weight = Item_Weight[0].strip().replace('\u200e', '')
    # ASIN
    ASIN = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[19]/td/text()')
    ASIN = ASIN[0].strip().replace('\u200e', '')
    # 型号
    Item_model_number = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[20]/td/text()')
    Item_model_number = Item_model_number[0].strip().replace('\u200e', '')
    # 电池
    Batteries = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[21]/td/text()')
    Batteries = Batteries[0].strip().replace('\u200e', '')
    # 上架时间
    Date_First_Available = html_data.xpath(
        '/html/body/div[2]/div/div/div[97]/div/div/div/div/div/div[1]/div[1]/div/div[2]/div/div/table/tbody/tr[22]/td/text()')
    Date_First_Available = Date_First_Available[0].strip().replace('\u200e', '')

    return {'商品标题':title,'价格':price,'品牌':Brand,'颜色':Color,'耳部放置':Ear_Placement,'外型规格':Form_Factor,
             '噪音控制':Noise_Control,
             '型号名称': Model_Name, '连接技术': Connectivity_Technology,
             '无线通信技术': Wireless_Communication_Technology, '随附部件': Included_Components,
             '商品具体用途': Specific_Uses_For_Product, '产品的推荐用途': Recommended_Uses_For_Product,
             '兼容的设备': Compatible_Devices,
             '控制类型': Control_Type, '线缆特征': Cable_Feature, '防水级别': Water_Resistance_Level,
             '控制方法': Control_Method, '商品数量': Number_of_Items,
             '控制器类型': Controller_Type, 'UPC': UPC, '特殊功能': Special_Feature, '制造商': Manufacturer,
             '包装尺寸': Package_Dimensions,
             '商品重量': Item_Weight, 'ASIN': ASIN, '型号': Item_model_number, '电池': Batteries,
             '上架时间': Date_First_Available
             }


def save_excel(data):
    # 转换为适合DataFrame的格式
    formatted_data = [{'字段': key, '内容': value} for key, value in data.items()]
    # 创建DataFrame
    df = pd.DataFrame(formatted_data)
    # 写入excel
    df.to_excel('电商数据.xlsx',index=False)


if __name__ == '__main__':
    url = 'https://www.amazon.com/gp/aw/d/B0FQFB8FMG/?_encoding=UTF8&pd_rd_plhdr=t&aaxitk=2c961813ca337245359ad083c19b8f5f&hsa_cr_id=0&qid=1757486466&sr=1-1-9e67e56a-6f64-441f-a281-df67fc737124&ref_=sbx_be_s_sparkle_lsi4d_asin_0_img&pd_rd_w=AqboJ&content-id=amzn1.sym.9f2b2b9e-47e9-4764-a4dc-2be2f6fca36d%3Aamzn1.sym.9f2b2b9e-47e9-4764-a4dc-2be2f6fca36d&pf_rd_p=9f2b2b9e-47e9-4764-a4dc-2be2f6fca36d&pf_rd_r=6HKX09G15YB6TRQAMP8J&pd_rd_wg=MziL3&pd_rd_r=2ee0b16d-b4ad-422e-a768-b3e26a6d8724'
    # 一、发送请求,获取网页源码
    html_str = get_html_str(url)
    # 二、解析数据
    data = get_data(html_str)
    # 三、保存数据
    save_excel(data)

5.6 结果展示

使用NetNut网页解锁器轻松获取到数据,并且在当前路径下生成Excel文件:

alt

六、总结

代理对于爬虫是密不可分的,但使用代理需要遵守相关法律法规和目标网站的使用规则。NetNut代理覆盖全球195个国家,8500万优质IP,全方位满足网页数据抓取。提供四种代理IP服务:动态住宅,静态ISP,移动代理,数据中心代理,凭借网页解锁器的强大功能可以采集各种场景的数据,并且现在在做国庆促销有需要的小伙伴们可以试试:Netnut代理IP

#爬虫#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务