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

server/2024/10/19 10:51:40/

引言

        在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆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地址。

python">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文本。

python">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列表中。最终返回包含供应商信息的列表。

python">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的文件中。每条记录包括供应商的名称和网址。

python">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秒以避免被目标网站封禁。

python">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')

完整代码如下:

python">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.ppmy.cn/server/133024.html

相关文章

阻塞队列的原理?(如何设计一个阻塞队列?)

阻塞队列主要是用于插入和获取的操作 当阻塞队列满了的时候,插入操作会被阻塞,直到队列有空位。当阻塞队列为空的时候,获取操作也会被阻塞,直到队列有数据。ArrayBlockingQueue :有界队列,底层基于数组实现…

Ubuntu中MySQL远程登录设置

mysql单独放在一台Ubuntu服务器上,我远程连接不上。可能是安装的时候忘记设置远程登录了。事后补救措施如下: MySQL 绑定地址配置问题 MySQL 可能只绑定了 localhost,无法接受来自外部主机的连接。你需要检查 MySQL 的配置文件 /etc/mysql/…

链上的羁绊,数据与节点的暗涌心跳

公主请阅 1. 合并两个有序链表1.1 题目说明示例 1示例 2示例 3 1.2 题目分析1.3 代码部分1.4 代码分析 2. 链表的中间节点2.1 题目说明示例 1示例 2 2.2 题目分析2.3 代码部分2.4 代码分析 1. 合并两个有序链表 题目传送门 1.1 题目说明 这个问题要求将两个升序链表合并成一个…

PyTorch 介绍

什么是 PyTorch PyTorch 是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等应用。它由 Facebook 的人工智能研究团队开发,并得到了许多其他机构和个人的贡献。PyTorch 以其易用性、灵活性和动态计算图(也称为自动微分系统&#xf…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为: ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

三子棋(C 语言)

目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路 (1)提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏…

探索 C# 的进阶特性

随着 C# 语言的不断演进,越来越多的特性被引入,提升了代码的可读性和性能。这些进阶特性为开发者提供了更多简洁而强大的工具,用来编写高效、优雅的代码。本文将介绍 C# 中的一些重要进阶特性,包括属性模式匹配、异常过滤器、记录…

学习索引时想到的问题

问题 在查询时,根据两个单独进行索引的字段进行查询,他的查询过程是什么样的? 答:数据库会先评估怎样使用索引是最快的(两个单独的索引和一个包含两个字段的复合索引会使用复合索引而不是用两个单独的索引,也有可能会…