如何从allrecipes站点URL提取路径参数及配置Scrapy分页规则
解决方案
一、URL路径参数提取问题
你可以通过「先过滤空路径段 + 定位数字路径段位置」的通用方案实现需求,核心逻辑是利用该站点URL的固定结构:所有需要提取的分类路径都位于/recipes/后的数字ID段之后,无需提前预知路径段数量。
示例代码如下:
def get_valid_categories(url): # 拆分URL并过滤所有空字符串,自动处理末尾/带来的空元素问题 path_parts = [part for part in url.split("/") if part] # 定位recipes段的索引,下一段即为数字ID段 recipes_pos = path_parts.index("recipes") # 取数字ID段之后的所有内容即为目标分类 return path_parts[recipes_pos + 2:] # 测试所有示例URL urls = [ 'https://www.allrecipes.com/recipes/695/world-cuisine/asian/chinese/', 'https://www.allrecipes.com/recipes/94/soups-stews-and-chili/', 'https://www.allrecipes.com/recipes/416/seafood/fish/salmon/', 'https://www.allrecipes.com/recipes/205/meat-and-poultry/pork/' ] for u in urls: print(get_valid_categories(u))
运行输出完全符合你的预期:
['world-cuisine', 'asian', 'chinese'] ['soups-stews-and-chili'] ['seafood', 'fish', 'salmon'] ['meat-and-poultry', 'pork']
二、Scrapy分页规则配置问题
你原有的规则不正确,正则没有匹配分页URL中数字ID和分类路径的中间部分,且没有对查询参数前的问号做转义。
调整后的规则如下:
Rule(LinkExtractor(allow=r'/recipes/.*\?page=\d+'), follow=True)
正则含义说明:
/recipes/:匹配URL中固定的分类前缀.*:匹配数字ID、分类路径等任意中间内容\?:转义匹配查询参数起始的问号page=\d+:匹配分页参数和数字页码
该规则可以适配所有分类下的分页URL。
内容的提问来源于stack exchange,提问作者abctrial
相关产品推荐
相关产品推荐

