大多数爬虫新手从完整的网站爬取开始:访问主页,收集所有链接,逐个点击,然后再次收集链接——如此反复成千上万次。这消耗了代理、时间,并且常常以被封禁告终。有更简单、更便宜的方法:几乎每个大型网站,包括Wildberries、Ozon和Avito,都已经有了所有页面的现成地图——sitemap.xml。我们来看看如何找到、阅读并使用它,而不是进行成千上万的额外请求。
什么是sitemap.xml,爬虫为什么需要它
Sitemap.xml是网站为搜索引擎(如Google和Yandex)创建的文件。它列出了所有网站所有者希望被索引的页面:产品卡、类别、博客文章。实际上,这是一个网站自己提供的URL列表——不需要手动点击链接、翻页或推测导航逻辑。
对于监控Wildberries或Ozon上竞争对手价格的卖家来说,这意味着:与其遍历成千上万的类别和分页页面,不如一次性通过对sitemap的请求获得所有产品卡的列表。对于收集竞争对手内容分析的URL基础的营销人员来说,这节省了数小时的手动工作。对于爬虫分析竞争对手创意的套利者,sitemap一次性显示所有网站页面。
重要的一点是:并不是所有页面都会包含在sitemap中。有时,带有过滤器的页面、临时促销或带有参数的URL页面不会被包括在内。因此,sitemap并不总是覆盖网站的100%,但通常包含80-95%的有用页面,这些页面是您进行目录或监控所需的。
完整爬取 vs sitemap优先:成本比较
如果不以抽象的“尝试”来计算,而是以实际资源来计算:请求数量、代理流量消耗和结果所需时间,方法之间的差异是显而易见的。以下是以收集50,000个产品卡的目录为例的比较。
| 参数 | 完整爬取网站 | 通过sitemap解析 |
|---|---|---|
| 收集URL请求数 | 15,000–20,000(类别、分页、过滤器) | 50–300(仅sitemap文件) |
| 收集URL列表所需时间 | 4–8小时 | 15–30分钟 |
| IP被封风险 | 由于请求量大,风险高 | 风险低,请求量少得多 |
| 代理流量负载 | 高,需要大量IP池 | 最低,可以用少量IP池 |
| 爬虫逻辑复杂性 | 高,需要解析导航 | 低,解析XML结构 |
标题中的“便宜10倍”并不是夸张。如果完整爬取需要15,000-20,000个请求仅用于生成页面列表,而sitemap只需50-300个请求就能提供相同的列表,那么在代理流量和时间上的节省就是成倍的。同时,您仍然需要单独下载产品卡——但您确切知道要下载哪些URL,并且不会浪费资源在空页面、重复和垃圾链接上。
如何在任何网站上找到sitemap.xml
第一个也是最简单的方法是将/sitemap.xml添加到网站域名后。例如,您可以尝试在浏览器中打开类似https://example.com/sitemap.xml的地址。这对于大多数网站,包括许多流行CMS上的在线商店都有效。
如果该地址没有内容,请检查robots.txt文件——它几乎总是位于/robots.txt,并且在大多数情况下包含行Sitemap: https://example.com/sitemap_index.xml。这是网站告知搜索引擎在哪里寻找地图的官方方式。在像Wildberries和Ozon这样的大型市场中,网站地图通常分为数十个文件,并通过robots.txt指定。
第三个选项是查找Google Search Console等系统中的提及(如果您有自己网站的访问权限),或者使用专门的网站扫描器,自动找到所有sitemap文件。对于竞争对手的外部网站,通常前两种方法就足够了——robots.txt几乎从不对外部用户关闭,这是一个公开文件。
建议:
sitemap文件名并不总是标准的。可能会出现sitemap_index.xml、sitemap-products.xml、product-sitemap.xml等变体。始终从robots.txt开始——它会指明确切的路径。
市场平台的sitemap结构:索引和嵌套地图
小型网站通常只有一个包含所有URL的sitemap.xml文件。但对于像Wildberries、Ozon或Avito这样的大型目录,页面数量达到数百万,一个XML文件的体积将不便于使用。因此,他们使用所谓的sitemap索引——一个索引文件,引用数十或数百个按类别、日期或简单地按10,000-50,000个URL分开的单独sitemap文件。
结构大致如下:首先,您打开主索引文件,在其中找到指向子sitemap的链接列表,例如sitemap-products-1.xml、sitemap-products-2.xml等。然后需要下载每个文件,并从中提取最终的产品卡URL。这是一个两级过程,但仍然比手动遍历网站导航快得多。
有时,子sitemap文件以gzip格式压缩(扩展名为.xml.gz)——这是节省服务器空间的标准做法。如果脚本下载文件并看到不可读的符号而不是XML,则可能需要在解析之前先解压缩内容。
逐步提取sitemap中的URL
对于使用现成的无代码爬虫工具的人来说,大多数现代市场目录爬虫已经能够自动读取sitemap——只需指定网站的根URL,工具就会自动找到robots.txt,找到sitemap索引并收集所有产品卡的列表。但如果您与开发人员合作或自己编写小脚本,工作逻辑很简单,以下是Python的示例:
import requests
import gzip
from io import BytesIO
from lxml import etree
def get_sitemap_urls(sitemap_url, proxies=None):
response = requests.get(sitemap_url, proxies=proxies, timeout=15)
content = response.content
# 如果文件被压缩,则解压gzip
if sitemap_url.endswith('.gz'):
content = gzip.decompress(content)
root = etree.fromstring(content)
namespace = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
# 如果这是sitemap索引——收集子地图的链接
sub_sitemaps = root.findall('.//ns:sitemap/ns:loc', namespace)
if sub_sitemaps:
all_urls = []
for sub in sub_sitemaps:
all_urls.extend(get_sitemap_urls(sub.text, proxies))
return all_urls
# 如果这是普通的sitemap——收集最终的URL
urls = root.findall('.//ns:url/ns:loc', namespace)
return [url.text for url in urls]
proxy = {
"http": "http://user:pass@proxy_host:port",
"https": "http://user:pass@proxy_host:port"
}
urls = get_sitemap_urls("https://example.com/sitemap_index.xml", proxies=proxy)
print(f"找到的URL数量: {len(urls)}")
该脚本递归遍历索引文件,下载每个子地图并将所有最终链接收集到一个列表中。最终,您将获得产品卡的完整URL列表,而无需进行任何多余的导航。
按URL模板过滤所需页面
在您从sitemap获取完整的URL列表后,几乎总是需要进行过滤。在一个市场平台的sitemap文件中,产品卡、类别页面、博客文章、品牌页面和服务页面可能会并存。您可能只需要特定类别的产品卡。
通常使用URL模板进行过滤。例如,如果网站上的产品卡形式为/catalog/product/12345,而类别形式为/catalog/category/electronics,那么通过简单的路径段比较就可以轻松区分两者。对于结构不那么明显的情况,可以使用正则表达式——它们允许您一次定义模板,并立即过滤数十万条链接。
另外,查看sitemap中的<lastmod>标签也很有用——它们显示页面的最后修改日期。如果您只需要最近一周更新的商品(例如,用于监控竞争对手的新产品),可以根据此日期过滤URL,而不必处理几个月未更改的页面。
设置代理以批量下载网站地图
尽管对sitemap的请求远少于完整爬取,但像Wildberries和Ozon这样的网站仍然会监控可疑活动——来自单个IP的请求过于频繁、非典型的User-Agent、缺少浏览器头信息。因此,即使是下载sitemap文件,也建议使用代理,特别是如果您计划进行定期监控,而不是一次性收集目录。
对于下载sitemap的XML文件,通常只需使用数据中心代理——它们快速且便宜,而对sitemap的请求较少,网站对它们的严格保护相对较少。至于下载收集到的产品卡的阶段,由于请求数量大且保护更严格,最好转向住宅代理——它们使用普通用户的真实IP,更不容易被市场的反机器人系统封禁。
如果您通过移动版本的网站或仅在移动流量下提供数据的API监控目录,建议考虑使用移动代理——它们使用移动运营商的IP,并被大多数反欺诈系统视为最可信的。
在脚本或爬虫中的实际设置很简单:在请求的相应字段中指定代理的主机、端口、用户名和密码(如上面代码示例中的proxies参数所示),或者如果您使用现成的无代码爬虫或反检测浏览器(如Dolphin Anty或AdsPower)手动检查网站结构以设置自动收集,请在配置文件的设置中插入代理数据:打开“代理”选项卡→选择HTTP或SOCKS5类型→插入主机、端口、用户名、密码→保存配置文件。
处理sitemap时常见错误
第一个也是最常见的错误是忽略robots.txt并尝试随意猜测sitemap地址。这是一种浪费时间的行为,可以通过查看索引规则文件轻松避免。
第二个错误是没有考虑到sitemap可能不完整。一些网站故意将低价值的页面排除在sitemap之外,但这些页面对于价格监控仍然重要——例如,缺货的产品页面。如果通过sitemap解析后收集到的产品卡数量明显少于预期,建议与网站在类别中显示的产品数量进行核对,并在必要时通过点对点爬取补充缺失的部分。
第三个错误是未缓存已下载的sitemap文件。如果您每天进行监控,没有必要每次都重新下载索引文件和所有子地图——其中大多数不会每天更改。请在本地保存URL列表,仅更新实际根据lastmod日期发生变化的部分。
第四个错误是忘记请求头。即使是下载简单的XML文件,如果请求看起来像是来自机器人:没有User-Agent、没有Accept-Language、使用默认的非典型请求头,可能会被封禁。添加现实的浏览器请求头与代理结合使用,可以显著降低在此阶段被封禁的可能性。
通过sitemap启动爬虫的检查清单
在启动完整的目录收集之前,请按照简短的步骤列表进行检查,以免在错误上浪费时间:
- 检查了网站的robots.txt并找到了sitemap或sitemap索引的确切地址
- 确认sitemap结构是两级(索引+子地图)或单级
- 检查子文件是否被gzip压缩
- 确定所需页面的URL模板(产品卡、类别等)
- 设置按模板或lastmod日期进行过滤,如果只需要最新产品
- 为下载sitemap文件和单独下载产品卡连接代理
- 添加现实的请求头(User-Agent、Accept-Language)
- 设置缓存和日期比较以便于重复监控
- 将最终的URL数量与网站上大致的产品数量进行核对
结论
sitemap优先的方法并不是黑客行为或绕过保护,而是利用网站自己为搜索引擎发布的信息。与其进行成千上万的导航、类别和分页请求,不如通过对XML文件的几十个请求获得所需页面的现成列表。这节省了启动爬虫的时间,减少了代理流量消耗,并显著降低了IP被封禁的风险,因为对网站的负载远低于完整爬取。
如果您刚开始监控Wildberries、Ozon或其他大型网站的目录,请从sitemap开始——您可能在第一次启动时就节省了数小时的工作。下载sitemap文件只需便宜的数据中心代理,而对于后续定期收集产品卡数据,风险更高,建议使用住宅代理——它们确保爬虫在长时间内稳定运行而不会频繁被封禁。