引言
在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆 IP 地址或部署复杂的反爬机制,限制了来自特定区域的访问和自动化数据抓取。对于希望获取跨境市场信息的企业来说,这些限制带来了巨大的挑战,尤其是在需要获取实时且准确的数据时,传统的爬虫技术往往面临失效的风险。
为了解决这一问题,使用 IP 代理是一个行之有效的策略。代理 IP 能够动态分配不同区域的 IP 地址,使数据请求的来源看似分散,避免因短时间内过多请求而触发网站的安全机制。通过定期轮换 IP 并加入高匿名代理服务,可以有效防止反爬虫系统的检测,继续获取宝贵的数据。接下来我们通过一个爬虫实战来了解如何将 IP 代理技术集成到爬虫中。
青果网络
Alibaba 海外版数据采集
跨境电商最关注的就是进货渠道,收集某种产品的供货商信息是十分必要的手段。Alibaba 近些年在深耕海外市场,是跨境电商常用的平台之一。接下来我们尝试采集 Alibaba 海外版的商品数据。
目标
本次任务的目标是给定一种商品,查询它的所有供应商。在开始之前,我们先来观察一下网页结构。当我们搜索某商品的代理商时(例如 laptop),它的 url 如下:
可以看到 IndexArea 对应了供应商的视图,而 SearchText 的值对应了搜索的关键词,page 的值对应了页面。我们继续观察,可以看到卡片对应了 factory-card 的类。继续观察可以得到:标题存放在 card-title 下的 info 下的 detail-info 的 a 标签中,而供应商页面在这个标签的 href 属性中。这些都可以使用 xpath 获取到。
配置代理
接下来我们购买代理 IP 来加速访问速度,并隐藏我们自己的 IP 以免被网站封禁。市面上类似的产品已经非常多了,我自己也经常使用这类产品。
有朋友问我芝麻代理业务不做了,还有什么靠谱的代理 IP 可以推荐?
我个人是比较推荐青果网络代理 IP,是我最近一直在用的产品,也给很多朋友推荐过。经过测试,它的日 IP 去重量高达 220W,业务成功率也是同类产品中的佼佼者,能够满足我们的数据采集的需求。除此之外,在易用性上,它有一套 IP 可用性保障机制。如果初次分配的是不可用 IP,会直接跳过此 IP 并重新分配;而且国内访问响应时间平均在 1 秒内,跑起来相当快。不仅如此,在价格方面对比同行性价比高,而且现在提供 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 = 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()
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.text
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.xpath('./text()')[0] # 修正获取标题的方法
url = 'https:' + node.xpath('./@href')[0] # 修正获取URL的方法
result.append({'supplier': title, 'url': url})
return result
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']}\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() # 获取代理IP
page_content = get_page(url, ip) # 获取页面内容
text = parse_page(page_content) # 解析页面
save(text) # 保存结果
time.sleep(5) # 暂停5秒
print('Done')
if __name__ == '__main__':
main()
复制代码
获取数据
接下来我们启动爬虫获取数据。
运行完毕后,打开 txt 文档即可看到数据。
总结
使用 IP 代理解决跨境电商数据采集中的挑战是非常有效的策略。通过代理技术,企业可以绕过地域性封锁和网站的反爬机制,稳定获取所需数据。像青果网络这样提供全球代理服务的企业,不仅能够帮助企业实现数据采集的顺畅进行,还提供高防御和高匿名性,确保访问安全性和隐私保护。这样的技术支持让企业能够在复杂的跨境环境中更加自如地进行市场分析与业务扩展。
评论