Python中为Scrapy Spider传入screen_name参数初始化时报错求助
解决Scrapy爬虫传入可变参数的初始化错误
我来帮你搞定这个Scrapy传参的问题~你遇到的报错是因为错误地直接实例化爬虫类后传给了process.crawl()——Scrapy的CrawlerProcess.crawl()方法设计是接收爬虫类本身,而非已经实例化好的对象。当你传入TwitterSpider(screen_name="realDonaldTrump")时,Scrapy内部还会尝试调用TwitterSpider()创建新实例,这时候就会缺失screen_name参数,触发报错。
正确的解决方式
推荐的做法是直接把爬虫类和参数一起传给process.crawl(),让Scrapy负责实例化爬虫并传递参数:
把这一行:
process.crawl(TwitterSpider(screen_name="realDonaldTrump"))
修改为:
process.crawl(TwitterSpider, screen_name="realDonaldTrump")
这样Scrapy会自动将screen_name参数传递给爬虫的__init__方法,完美适配你的自定义初始化逻辑。
完整可运行代码示例
import scrapy from scrapy.crawler import CrawlerProcess class TwitterSpider(scrapy.Spider): name = "twitter_friends" def __init__(self, screen_name, *args, **kwargs): self.usernames = [] self.screen_name = screen_name # 建议保留*args传给父类,避免潜在的参数兼容问题 super().__init__(*args, **kwargs) def start_requests(self): base_url = "https://mobile.twitter.com" urls = [ base_url + '/{screen_name}/following'.format(screen_name=self.screen_name) ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def closed(self, spider): print("spider closed") def parse(self, response): # 这里可以添加你的页面解析逻辑 pass process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' }) # 传入爬虫类和目标参数 process.crawl(TwitterSpider, screen_name="realDonaldTrump") # 如果要运行多个不同参数的爬虫,直接多次调用crawl即可 # process.crawl(TwitterSpider, screen_name="BarackObama") process.start()
多爬虫运行说明
如果要实现你的最终目标——运行多个带不同screen_name的爬虫,只需要多次调用process.crawl()即可,比如:
process.crawl(TwitterSpider, screen_name="realDonaldTrump") process.crawl(TwitterSpider, screen_name="BarackObama") process.start()
Scrapy会自动并行处理这些爬虫任务。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

