Scrapy管道无法过滤含#的内部链接问题求助
Scrapy过滤含#的内部链接问题修复
问题根源
- 管道未生效:Scrapy要求管道类必须实现
process_item方法,你的管道用了自定义的drop_links,框架不会自动调用这个方法。 - 链接处理逻辑错误:
links是列表类型,转成字符串判断会导致只要列表里有一个含#的链接就丢弃整个item,且逻辑方向错误——你需要过滤链接而非丢弃item。 - 爬虫ItemLoader使用不当:当前代码多次创建ItemLoader并单独yield,生成多个碎片化的item(比如有的只有title和meta,有的只有links),数据结构混乱。
修改后的代码
1. 修复pipelines.py
from scrapy.exceptions import DropItem from google_crawl.items import PageCrawlItem class SpiderValidationPipeline: def process_item(self, item, spider): # 仅处理页面爬虫的item,避免影响谷歌爬虫 if isinstance(item, PageCrawlItem): links = item.get('links') if links: # 过滤掉包含#的链接,保留有效链接 filtered_links = [link for link in links if '#' not in link] item['links'] = filtered_links return item
2. 修复pagespider.py
import scrapy from scrapy.loader import ItemLoader from google_crawl.items import PageCrawlItem class PageSpider(scrapy.Spider): name = 'page' start_urls = ['https://en.wikipedia.org/wiki/Software_as_a_service'] def parse(self, response): # 创建单个ItemLoader加载所有字段,生成完整item page_item = ItemLoader(item=PageCrawlItem(), selector=response) # 加载头部信息 page_item.add_css('title', 'title') page_item.add_css('meta', 'meta') # 加载正文内容 page_item.add_css('paragraph', 'p') page_item.add_css('h1', 'h1') page_item.add_css('h2', 'h2') page_item.add_css('h3', 'h3') page_item.add_css('h4', 'h4') # 加载并后续过滤链接 page_item.add_css('links', 'a::attr(href)') yield page_item.load_item()
效果验证
运行爬虫后,输出的links字段将只保留不含#的链接,管道会正常处理每个完整item,不会再出现无效过滤或管道不生效的问题。
内容的提问来源于stack exchange,提问作者Kate B
相关产品推荐
相关产品推荐

