【python实战】利用代理ip爬取Alibaba海外版数据

引言

        在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部署复杂的反爬机制,限制了来自特定区域的访问和自动化数据抓取。对于希望获取跨境市场信息的企业来说,这些限制带来了巨大的挑战,尤其是在需要获取实时且准确的数据时,传统的爬虫技术往往面临失效的风险。

        为了解决这一问题,使用IP代理是一个行之有效的策略。代理IP能够动态分配不同区域的IP地址,使数据请求的来源看似分散,避免因短时间内过多请求而触发网站的安全机制。通过定期轮换IP并加入高匿名代理服务,可以有效防止反爬虫系统的检测,继续获取宝贵的数据。接下来我们通过一个爬虫实战来了解如何将IP代理技术集成到爬虫中。

青果网络icon-default.png?t=O83Ahttps://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代理解决跨境电商数据采集中的挑战是非常有效的策略。通过代理技术,企业可以绕过地域性封锁和网站的反爬机制,稳定获取所需数据。像青果网络这样提供全球代理服务的企业,不仅能够帮助企业实现数据采集的顺畅进行,还提供高防御和高匿名性,确保访问安全性和隐私保护。这样的技术支持让企业能够在复杂的跨境环境中更加自如地进行市场分析与业务扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt项目使用其他项目的ui之单继承之成员变量

第一步添加.ui文件 第二步&#xff0c;点击编译(原理&#xff1a;qt的uic会将.ui界面编译成c文件) 第三步&#xff1a;在编译后的目录下找到#include “ui_pagewidget.h” 第四步&#xff1a; #ifndef USA_H #define USA_H#include <QWidget>#include "ui_pagew…

sql高级

数据库的范式 为了建立冗余较小、结构合理的数据库&#xff0c;设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。 范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。实际上&#xff0c;数据库范式…

Nest.js 实战 (十五):前后端分离项目部署的最佳实践

☘️ 前言 本项目是一个采用现代前端框架 Vue3 与后端 Node.js 框架 Nest.js 实现的前后端分离架构的应用。Vue3 提供了高性能的前端组件化解决方案&#xff0c;而 Nest.js 则利用 TypeScript 带来的类型安全和模块化优势构建了一个健壮的服务端应用。通过这种技术栈组合&…

微信小程序绘制轨迹

1、map | uni-app官网 根据官网描述&#xff1a;通过从数据库获取POI数据&#xff0c;并通过 uni-id-common 内的路线规划API&#xff0c;计算路线、距离、时间。 2、 <map style"width:100%;height:96%;" id"myMap" :scale"scale" :longi…

javaWeb项目-ssm+jsp大学生校园兼职系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmjsp大学生校园兼职系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#x…

C++【string类的使用】(上)

文章目录 1. 为什么要学习string类2. 标准库的string类2.1 string的构造函数&#xff08;1&#xff09;无参构造&#xff08;重点&#xff09;&#xff08;2&#xff09;用字符串初始化&#xff08;重点&#xff09;&#xff08;3&#xff09;用字符串的前n个字符初始化(4)拷贝…

前端处理返回的number类型超出16位的问题 ,在axios中统一处理

前端处理返回的number类型超出16位的问题 &#xff0c;在axios中统一处理 造成原因&#xff1a;js的number类型有个最大安全值&#xff0c;即2的53次方&#xff08;9007199254740992&#xff09;&#xff0c;超过这个值就会出现精度丢失的问题。 后端处理&#xff1a;将数字类…

MATLAB Simulink (二)高速跳频通信系统

MATLAB & Simulink &#xff08;二&#xff09;高速跳频通信系统 写在前面1 系统原理1.1 扩频通信系统理论基础1.1.1 基本原理1.1.2 扩频通信系统处理增益和干扰容限1.1.3 各种干扰模式下抗干扰性能 1.2 高速跳频通信系统理论基础1.2.1 基本原理1.2.2 物理模型 2 方案设计2…

使用docker-compose搭建redis7集群-3主3从

下面是一个用于搭建 Redis 集群的 docker-compose.yml 示例文件&#xff0c;它会启动 6 个 Redis 节点&#xff08;3 主节点 3 从节点&#xff09;来构成一个最小的 Redis 集群。 同一个容器内网通讯没问题&#xff0c;但是你要是需要暴露到外网你需要用第二个yml 内网的 v…

