终极策略:如何利用亮数据代理轻松、高效地突破亚马逊的反爬障碍

news2024/11/28 15:55:31

文章目录

    • 前言背景📜
    • 第一步:打开亚马逊商城🛍️
    • 第二步:定位搜索框并搜索iphone15🔍
    • 第三步:定位具体数据并保存到csv文件💾
    • 第三步:多页面数据抓取📄📄📄
    • 第四步:动态住宅代理进行数据抓取🌐
    • 第五步:分析抓取的数据📊
    • 完整代码💻

前言背景📜

在数字化日益盛行的今天,网页抓取已经成为了获取海量信息的必备技能。然而,随着各大网站加强反爬虫策略,传统的数据采集方式逐渐面临挑战。🚫尤其是当我们频繁地从同一IP地址发起请求时,很容易被目标网站识别并封禁。面对这样的困境,我们该如何确保数据采集的稳定与高效呢?一个简单而有效的策略便是利用IP代理。而在众多的IP代理提供商中,亮数据(Bright Data) 以其稳定、高效和专业的服务受到了广大用户的青睐。在接下来的内容中,我们将深入探讨如何结合 亮数据Bright Data 的动态IP代理和Selenium工具,成功抓取亚马逊的数据,从而轻松绕过各种反爬策略,确保数据采集的流畅进行。

相关知识我已经在书籍中有介绍,这里是书籍介绍:《Python网络爬虫入门到实战》


🌟这篇文章将为您揭示如何结合 亮数据Bright Data 的先进技术,成功抓取亚马逊的数据,从而轻松绕过各种反爬策略。

第一步:打开亚马逊商城🛍️

选择一个合适的市场进行数据抓取是成功的第一步。亚马逊,作为全球最大的电商平台,无疑是数据采集的宝藏💎。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import csv


# 初始化浏览器
driver = webdriver.Chrome()

# 打开亚马逊网站
driver.get("https://www.amazon.cn/")

如下所示:
在这里插入图片描述

第二步:定位搜索框并搜索iphone15🔍

如图所示进行定位分析:
在这里插入图片描述
因此进行定位并搜索iphone15相关商品:

# 在搜索框中输入“iPhone 15”
search_box = driver.find_element(By.ID, "twotabsearchtextbox")
search_box.send_keys("iPhone 15")
search_box.send_keys(Keys.RETURN)

运行如下所示:
在这里插入图片描述

第三步:定位具体数据并保存到csv文件💾

定位页面所有数据:
在这里插入图片描述

价格定位:
在这里插入图片描述
标题定为:
在这里插入图片描述
图片定位:
在这里插入图片描述
因此代码如下:


# 获取商品信息
product_elements = driver.find_elements(By.CSS_SELECTOR, ".s-main-slot .s-result-item")

# 创建CSV文件并写入数据
with open('amazon_products.csv', 'w', newline='', encoding='gbk') as csvfile:
    fieldnames = ['Title', 'Price', 'Image URL']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for index, product in enumerate(product_elements):
        try:
            title = product.find_element(By.CSS_SELECTOR, ".a-text-normal").text
            price = product.find_element(By.CSS_SELECTOR, ".a-price-whole").text
            image_url = product.find_element(By.CSS_SELECTOR, "img.s-image").get_attribute("src")

            print(f"Product {index + 1}:")
            print(f"Title: {title}")
            print(f"Price: {price} USD")
            print(f"Image URL: {image_url}")

            # 写入CSV文件
            writer.writerow({'Title': title, 'Price': price, 'Image URL': image_url})

        except Exception as e:
            print(f"Skipping product {index + 1} due to missing information.")

time.sleep(2)
# 关闭浏览器
driver.quit()

运行并得到抓取到文件如下:
在这里插入图片描述

第三步:多页面数据抓取📄📄📄

对于大量的数据,单页面抓取远远不够。如果使用个人的IP进行大量数据抓取又会被封IP,但有了 亮数据Bright Data ,多页面数据抓取变得轻而易举。思路:一个页面抓取完,点击下一页继续抓取即可,定位如下所示:
在这里插入图片描述
这里为了避免我们的ip被官方查出来,暂时以抓取三个页面数据进行实践,在下一个小节中我将展示如何用代理ip来进行更多大规模抓取:

