Scrapy爬虫重复返回首个Powerball彩票数据条目,无法抓取全部历史开奖数据问题咨询
解决Scrapy爬虫重复输出首个开奖数据的问题
我一眼就看出问题啦——你在循环里提取数据的时候,一直用response.css()来获取元素,这会每次都从整个页面的开头找匹配项,自然每次拿到的都是第一行的数据!
你需要把提取数据的对象换成循环里的results变量(也就是当前遍历到的那一行),这样才能拿到每一行对应的开奖信息。另外,原代码里的日期选择器也需要调整到当前行内,不然可能也会重复拿第一个日期。
修改后的完整代码
import scrapy class LottoSpider(scrapy.Spider): name = 'lottos' start_urls = [ 'https://www.lotteryextreme.com/powerball/results' ] def parse(self, response): # 遍历每个开奖结果行 for results in response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "wyn", " " ))]'): # 从当前行提取日期 date = results.css('span.f20::text').get() # 从当前行提取所有号码单元格的文本 number_cells = results.css('.results2 td::text').extract() # 按索引映射对应号码字段 yield { 'date': date, 'number1': number_cells[0], 'number2': number_cells[1], 'number3': number_cells[2], 'number4': number_cells[3], 'number5': number_cells[4], 'powerball': number_cells[6], }
关键调整说明
- 切换选择器上下文:把所有
response.css()替换为results.css(),让选择器只在当前遍历的开奖行内查找元素,而不是全局搜索整个页面 - 优化号码提取逻辑:先一次性提取当前行的所有号码单元格文本到列表,再按索引取值,代码更简洁易维护
- 日期与行绑定:日期提取改为从当前行内获取,确保每个开奖日期和对应的号码一一匹配
这样运行爬虫后,就能正确抓取每一行的开奖数据,不会再重复输出第一行内容了!
内容的提问来源于stack exchange,提问作者Kgosi Kekana




