Scrapy嵌套站点地图Spider未按预期工作问题排查
排查Scrapy SitemapSpider未抓取目标链接的问题
看起来你的问题核心大概率是sitemap_rules的正则匹配不精准,咱们一步步来拆解和修复:
1. 先修正正则匹配规则
你的目标链接是https://flatinfo.ru/arenda_kvartir.asp?id=867039,而你写的规则是('/arenda_kvartir/', 'parsed')——注意这里的规则是匹配包含/arenda_kvartir/(末尾带斜杠)的路径,但目标链接的路径是/arenda_kvartir.asp(没有斜杠,是.asp后缀),所以正则根本匹配不上!
把规则改成匹配包含关键词的路径(不管后缀或斜杠),或者更精准匹配.asp链接:
sitemap_rules = [ ('arenda_kvartir', 'parsed'), # 匹配包含该关键词的所有链接 ('prodaja_kvartir', 'parsed'), # 或者更精准写法:('/arenda_kvartir\.asp', 'parsed') ]
2. 确认嵌套站点地图是否被正确跟进
Scrapy的SitemapSpider默认会自动解析主sitemap里包含的子sitemap链接,但你可以打开DEBUG级别的日志来验证:
- 在
settings.py里设置LOG_LEVEL = 'DEBUG' - 运行爬虫时,查看日志里是否有类似
Processing sitemap: https://flatinfo.ru/xxx_sitemap.xml的条目,如果没有,说明主sitemap里的子链接可能没被识别,这时候可以手动把所有子sitemap链接加到sitemap_urls里试试:
sitemap_urls = [ 'https://flatinfo.ru/sitemap.xml', # 比如如果主sitemap里有子链接,手动补充 'https://flatinfo.ru/sitemap_arenda_kvartir.xml', 'https://flatinfo.ru/sitemap_prodaja_kvartir.xml', ]
3. 检查robots.txt限制
有些网站会禁止抓取sitemap或者特定路径,你可以在爬虫里禁用robots协议验证:
要么在settings.py里全局设置:
ROBOTSTXT_OBEY = False
要么在Spider类里单独配置:
custom_settings = { 'ROBOTSTXT_OBEY': False }
4. 验证parsed函数是否被调用
你可以在parsed函数里加个打印语句,确保匹配到链接时会触发:
def parsed(self, response): print(f"Successfully crawled: {response.url}") yield { # 这里写你的数据提取逻辑 'url': response.url, # 其他字段... }
按照上面的步骤调整后,应该就能让爬虫正确抓取到目标链接并执行parsed函数了。
内容的提问来源于stack exchange,提问作者JBJ
相关产品推荐
相关产品推荐