# 创建CSV文件并写入数据
with open('amazon_products_multiple_pages.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['Title', 'Price', 'Image URL']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    # 循环遍历多个页面,这里避免被反扒,先暂时用三个页面试试水
    for page in range(1, 3):
        print(f"Scraping page {page}..")

        # 获取商品信息
        product_elements = driver.find_elements(By.CSS_SELECTOR, ".s-main-slot .s-result-item")

        for index, product in enumerate(product_elements):
            try:
                title = product.find_element(By.CSS_SELECTOR, ".a-text-normal").text
                price = product.find_element(By.CSS_SELECTOR, ".a-price-whole").text
                image_url = product.find_element(By.CSS_SELECTOR, "img.s-image").get_attribute("src")

                print(f"Product {index + 1}:")
                print(f"Title: {title}")
                print(f"Price: {price} RMB")
                print(f"Image URL: {image_url}")

                # 写入CSV文件
                writer.writerow({'Title': title, 'Price': price, 'Image URL': image_url})

            except Exception as e:
                print(f"Skipping product {index + 1} due to missing information.")

        # 点击“下一页”按钮
        try:
            next_button = driver.find_element(By.CSS_SELECTOR, ".s-pagination-next")
            next_button.click()
            time.sleep(3)  # 等待下一页加载
        except Exception as e:
            print("No more pages to scrape.")
            break

第四步:动态住宅代理进行数据抓取🌐

Selenium代码中使用上述动态代理的方法:

  1. 首先,使用代码获取动态IP。
  2. 然后,配置Chrome WebDriver以使用该代理。
  3. 最后,使用配置好的WebDriver进行网页抓取。

动态住宅代理IP是真实用户家庭IP,比如你我他家里的IP,这样的IP在被访问网站看来,代表的是真实的个体,真人用户。其高隐匿性,且不断轮动,很难被标注和识别,在采集挖掘反爬技术高超网站的数据信息时,威力很大。但是要找到一个优质且足量的动态住宅IP网络并不容易。

在众多我曾使用的商用代理供应商中,以色列的 “亮数据Bright Data” 无疑是我最为推荐的选择。在撰写爬虫文章系列时,我经历了多家供应商的对比,但每一次,亮数据Bright Data 总能为我带来卓越的满意度。

我们选择了 亮数据Bright Data 的动态住宅代理IP服务,官方网站👉:亮数据 Bright Data。为企业用户提供了一个独特的福利:首次注册的公司用户,有机会免费体验他们的服务。我们都知道,在网络数据抓取领域,动态住宅IP扮演着不可或缺的角色。而 亮数据Bright Data 拥有超过7000万的动态真人IP网络,确保了爬虫的高效、准确抓取。

注册进入官网后开通使用动态住宅代理:

在这里插入图片描述
进入后可以查看一些参考代码:
在这里插入图片描述
自定义一个国家,由于亚马逊是美国,所以我们选择定位美国的ip:
在这里插入图片描述

亮数据Bright Data的动态代理技术确保了数据抓取的稳定性和匿名性,大大提高了数据采集的成功率。生成动态ip代码如下(复制上述代码中的ProxyHandler部分,替换下方我的):

import json
import urllib.request

opener = urllib.request.build_opener(
    urllib.request.ProxyHandler(
        {'http': 'http://brd-customer-hl_5dede465-zone-try-country-us:pdqt284jal8m@brd.superproxy.io:22225',
        'https': 'http://brd-customer-hl_5dede465-zone-try-country-us:pdqt284jal8m@brd.superproxy.io:22225'}))

response = opener.open('http://lumtest.com/myip.json').read()
# 将响应转换为字符串
response_str = response.decode('utf-8')
# 使用json库解析字符串
data = json.loads(response_str)['ip']

# 打印IP地址,每一次打印结果是不一样的,输出例子:73.110.170.116
print(data)

给予上述的代码模板,我们可以修改原来的代码:


# 获取动态IP
def get_dynamic_ip():
    opener = urllib.request.build_opener(
        urllib.request.ProxyHandler(
            {'http': 'http://brd-customer-hl_5dede465-zone-try-country-us:pdqt284jal8m@brd.superproxy.io:22225',
             'https': 'http://brd-customer-hl_5dede465-zone-try-country-us:pdqt284jal8m@brd.superproxy.io:22225'}))

    response = opener.open('http://lumtest.com/myip.json').read()
    response_str = response.decode('utf-8')
    ip = json.loads(response_str)['ip']
    return ip


# 使用动态IP配置WebDriver
def configure_driver_with_proxy(ip):
    PROXY = ip
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument(f'--proxy-server={PROXY}')
    # 初始化浏览器
    driver = webdriver.Chrome()
    return driver


# 主逻辑
ip = get_dynamic_ip()
print(f"Using IP: {ip}")
driver = configure_driver_with_proxy(ip)

运行查看使用的代理:47.197.239.15
在这里插入图片描述
再次运行查看使用的代理:73.129.215.76
在这里插入图片描述
可以看到每次执行都是使用不同的ip,这样就不用担心网站把我自己的ip封了。(其它网站类似操作)

这里来看下我们使用的代理ip位置具体是哪里的?这里我对上述两个ip查询结果如下,可以看到这是纯真的美国ip地址:
在这里插入图片描述
在这里插入图片描述

第五步:分析抓取的数据📊

这里我们暂时分析这两个方面:

  1. 价格分布:使用直方图展示价格分布。
  2. 价格趋势:使用线图展示每个商品的价格趋势。

代码如下所示:

import pandas as pd
import matplotlib.pyplot as plt

# 读取CSV文件
df = pd.read_csv('amazon_products_multiple_pages.csv')

# 价格分布
plt.figure(figsize=(10, 6))
plt.hist(df['Price'].astype(float), bins=20, color='blue', edgecolor='black')
plt.title('Price Distribution of iPhone 15 Products')
plt.xlabel('Price (RMB)')
plt.ylabel('Number of Products')
plt.grid(True)
plt.show()

# 价格趋势
plt.figure(figsize=(10, 6))
df['Price'].astype(float).plot(kind='line')
plt.title('Price Trend of iPhone 15 Products')
plt.xlabel('Product Index')
plt.ylabel('Price (RMB)')
plt.grid(True)
plt.show()

运行如下:
在这里插入图片描述
在这里插入图片描述

完整代码💻

为了让大家更深入地掌握与应用,我们特意提供了详细的代码示例。在此,我们要特别感谢亮数据Bright Data,他们为我们提供了这样一款强大的工具,让数据抓取变得既简单又安全!

如果你或你的公司正为数据问题苦恼,不妨点击👉:亮数据Bright Data 。扫描下方二维码,直接体验:

图片描述

数据抓取完整代码如下所示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import csv
import json
import urllib.request


# 获取动态IP
def get_dynamic_ip():
    opener = urllib.request.build_opener(
        urllib.request.ProxyHandler(
            {'http': 'http://brd-customer-hl_5dede465-zone-try-country-us:pdqt284jal8m@brd.superproxy.io:22225',
             'https': 'http://brd-customer-hl_5dede465-zone-try-country-us:pdqt284jal8m@brd.superproxy.io:22225'}))

    response = opener.open('http://lumtest.com/myip.json').read()
    response_str = response.decode('utf-8')
    ip = json.loads(response_str)['ip']
    return ip


# 使用动态IP配置WebDriver
def configure_driver_with_proxy(ip):
    PROXY = ip
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument(f'--proxy-server={PROXY}')
    # 初始化浏览器
    driver = webdriver.Chrome()
    return driver


# 主逻辑
ip = get_dynamic_ip()
print(f"Using IP: {ip}")
driver = configure_driver_with_proxy(ip)

# 打开亚马逊网站
driver.get("https://www.amazon.cn/")

time.sleep(3)

# 在搜索框中输入“iPhone 15”
search_box = driver.find_element(By.ID, "twotabsearchtextbox")
search_box.send_keys("iPhone 15")
search_box.send_keys(Keys.RETURN)

# 等待页面加载
time.sleep(3)

# 获取商品信息
product_elements = driver.find_elements(By.CSS_SELECTOR, ".s-main-slot .s-result-item")

# 创建CSV文件并写入数据
with open('amazon_products_multiple_pages.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['Title', 'Price', 'Image URL']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    # 循环遍历多个页面,使用代理的ip去爬多页
    for page in range(1, 9):
        time.sleep(2)
        print(f"Scraping page {page}..")

        # 获取商品信息
        product_elements = driver.find_elements(By.CSS_SELECTOR, ".s-main-slot .s-result-item")

        for index, product in enumerate(product_elements):
            try:
                title = product.find_element(By.CSS_SELECTOR, ".a-text-normal").text
                price = product.find_element(By.CSS_SELECTOR, ".a-price-whole").text
                image_url = product.find_element(By.CSS_SELECTOR, "img.s-image").get_attribute("src")

                # print(f"Product {index + 1}:")
                # print(f"Title: {title}")
                # print(f"Price: {price} RMB")
                # print(f"Image URL: {image_url}")

                # 写入CSV文件
                writer.writerow({'Title': title, 'Price': price, 'Image URL': image_url})

            except Exception as e:
                print(f"Skipping product {index + 1} due to missing information.")

        # 点击“下一页”按钮
        try:
            next_button = driver.find_element(By.CSS_SELECTOR, ".s-pagination-next")
            next_button.click()
            time.sleep(3)  # 等待下一页加载
        except Exception as e:
            print("No more pages to scrape.")
            break

time.sleep(10)
# 关闭浏览器
driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV 基础图像处理

1、生成图像 cv2.imread是OpenCV库中的一个函数,用于读取图像文件。它接受一个参数,即要读取的图像文件的路径,返回一个多维数组, 表示图像的像素值。该函数的常用参数包括:flags:指定读取图像的方式&#…

RabbitMQ学习总结(11)—— RabbitMQ 核心概念与架构

MQ 技术概述 什么是 MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦+物理解耦” 的消息通信服务。使用…

系统集成|第十三章(笔记)

目录 第十三章 干系人管理13.1 概述与相关概念13.2 主要过程13.2.1 识别干系人13.2.2 编制项目干系人管理计划13.2.3 管理干系人参与13.2.4 项目干系人参与的监控 13.3 常见问题 上篇:第十二章、沟通管理 第十三章 干系人管理 13.1 概述与相关概念 概述&#xff1a…

21-SpringSecurity

SpringSecurity从入门到精通 0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有…

会议剪影 | 思腾合力受邀参加2023第二届世界元宇宙大会并作主题演讲

由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办,上海市嘉定区安亭镇人民政府和中国仿真学会元宇宙专业委员会承办的第二届世界元宇宙大会于2023年9月20日-22日在上海安亭举行。 大会以“虚实相生、产业赋能”为主题,聚焦元宇宙关键技术发展的…

Redis原理(一):Redis数据结构(上)

文章目录 1、 Redis数据结构-动态字符串2、 Redis数据结构-intset3、 Redis数据结构-Dict4、 Redis数据结构-ZipList5、 Redis数据结构-ZipList的连锁更新问题6、 Redis数据结构-QuickList1、 Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串…

Mybatis 日志(Log4j2)

之前我们介绍了使用JDK Log、Apache Commons Logging打印Mybatis运行时的日志;本篇我们介绍使用Log4j2打印Mybatis运行时的日志。 如何您对Mybatis中使用JDK Log、Apache Commons Logging打印Mybatis运行时的日志不太了解,可以参考: Mybati…

使用群晖实现Videostation电影的大容量存储及分享教程

文章目录 1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣,但不幸的是,由于工作原因,他们目前分隔两地,无法常常亲密相伴。 这个距离让李哥特别怀念和女朋友一起在电影院观看电影的…

zabbix6.0监控磁盘IO

客户端配置 配置参数 [rootora19c zabbix]# pwd /usr/local/zabbix/etc/ [rootora19c zabbix]# vim zabbix_agentd.conf UnsafeUserParameters1配置UI监控conf文件 [rootora19c zabbix_agentd.d]# pwd /usr/local/zabbix/etc/zabbix_agentd.d/ [rootora19c zabbix_agentd.d…

大数据Flink(八十六):DML:Group 聚合和Over 聚合

文章目录 DML:Group 聚合和Over 聚合 一、DML:Group 聚合

CasaOS:一个docker容器应用的可视化Portal

CasaOS 官网声称他是一个家庭云操作系统,但我实际使用后感觉称之为“docker容器的可视化Portal”更合适。因为它本身不具备IAAS、PAAS、或SAAS的开箱即用能力,更像是一个把OS上的docker Container集中管理并展示的索引目录,各个docker Contai…

点成分享丨水浴设备在食品理化特性研究中的应用

木薯粉拯救“一麦难求” 近年来,随着全球人口增长、城市化进程的加快及人们饮食习惯的改变,以小麦为原料的食品成为了人们的“热门主食”,但实际每年产出的小麦不足以满足人们与日俱增的需求。为了解决这一问题,人们开始寻找小麦…

CTF_BUUCTF_Reverse解题_04内涵的软件

题目地址:BUUCTF在线评测 拿到文件,运行,狗!!! 不管回答Y还是N,程序都最终会一闪而过 上PE 32位C没壳 上IDA 32 F5反汇编一下: 直接发现Y和N, 看到有if判断语…

安科瑞医用隔离电源系统在江苏某医院项目中的应用

安科瑞 崔丽洁 江苏摘要:介绍该三级乙等综合医院采用安科瑞医用隔离电源系统,使用分体配电柜安装方式,从而实现将TN系统转化为IT系统,以及系统绝缘情况监测。 1、概述 该医院占地面积4.2万平方米,建筑面积7.14万平方米…

【C语言】通讯录

目录 一、关于通讯录 二、代码逻辑 三、通讯录实现 1.菜单设计 2.逻辑主要功能设计 3.增加联系人功能实现 4.显示全部联系人信息 5.删除联系人 6.查找联系人 7.修改联系人信息 8.对联系人进行排序 9.一键清空所有联系人 四、完整源码 test.c contact.c contact.…

新版WordPress系统文章自动采集插件/Auto Post pro完美运行版/多线程采集(wp自动采集)

源码介绍: 最新版WordPress系统文章自动采集插件,它是一款帮助用户提供方便快捷的文章自动采集方案的插件。WordPress自动采集插件,让内容采集变得高效便捷。作为Auto Post pro完美运行版,这里分享的是WordPress文章采集插件Auto…

【Vue3】v-model

v-model 基本用法 prop: modelValue 事件&#xff1a;update:modelValue <!-- App.vue --><template><div><h1>我是父组件</h1><div>isShow: {{ isShow }}</div><div><button click"isShow !isShow">开关&…

Java 华为真题-出租车计费

需求 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其余功能都正常。 比如&…

未曾想象!AIGC席卷之下,版权法律界竟手足无措?

人工智能生成内容&#xff08;AIGC&#xff09;的惊人崛起&#xff0c;标志着我们正步入一片前所未有的创作之境。美国纽约&#xff0c;销售员布雷特希克勒&#xff08;Brett Schickler&#xff09;通过与对话机器人ChatGPT的交流&#xff0c;仅用数小时便完成了一本名为《聪明…

KSG互信息估计器的原理详细推导(Kraskov, 2004)

KSG Estimators KSG估计器是Kraskov在2004年提出的互信息估计器&#xff0c;其原文过于简略&#xff0c;我参考大量文献对细节进行了补充。原文位置&#xff1a;[https://arxiv.org/pdf/cond-mat/0305641.pdf] KSG估计的基本方法是首先对互信息进行如下分解 (1) I ( X , Y )…