Scrapy复用Twitter爬虫多实例运行报错:'TelnetConsole'无'port'属性
解决Scrapy批量启动爬虫时的TelnetConsole AttributeError问题
我之前也碰到过一模一样的问题,这是Scrapy在批量启动多爬虫实例时,Telnet控制台组件的初始化冲突导致的。下面给你两种靠谱的解决方案:
方案1:直接禁用Telnet控制台(快速见效)
TelnetConsole是Scrapy用来调试的组件,批量跑爬虫的时候基本用不上它。直接在CrawlerProcess的配置里关掉它,就能立刻解决这个错误:
from scrapy.crawler import CrawlerProcess process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'TELNETCONSOLE_ENABLED': False # 添加这行禁用Telnet组件 }) screen_names = [...] # 从数据库获取的目标列表 for screen_name in screen_names: process.crawl(TwitterSpider(), start_urls=[f"https://mobile.twitter.com/{screen_name}/following"]) process.start()
方案2:按Scrapy规范传递爬虫参数(更优雅的写法)
你现在的写法是提前实例化了TwitterSpider再传给process.crawl(),这其实不是Scrapy推荐的用法。正确的方式是把爬虫类和参数直接传给crawl()方法,让Scrapy自己负责实例化爬虫,这样能从根源避免组件初始化的冲突:
from scrapy.crawler import CrawlerProcess process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' }) screen_names = [...] # 从数据库获取的目标列表 for screen_name in screen_names: # 注意这里传的是TwitterSpider类,而不是已经实例化的对象 process.crawl(TwitterSpider, start_urls=[f"https://mobile.twitter.com/{screen_name}/following"]) process.start()
错误原因说明
当你循环创建Spider实例并传给process.crawl()时,Scrapy内部的组件(比如TelnetConsole)会被重复初始化,旧版本的Scrapy在处理这种场景时没有正确处理端口属性的初始化逻辑,所以才抛出了AttributeError: 'TelnetConsole' object has no attribute 'port'。上面两种方案要么跳过Telnet的初始化流程,要么让Scrapy按标准流程管理爬虫实例,都能完美解决这个问题。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