Leetcode 最长公共前缀

java solution class Solution {public String longestCommonPrefix(String[] strs) {if(strs null || strs.length 0) {return "";}//用第一个字符串作为模板,利用indexOf()方法匹配,由右至左逐渐缩短第一个字符串的长度String prefix strs[0];for(int i 1; i …

stm32单片机基于rt-thread 的 串行 Flash 通用驱动库 SFUD 的使用

1024程序员节&#xff5c;征文 一、sfud 通用驱动库介绍 SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多&#xff0c;各个 Flash 的规格及命令存在差异&#xff0c; SFUD 就是为了解决这些 Flash 的差异现状而设计&#xff0c;能够支持不同品…

【OpenAI】第六节(语音生成与语音识别技术)从 ChatGPT 到 Whisper 的全方位指南

前言 在人工智能的浪潮中&#xff0c;语音识别技术正逐渐成为我们日常生活中不可或缺的一部分。随着 OpenAI 的 Whisper 模型的推出&#xff0c;语音转文本的过程变得前所未有的简单和高效。无论是从 YouTube 视频中提取信息&#xff0c;还是将播客内容转化为文本&#xff0c;…

K8S系列-Kubernetes网络

一、Kubernetes网络模型 ​ Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#xff0c;并假定所有Pod都在一个可以直接连通的、扁平的网络空间中&#xff0c;不管它们是否运行在同一个Node&#xff08;宿主机&#xff09;中&#xff0c;都…

【Java SE 题库】LeetCode 热题 100--->两数之和

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解析 2.1 判断两个数相加是否等于目标值 2.2 相等后&#xff0c;如何返回两个下标 3. 代码 4. 小结 取于力扣-->LeetCode 热题 100 - 学…

nginx的配置

nginx 通过nginx来进行配置&#xff0c;功能如下 通过nginx的反向代理功能访问后端的网关资源通过nginx的静态服务器功能访问前端静态页面 nginx配置步骤&#xff1a; ①&#xff1a;解压下载下来的nginx的压缩包nginx-1.18.0.zip&#xff0c;安装完成并启动后&#xff0c;访…

面经之一:Synchronized与ReentrantLock区别

Synchronized与ReentrantLock是Java中用于实现线程同步的两种主要机制&#xff0c;它们各有特点和适用场景。以下是它们的主要区别&#xff1a; 实现方式&#xff1a; Synchronized&#xff1a;是Java语言内置的关键字&#xff0c;通过JVM层面的监视器&#xff08;Monitor&…

基于vue3封装了一个coverflow轮播图(层叠轮播图)组件

最近公司有这个需求, 但是网上找了一圈 , 没有合适的能用在vue3里面的、且长这样的组件, 干脆自己动手写了一个; 效果如下, 可以适配多张图片 ,小于五张会是平铺展示; 大于五张按顺序轮播 , 每次切换有动画 <template><div class"Swiper"><div v-i…

COSCon'24 志愿者招募令:共创开源新生活!

亲爱的开源爱好者们&#xff0c; 第九届中国开源年会&#xff08;COSCon24&#xff09;即将在北京中关村国家自主创新示范区会议中心于2024年11月2日至3日隆重举行。今年的主题是“Open Source, Open Life&#xff5c;开源新生活”&#xff0c;旨在探索开源技术如何在各个领域推…

APP综合应用之业务场景脚本测试任务(5)--多重继承与总结

在脚本中&#xff0c;有三个子类继承自父类Test_login,那么怎么同时获得三个子类的继承呢&#xff1f; 1、多重继承 下面用Test_flowdriver的子类继承自上面的三个子类。 新建一个工作流驱动的文件testtest_run_workflowV1.py 主要是创建驱动类时&#xff0c;要把三个子类都继…

VisionPro —— CogBlobTool斑点工具详解

一 CogBlobTool 简介 CogBlobTool 一个用于斑点检测和分析的工具。可以使用该工具检查图像的区域&#xff0c;并定位由灰度值有限范围内的像素组成的特征&#xff0c;这些特征的形状通常是不可预测的。检测和分析这些特征或斑点的过程称为斑点分析。您可以使用blob分析来提供有…