Scrapy代码运行无报错无输出 无法生成预期JSON文件求助
问题排查
- 仅定义了Spider类,没有触发Scrapy爬取逻辑:Scrapy不会自动执行你定义的爬虫类,需要显式调用爬虫启动接口才能运行爬取任务。
parse方法没有返回爬取结果:提取到cours变量后没有通过yield返回数据,Scrapy无法捕获要输出的内容,自然不会生成JSON文件。- 定时逻辑写法错误:将Spider类定义在死循环内部,每次循环仅重复定义类,没有执行任何有效操作,且
time.sleep是同步阻塞方法,不能直接放在Scrapy异步流程内做定时。 - 没有指定JSON输出配置:运行Scrapy时需要显式配置输出规则,否则爬取到数据也不会自动生成JSON文件。
修正方案
调整代码结构后可正常运行的示例如下:
import scrapy from scrapy.crawler import CrawlerProcess import time from datetime import datetime # 爬虫类只需要定义一次,不要放在循环内重复定义 class QuotesSpider(scrapy.Spider): name = 'quotes' start_urls = [ 'https://www.google.com/finance/quote/TSLA:NASDAQ?sa=X&ved=2ahUKEwjn0orhqefxAhVS3IUKHbX9BKoQ3ecFMAB6BAgQEBo', ] # 配置请求头避免被反爬拦截 custom_settings = { 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } } def parse(self, response): for quote in response.css('div.AHmHk'): cours = quote.css('div.YMlKec.fxKbKc::text').get() # 必须yield返回数据,Scrapy才会捕获并输出到文件 yield { 'crawl_time': datetime.now().strftime("%Y-%m-%d %H:%M:%S"), 'tsla_price': cours } def run_crawler(): process = CrawlerProcess(settings={ # 配置输出JSON文件,overwrite设为False会追加数据,设为True每次覆盖旧文件 "FEEDS": { "tsla_price.json": {"format": "json", 'overwrite': False}, }, "LOG_LEVEL": "INFO" # 减少不必要的日志输出,排查问题可改为DEBUG }) process.crawl(QuotesSpider) # 爬取完成后自动关闭进程,方便下次循环启动 process.start(stop_after_crawl=True) if __name__ == "__main__": starttime = time.time() while True: run_crawler() # 等待1分钟执行下一次爬取 time.sleep(60.0 - ((time.time() - starttime) % 60.0))
补充说明
如果需要更稳定的定时调度,可改用APScheduler结合Scrapy CrawlerProcess实现,避免time.sleep带来的时间漂移问题;如果运行后JSON文件内容为空,可打开DEBUG日志检查选择器是否匹配到元素,部分区域访问Google Finance可能需要代理配置。
内容的提问来源于stack exchange,提问作者Masturbinho
相关产品推荐
相关产品推荐

