Scrapy爬虫未遍历条目:重复输出同一新闻内容的问题求助
问题根源与修复方案
嘿,你遇到的问题其实很典型——循环里引用了整个选择器集合,而不是当前循环的单个元素!
先看你代码里的问题点:
for website in link: yield { 'title': link.css('tr.athing td.title a.storylink::text').get(), 'link': link.css('tr.athing td.title a::attr(href)').get() }
这里的link是通过response.css('tr.athing')获取的所有新闻条目集合,每次调用.get()只会返回这个集合里第一个元素的对应值,所以循环30次(每页的条目数),输出的都是第一条新闻的内容。
修复后的代码
把循环里的link换成当前迭代的website就行,而且因为website已经是单个tr.athing元素了,内部选择器可以简化掉重复的tr.athing:
import scrapy class ArticlesSpider(scrapy.Spider): name = 'articles' start_urls = [ 'https://news.ycombinator.com', 'https://news.ycombinator.com/news?p=2' ] def parse(self, response): link = response.css('tr.athing') for website in link: yield { 'title': website.css('td.title a.storylink::text').get(), 'link': website.css('td.title a::attr(href)').get() }
额外优化小建议
如果担心少数条目可能缺失标题或链接(虽然Hacker News基本不会出现这种情况),可以用.get(default='')来避免返回None,让结果更规整:
'title': website.css('td.title a.storylink::text').get(default='无标题'), 'link': website.css('td.title a::attr(href)').get(default='无链接')
这样修改后,爬虫就能正确遍历每页的每个新闻条目,提取对应内容啦!
内容的提问来源于stack exchange,提问作者mharre
相关产品推荐
相关产品推荐

