爬取竞争对手的数据是营销人员、市场卖家和代理机构的常见做法。您监控 Wildberries 的价格,从 Avito 收集广告,分析竞争对手的产品组合。但大多数网站会阻止大量请求,而忽视 robots.txt 文件可能会导致法律问题。在本文中,我们将探讨如何以伦理方式使用代理进行爬虫:遵守网站规则,避免封锁,并在没有商业风险的情况下收集数据。
什么是 robots.txt 以及它对网站的作用
robots.txt 文件是网站根目录中的文本文件,告知搜索机器人和爬虫哪些部分可以被扫描,哪些部分被禁止。例如,在线商店可能会禁止对购物车或个人账户的索引,以确保这些页面不会出现在 Google 中。
典型的 robots.txt 文件如下所示:
User-agent: * Disallow: /admin/ Disallow: /cart/ Disallow: /api/ Crawl-delay: 10 User-agent: Googlebot Allow: / Sitemap: https://example.com/sitemap.xml
指令解析:
User-agent: *— 适用于所有机器人的规则(星号表示“任何机器人”)Disallow: /admin/— 禁止扫描 /admin/ 部分Crawl-delay: 10— 请求之间的延迟为 10 秒User-agent: Googlebot— 针对 Google 的特殊规则(允许所有)
网站使用 robots.txt 的原因:
- 保护服务器免受过载 — 大规模爬虫会给服务器带来负担,减慢真实用户的访问速度
- 隐藏技术页面 — 购物车、支付表单、API 端点不应被索引
- 保护商业数据 — 市场卖家不希望竞争对手轻易下载整个产品目录
- 节省流量 — 每个机器人的请求对网站所有者来说都是有成本的
重要: robots.txt 是一种建议,而不是技术障碍。该文件并不会物理阻止访问,但忽视规则可能导致您的 IP 被封锁或面临诉讼(尤其是在美国和欧洲)。
爬虫的法律风险:法律如何规定
数据爬虫处于法律的灰色地带。不同国家有不同的规定,但有一些共同的原则是重要的,以避免法律诉讼。
俄罗斯的立法
俄罗斯没有专门针对爬虫的法律,但适用一般规范:
- 版权法 (民法典第 1259 条) — 未经权利人许可,不得复制独特的文本、照片、产品描述。爬取价格和特征通常是安全的,因为这些是事实数据。
- 个人数据 (152-FZ) — 禁止在未获得同意的情况下收集用户的个人数据(姓名、电话、电子邮件)。这涉及到社交媒体或联系人数据库的爬虫。
- 不正当竞争 (行政法第 14.33 条) — 如果爬虫用于复制商业模式或误导客户,可能会面临高达 500,000 卢布的罚款。
美国和欧洲的立法
在美国和欧盟,法律更加严格:
- CFAA (计算机欺诈和滥用法,美国) — 未经授权访问计算机系统被视为犯罪。违反 robots.txt 可能被视为“未经授权的访问”。著名案例:LinkedIn vs hiQ Labs(2022) — 法院裁定,爬取公开数据是合法的,但忽视技术障碍(例如,验证码)则不合法。
- GDPR (通用数据保护条例,欧盟) — 禁止在未明确同意的情况下收集欧盟公民的个人数据。罚款高达 2000 万欧元或公司年营业额的 4%。
- 服务条款 (用户协议) — 许多网站在其规则中明确禁止爬虫。违反可能导致因违约而提起诉讼。
实用建议: 在爬虫之前,请检查三个文件:目标网站的 robots.txt、服务条款和隐私政策。如果爬虫被明确禁止,请寻找替代数据源(公开 API、合作伙伴计划、现成的数据集)。
安全爬取的内容
| 数据类型 | 风险 | 备注 |
|---|---|---|
| 商品价格 | 低 | 事实数据,不受版权保护 |
| 商品特征 | 低 | 技术数据是安全的 |
| 独特描述 | 高 | 受版权保护 |
| 商品照片 | 高 | 需要权利人的许可 |
| 用户联系方式 | 关键 | 违反 152-FZ 和 GDPR |
| 公开统计数据 | 低 | 公开数据是安全的 |
伦理爬虫:如何合法收集数据
伦理爬虫是在商业目标与对网站所有者的尊重之间的平衡。您可以收集所需的数据,而不会给目标资源带来问题,也不会违反法律。
伦理爬虫的基本原则
- 遵守 robots.txt — 如果某个部分被禁止爬虫,请不要试图绕过。寻找替代数据源。
- 限制请求速度 — 不要每秒发送 1000 个请求。在请求之间保持 2-10 秒的延迟,以免给服务器带来负担。
- 使用您的爬虫的 User-Agent — 不要伪装成普通用户。提供诚实的 User-Agent,例如:“MyCompanyParser/1.0 (contact@mycompany.com)”。这使网站管理员可以在出现问题时与您联系。
- 仅爬取公开数据 — 不要试图访问受限部分、API 或数据库。
- 不要转售复制的数据 — 将收集的信息用于内部需求(竞争分析、价格监控),而不是用于创建竞争服务。
- 缓存数据 — 不要多次请求同一页面。将结果保存在本地并按计划更新(每天一次,每周一次)。
何时不应爬虫
有些情况下,爬虫会带来比好处更多的问题:
- 网站提供 API — 许多市场(Wildberries、Ozon、Yandex.Market)为合作伙伴提供官方 API。使用它们而不是爬虫 — 这样更快、更合法、更可靠。
- 数据受到验证码或授权保护 — 绕过保护可能被视为系统入侵。
- 网站在服务条款中明确禁止爬虫 — 法律诉讼风险太高。
- 您收集个人数据 — 这违反了 GDPR 和 152-FZ,可能面临巨额罚款。
如何正确阅读和遵守 robots.txt
robots.txt 文件位于域名根目录:https://example.com/robots.txt。在开始爬虫之前,请始终检查此文件。
robots.txt 的主要指令
| 指令 | 含义 | 示例 |
|---|---|---|
User-agent |
适用于哪个机器人的规则 | User-agent: *(所有机器人) |
Disallow |
禁止爬虫的部分 | Disallow: /admin/ |
Allow |
允许的部分(Disallow 的例外) | Allow: /public/ |
Crawl-delay |
请求之间的最小延迟(以秒为单位) | Crawl-delay: 10 |
Sitemap |
网站地图链接(所有页面的列表) | Sitemap: /sitemap.xml |
robots.txt 示例及其解释
示例 1:完全禁止爬虫
User-agent: * Disallow: /
这意味着:“所有机器人都被禁止扫描整个网站”。爬取这样的网站是违反所有者规则的。寻找替代数据源。
示例 2:选择性限制
User-agent: * Disallow: /admin/ Disallow: /api/ Disallow: /cart/ Allow: /products/ Crawl-delay: 5
这意味着:“可以爬取 /products/(商品)部分,但禁止访问 /admin/、/api/ 和 /cart/。在请求之间保持 5 秒的延迟”。这是正常的条件 — 可以在遵守限制的情况下爬取商品。
示例 3:针对特定机器人的规则
User-agent: Googlebot Allow: / User-agent: * Disallow: / Crawl-delay: 10
这意味着:“Google 可以扫描整个网站,但其他所有机器人都不可以”。如果您不是 Google,则禁止爬虫。
如何在爬虫之前检查 robots.txt
大多数编程语言都有库来自动检查 robots.txt。以下是 Python 的示例:
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url("https://example.com/robots.txt")
rp.read()
# 检查是否可以爬取页面
url = "https://example.com/products/item123"
user_agent = "MyParser/1.0"
if rp.can_fetch(user_agent, url):
print("爬虫被允许")
else:
print("爬虫被 robots.txt 禁止")
这将自动检查规则并告知是否可以爬取特定的 URL。
速率限制和请求之间的延迟
速率限制(请求速度限制)是保护网站免受过载的措施。如果您在短时间内发送过多请求,服务器可能会封锁您的 IP 或显示验证码。
遵守延迟的重要性
- 避免 IP 被封锁 — 网站会跟踪来自同一 IP 的请求频率。如果您每分钟发送 100 个请求,您将被视为机器人而被封锁。
- 降低服务器负担 — 大规模爬虫可能会“瘫痪”网站,尤其是当这是一个小型资源时。
- 遵守 robots.txt 中的 Crawl-delay — 如果网站指定了 10 秒的延迟,忽视此规则是不道德的。
- 更自然的行为 — 普通用户不会每秒打开 10 个页面。延迟使您的爬虫看起来更像真实用户。
不同任务的推荐延迟
| 爬虫类型 | 请求之间的延迟 | 备注 |
|---|---|---|
| 小型网站(最多 1000 页) | 5-10 秒 | 服务器性能低 |
| 中型网站(在线商店) | 2-5 秒 | 最佳平衡 |
| 大型市场(Wildberries、Ozon) | 1-3 秒 | 强大的基础设施,但保护措施严格 |
| API 端点 | 根据 API 限制(通常为 10-100 请求/分钟) | 请查看 API 文档 |
| 社交媒体(Instagram、VK) | 10-30 秒 | 限制非常严格,封禁风险高 |
如何在代码中实现延迟
使用 time 库的 Python 示例:
import time
import requests
urls = [
"https://example.com/product1",
"https://example.com/product2",
"https://example.com/product3"
]
for url in urls:
response = requests.get(url)
print(f"爬取了:{url}")
# 在下一个请求之前延迟 3 秒
time.sleep(3)
对于更复杂的场景,请使用随机延迟(random delay),使行为更加自然:
import time
import random
for url in urls:
response = requests.get(url)
# 随机延迟 2 到 5 秒
delay = random.uniform(2, 5)
time.sleep(delay)
伦理爬虫的代理轮换
即使您遵守 robots.txt 并进行延迟,从一个 IP 爬取大量数据也可能引起怀疑。代理轮换有助于在不同的 IP 地址之间分配请求,模拟多个真实用户的行为。
为什么需要代理轮换
- 绕过速率限制 — 如果从一个 IP 的限制是每小时 100 个请求,那么 10 个代理将为您提供每小时 1000 个请求。
- 地理分布 — 对于爬取区域数据(例如,莫斯科和海参崴的 Wildberries 价格),需要来自不同城市的代理。
- 降低怀疑 — 来自不同 IP 的请求看起来像是来自真实用户的流量。
- 备用 — 如果一个代理被封锁,爬虫会自动切换到另一个代理。
用于伦理爬虫的代理类型
| 代理类型 | 优点 | 缺点 | 何时使用 |
|---|---|---|---|
| 住宅代理 | 真实家庭用户的 IP,封禁风险低 | 比其他类型贵 | 爬取社交媒体、强保护的市场 |
| 移动代理 | 移动运营商的 IP,最大信任度 | 最贵,可用 IP 较少 | 爬取 Instagram、TikTok、移动应用 |
| 数据中心代理 | 便宜,速度快 | 易被检测,常在黑名单中 | 爬取简单网站,测试 |
伦理爬虫的建议: 使用 住宅代理 进行自动轮换。它们在成本和可靠性之间提供平衡,其 IP 看起来像普通用户。
代理轮换策略
- 每个请求轮换 — 每个请求都使用新的 IP。适用于有严格限制的网站(社交媒体、市场)。
- 定时轮换(每 5-10 分钟) — 一个 IP 用于多个请求,然后更换。更自然的行为。
- 粘性会话(Sticky sessions) — 一个 IP 用于整个用户会话(例如,登录 + 爬取个人账户)。对需要登录的网站至关重要。
- 地理轮换 — 每个区域使用该区域的代理。例如:在莫斯科爬取 Wildberries 价格 — 使用来自莫斯科的代理。
Python 中的代理轮换示例
import requests
import random
import time
# 代理列表(替换为真实的)
proxies_list = [
{"http": "http://user:pass@proxy1.example.com:8080"},
{"http": "http://user:pass@proxy2.example.com:8080"},
{"http": "http://user:pass@proxy3.example.com:8080"}
]
urls = [
"https://example.com/product1",
"https://example.com/product2",
"https://example.com/product3"
]
for url in urls:
# 选择随机代理
proxy = random.choice(proxies_list)
try:
response = requests.get(url, proxies=proxy, timeout=10)
print(f"通过 {proxy} 爬取了 {url}")
except Exception as e:
print(f"代理 {proxy} 出现错误:{e}")
# 延迟 3 秒
time.sleep(3)
实际案例:爬取市场和竞争对手
让我们看看一些实际的伦理爬虫场景。
案例 1:监控 Wildberries 的价格
任务: 您在 Wildberries 上销售商品,想要监控竞争对手的价格,以便调整自己的价格。
问题:
- Wildberries 在频繁请求时会封锁 IP
- 价格取决于交付区域
- 每天需要爬取 100-500 个商品
伦理解决方案:
- 检查 robots.txt — Wildberries 允许爬取商品卡片,但禁止 API 端点。
- 使用住宅代理 — 为每个区域(莫斯科、圣彼得堡、新西伯利亚)获取该区域的代理。
- 每个请求轮换 — 每个商品使用新的 IP 进行爬取。
- 延迟 2-3 秒 — 在请求之间保持间隔。
- 每天爬取一次 — 不必每小时更新价格,每天监控一次就足够了。
结果: 您获得了竞争对手的最新价格,而不会被封锁。Wildberries 没有检测到异常负载,因为请求在时间和 IP 上分散。
案例 2:爬取 Avito 上的广告
任务: 您是一名房地产经纪人,想要收集您所在城市的所有公寓出售广告以进行市场分析。
问题:
- Avito 在可疑活动时会显示验证码
- 需要爬取 5000+ 个广告
- 数据每天更新
伦理解决方案:
- 检查 robots.txt — Avito 允许爬取广告页面,但 Crawl-delay 为 5 秒。
- 使用住宅代理 — 每 10 个请求轮换一次代理(而不是每个请求,以免看起来可疑)。
- 延迟 5-7 秒 — 遵守 robots.txt 中的 Crawl-delay。
- 在夜间爬取 — 当网站负载最小(凌晨 2-6 点)时进行爬取。
- 缓存数据 — 不要重复爬取同一广告,将结果保存到数据库中。
结果: 您在一夜之间收集了所有新的广告,而没有验证码和封锁。Avito 没有经历过载,您获得了所需的数据。
案例 3:分析竞争对手的产品组合
任务: 您是一家电子商务网站的所有者,想要了解竞争对手的新产品。
问题:
- 竞争对手的网站在受保护的主机上,具有反机器人系统
- 需要爬取 10,000 个商品的目录
- 您希望每周进行一次
伦理解决方案:
- 检查 robots.txt — 允许爬取 /catalog/,禁止 /admin/ 和 /api/。
- 使用网站地图 — 不要手动遍历所有页面,而是从 sitemap.xml 获取 URL 列表(这更快且不会造成额外负担)。
- 使用每 5 分钟轮换的住宅代理 — 一个 IP 进行 20-30 个请求,然后更换。
- 延迟 3-5 秒 — 模拟普通用户的行为。
- 仅爬取新产品 — 将当前目录与先前的目录进行比较,仅爬取更改。
结果: 您每周获得竞争对手的新产品列表,而不会被封锁。竞争对手的网站没有遇到问题,您获得了竞争优势。
遵守规则的自动化工具
有现成的工具可以简化伦理爬虫并自动遵守 robots.txt。
Scrapy (Python)
Scrapy 是一个流行的 Python 爬虫框架。它会自动检查 robots.txt 并遵守规则。
在 Scrapy 中设置遵守 robots.txt:
# settings.py # 启用遵守 robots.txt ROBOTSTXT_OBEY = True # 请求之间的延迟(以秒为单位) DOWNLOAD_DELAY = 3 # 随机延迟(从 0.5 到 1.5 * DOWNLOAD_DELAY) RANDOMIZE_DOWNLOAD_DELAY = True # 限制对同一域的并发请求 CONCURRENT_REQUESTS_PER_DOMAIN = 1 # 您的爬虫的 User-Agent USER_AGENT = 'MyCompanyParser/1.0 (+http://mycompany.com/bot)'
使用这些设置,Scrapy 会在爬虫之前自动检查 robots.txt,并遵守所有规则。
Apify (云平台)
Apify 是一个无代码的云爬虫平台。您通过可视化界面创建爬虫,Apify 自动管理代理和遵守限制。
伦理爬虫的优势:
- 内置代理轮换(住宅和数据中心)
- 自动遵守 robots.txt
- 通过界面设置延迟
- 调度运行(每天/每周爬虫)
Octoparse (无代码爬虫)
Octoparse 是一个桌面应用程序,用于无编程的爬虫。适合不懂编程的营销人员和卖家。
如何在 Octoparse 中设置伦理爬虫:
- 打开任务设置(Task Settings)
- 启用“尊重 robots.txt”
- 设置延迟(Delay)为 3-5 秒
- 在“代理设置”中连接代理
- 设置运行调度(Schedule)
Puppeteer/Playwright (JavaScript)
Puppeteer 和 Playwright 是用于浏览器自动化的库。它们适用于爬取具有 JavaScript 渲染的网站。
使用 Puppeteer 进行伦理爬虫的示例:
const puppeteer = require('puppeteer');
const robotsParser = require('robots-parser');
async function ethicalScrape(url) {
// 检查 robots.txt
const robots = robotsParser('https://example.com/robots.txt',
'MyParser/1.0');
if (!robots.isAllowed(url)) {
console.log('爬虫被 robots.txt 禁止');
return;
}
const browser = await puppeteer.launch();
const page = await browser.newPage();
// 加载页面前的延迟
await new Promise(resolve => setTimeout(resolve, 3000));
await page.goto(url);
const data = await page.evaluate(() => {
return document.querySelector('h1').innerText;
});
console.log(data);
await browser.close();
}
ethicalScrape('https://example.com/product1');
结论
通过代理进行伦理爬虫是在商业目标与对网站所有者的尊重之间的平衡。遵守 robots.txt、在请求之间进行延迟并使用代理轮换,您可以在没有法律风险和封锁的情况下收集所需的数据。主要原则:在爬虫之前检查 robots.txt,限制请求速度,使用诚实的 User-Agent,并仅爬取公开数据。这将保护您的业务免受法律诉讼,并确保爬虫的稳定运行。
如果您计划爬取市场、竞争对手的网站或收集市场分析数据,建议使用 住宅代理 进行自动轮换。它们提供了成本和可靠性之间的平衡,其 IP 看起来像普通用户。