【python实战】利用代理ip爬取Alibaba海外版数据
引言
在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部署复杂的反爬机制,限制了来自特定区域的访问和自动化数据抓取。对于希望获取跨境市场信息的企业来说,这些限制带来了巨大的挑战,尤其是在需要获取实时且准确的数据时,传统的爬虫技术往往面临失效的风险。
为了解决这一问题,使用IP代理是一个行之有效的策略。代理IP能够动态分配不同区域的IP地址,使数据请求的来源看似分散,避免因短时间内过多请求而触发网站的安全机制。通过定期轮换IP并加入高匿名代理服务,可以有效防止反爬虫系统的检测,继续获取宝贵的数据。接下来我们通过一个爬虫实战来了解如何将IP代理技术集成到爬虫中。
青果网络https://www.qg.net/product/proxyip.html?platform=CSDN§ion=%E4%BB%A3%E7%90%86ip&creator=Yan-%E8%8B%B1%E6%9D%B0
Alibaba海外版数据采集
跨境电商最关注的就是进货渠道,收集某种产品的供货商信息是十分必要的手段。Alibaba近些年在深耕海外市场,是跨境电商常用的平台之一。接下来我们尝试采集Alibaba海外版的商品数据。
目标
本次任务的目标是给定一种商品,查询它的所有供应商。在开始之前,我们先来观察一下网页结构。当我们搜索某商品的代理商时(例如laptop),它的url如下:
可以看到IndexArea对应了供应商的视图,而SearchText的值对应了搜索的关键词,page的值对应了页面。我们继续观察,可以看到卡片对应了factory-card的类。继续观察可以得到:标题存放在card-title下的info下的detail-info的a标签中,而供应商页面在这个标签的href属性中。这些都可以使用xpath获取到。
代理IP获取
为什么选择青果代理IP?
我最近一直在用的产品,也给很多朋友推荐过,体验下来的感受有几点:
1.业务成功率在同类中很高,满足数据采集需求
2.它还有IP可用性保障机制,能自动跳过不可用IP并重新分配,国内访问平均响应时间在1秒内,非常快。
3.性价比高,现提供6小时免费试用,
回到配置代理IP。我们注册好账户后,就可以进入控制台。这里需要注意,必须要实名认证后才能正常使用。
点击“代理IP”,就可以选购服务了。选择“全球HTTP”,需要注意的是全球HTTP不能使用大陆网络访问,适合部署在自己的服务器上使用,这里由于我们要隐藏自己的IP,所以选择短效代理。其他选项大家可以根据实际情况选择。
选购完成后即可在按时业务中找到它。
选择提取工具即可获得代理IP的API链接。它的用法是:每次访问这个url就会得到一个JSO格式的IP地址。这里要注意先把自己的IP添加到白名单中。
编写爬虫
接下来我们就可以编写爬虫代码。爬取数据的过程分为三个部分:首先我们要访问上面的API获取代理IP,之后使用这个IP访问并获取商品页面,最后我们将页面中的信息提取出来保存在本地。
首先我们定义一个函数,通过请求一个代理服务来获取一个新的代理IP,并返回该IP地址。它发送一个HTTP请求给代理服务器,返回的JSON数据中包含了代理服务器的IP地址。
def get_ip():res = requests.get("http://share.proxy.qg.net/get?key=6B8AC36E&num=1&area=&isp=0&format=txt&seq=\r\n&distinct=false")res_dict = json.loads(res.text)return res_dict["data"][0]["server"]
之后定义函数,使用获取到的代理IP通过requests访问目标URL,并返回页面的HTML文本。
def get_page(url, ip):proxies = {'http': ip,'https': ip}res = requests.get(url, proxies=proxies, headers=headers)return res.text
接下来定义一个函数解析传入的HTML页面。它使用XPath查找包含供应商信息的div标签。从每个找到的factory-card中提取供应商的名称和url,并将其存储到result列表中。最终返回包含供应商信息的列表。
def parse_page(page):root = etree.HTML(page)cards = root.xpath('//div[@class="factory-card"]')result = []for card in cards:node = card.xpath('//div[@class="card-title"]//div[@class="info"]//div[@class="detail-info"]//a')[0]title = node.find('/text()')url = 'https:' + node.find('/@href')result.append({'supplier': title, 'url': url})return result
最后通过函数将供应商信息写入名为suppliers.txt的文件中。每条记录包括供应商的名称和网址。
def save(text_li):with open('suppliers.txt', 'a', encoding='utf8') as f:for item in text_li:f.write(f"{item['supplier']};{item['url']}")
我们在main函数中调用槐树并控制爬虫翻页。在这个函数中,首先设置要搜索的关键词以及要抓取的页数范围。然后,进入一个循环,在每一页中构造相应的URL,调用get_ip()获取代理IP,使用get_page()获取该页的HTML,接着调用parse_page()提取供应商信息,最后将这些信息通过save()函数保存到文件中。每次请求后,程序会暂停5秒以避免被目标网站封禁。
def main():keyword = 'laptop'page_end = 2for page in range(1, page_end + 1):url = f'https://www.alibaba.com/trade/search?fsb=y&page={page}&IndexArea=company_en&CatId=&SearchText={keyword}&viewtype=&tab='ip = get_ip()page = get_page(url, ip)text = parse_page(page)save(text)time.sleep(5)print('Done')
完整代码如下:
import requests
import json
from lxml import etree
import time# 设置请求头
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0'
}def get_ip():"""获取代理IP"""res = requests.get("http://share.proxy.qg.net/get?key=6B8AC36E&num=1&area=&isp=0&format=txt&seq=&distinct=false")res_dict = json.loads(res.text)return res_dict["data"][0]["server"]def get_page(url, ip):"""通过指定的代理IP获取页面内容"""proxies = {'http': ip,'https': ip}res = requests.get(url, proxies=proxies, headers=headers)return res.textdef parse_page(page):"""解析页面内容并提取供应商信息"""root = etree.HTML(page)cards = root.xpath('//div[@class="factory-card"]')result = []for card in cards:node = card.xpath('.//div[@class="card-title"]//div[@class="info"]//div[@class="detail-info"]//a')[0]title = node.xpath('./text()')[0] # 修正获取标题的方法url = 'https:' + node.xpath('./@href')[0] # 修正获取URL的方法result.append({'supplier': title, 'url': url})return resultdef save(text_li):"""将提取的供应商信息保存到文件中"""with open('suppliers.txt', 'a', encoding='utf8') as f:for item in text_li:f.write(f"{item['supplier']};{item['url']}\n") # 添加换行符def main():"""主函数,执行抓取和解析过程"""keyword = 'laptop'page_end = 2 # 设置要抓取的页数for page in range(1, page_end + 1):url = f'https://www.alibaba.com/trade/search?fsb=y&page={page}&IndexArea=company_en&CatId=&SearchText={keyword}&viewtype=&tab='ip = get_ip() # 获取代理IPpage_content = get_page(url, ip) # 获取页面内容text = parse_page(page_content) # 解析页面save(text) # 保存结果time.sleep(5) # 暂停5秒print('Done')if __name__ == '__main__':main()
获取数据
接下来我们启动爬虫获取数据。
运行完毕后,打开txt文档即可看到数据。
总结
使用IP代理解决跨境电商数据采集中的挑战是非常有效的策略。通过代理技术,企业可以绕过地域性封锁和网站的反爬机制,稳定获取所需数据。像青果网络这样提供全球代理服务的企业,不仅能够帮助企业实现数据采集的顺畅进行,还提供高防御和高匿名性,确保访问安全性和隐私保护。这样的技术支持让企业能够在复杂的跨境环境中更加自如地进行市场分析与业务扩展。
相关文章:

【python实战】利用代理ip爬取Alibaba海外版数据
引言 在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…...
FFMPEG录屏(20)--- 枚举macOS下的窗口和屏幕列表,并获取名称缩略图等信息
在 macOS 下获取可屏幕共享的窗口和屏幕 在 macOS 下,我们可以通过使用 Core Graphics 和 Cocoa 框架来获取当前系统中可屏幕共享的窗口和屏幕信息。本文将详细介绍如何获取窗口和屏幕的 ID、标题、坐标、进程图标和缩略图等信息。 前提条件 在开始之前ÿ…...

Redis 命令集 (超级详细)
目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…...
Spring Cloud --- GateWay和Sentinel集成实现服务限流
pom添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency><groupId>com.alibaba.csp</groupId><artifactId>s…...

python excel如何转成json,并且如何解决excel转成json时中文汉字乱码的问题
1.解决excel转成json时中文汉字乱码的问题 真的好久没有打开这个博客也好久没有想起来记录一下问题了,今天将表格测试集转成json格式的时候遇到了汉字都变成了乱码的问题,虽然这不是个大问题,但是编码问题挺烦人的,乱码之后像下图…...
【MySQL】实战篇—数据库设计与实现:根据需求设计数据库架构
在设计数据库架构时,开发者需要遵循一系列步骤,以确保数据库能够高效、可靠地满足系统需求。以下是设计数据库架构的理论知识和步骤说明。 1. 需求分析 需求分析是数据库设计的第一步,旨在理解系统的功能需求和数据需求。通过与利益相关者&…...

[Python学习日记-53] Python 中的正则表达式模块 —— re
[Python学习日记-53] Python 中的正则表达式模块 —— re 简介 re 模块 练习 简介 我们在编程的时候经常会遇到想在一段文字当中找出电话号码、身份证号、身高、年龄之类的信息,就像下面的数据一样 # 文件名:美丽学姐联系方式.txt 姓名 地区 …...

Unity编辑器 连接不到SteamVR问题记录
问题表现:之前正常的工程,某天打开后运行,在SteamVR未打开时,Unity工程运行后无法调用起来Steam VR,无任何反应,但用其他软件则可以调用起来SteamVR,并且运行正常,在重装了XR的一些插…...
nginx 日志配置笔记
Nginx 的日志配置非常重要,它可以帮助你记录服务器的访问情况、错误信息等,便于后续的分析和故障排查。Nginx 的日志配置主要包括访问日志(access log)和错误日志(error log)。 1、访问日志(Ac…...
Java中的接口是什么?如何定义接口?
1、Java中的接口是什么?如何定义接口? 在Java中,接口是一种引用类型,它定义了一组方法的契约,但不包含实现。接口定义了方法签名,但不提供方法的实现细节。Java中的接口用于实现多态性和代码的抽象化。 在…...

8.13TB高清卫星影像更新(WGS84坐标投影)
最近对WGS84版的高清卫星影像数据进行了一次更新,并基于更新区域生成了相应的接图表。 8.13TB高清卫星影像更新 本次数据更新了14820个离线包,共8.13TB大小,主要更新目标区域为中国东南区域。 更新范围接图表一 更新范围接图表二 更新范围…...

【力扣】[Java版] 刷题笔记-21. 合并两个有序链表
题目: 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 从题目和示例可以看出,应该是要循环遍历链表进行比较,然后组成新的链表。 第一种:递归…...
【Bug】RuntimeError: Engine loop has died
目录 报错前置条件报错内容解决方案 报错前置条件 使用vllm启动qwen2.5-32b-instruct模型后发生的报错 GPU是GeForce RTX 4090 Laptop GPU 系统是Windows 11 运行系统是WSL2-Ubuntu22.04 报错内容 INFO 10-22 22:29:31 engine.py:290] Added request chat-993cbe95e73d4a1db…...

Labview写CIP协议
参考资料 读(INT)变量 发送: 6f00 1C00 6d010f00 00000000 0300000000000000 00000000 00000000 0000 0200 0000 0000 B200 0C00 4d 02 91 02 5353 C300 0100 7856 返回: 6f00 1400 6d010f00 00000000 0300000000000000 00000000 00000000 0000 020…...
Redis批量获取缓存的方法
使用multiGet方法 优点:简单易用,适用于获取少量键的场景。 缺点:当获取的键数量较多时,可能会因为网络延迟导致性能下降。此外,如果某个键不存在,对应的返回值会是null,需要额外处理。 其他…...
MySQL配置文件中server-id的作用是什么
作用一: 通过 server-id 可以用来唯一标识主从复制环境中的一个服务器, 作用二: 再进行主从复制的过程中,会传递二进制日志文件,server-id 帮助MySQL确定哪些日志属于哪个服务器,从而确保日志正确地路由到相…...

Docker入门之构建
Docker构建概述 Docker Build 实现了客户端-服务器架构,其中: 客户端:Buildx 是用于运行和管理构建的客户端和用户界面。服务器:BuildKit 是处理构建执行的服务器或构建器。 当您调用构建时,Buildx 客户端会向 Bui…...
StarRocks数据库在SQL语句中解析JSON字符串
StarRocks数据库在SQL语句中解析JSON字符串 -- 使用数据库 use sr_test; -- 删除表 drop table ts_usr; -- 创建表 CREATE TABLE ts_usr ( uid bigint NOT NULL COMMENT "用户id", uname varchar(64) NULL COMMENT "用户名", ujson varchar(1024) NULL CO…...

RabbitMq-队列交换机绑定关系优化为枚举注册
📚目录 📚简介:🚀比较💨通常注册🌈优化后注册 ✍️代码💫自动注册的关键代码 📚简介: 该项目介绍,rabbitMq消息中间件,对队列的注册,交换机的注册,…...
施磊C++ | 项目实战 | 手写移植SGI STL二级空间配置器内存池 项目源码
手写移植SGI STL二级空间配置器内存池 项目源码 笔者建议配合这两篇博客进行学习 侯捷 | C | 内存管理 | 学习笔记(二):第二章节 std::allocator-CSDN博客 施磊C | 项目实战 | SGI STL二级空间配置器源码剖析-CSDN博客 文章目录 手写移植SGI STL二级空…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...