我正在尝试从脚本运行我的scrapy。我正在使用CrawlerProcess,我只有一个蜘蛛要运行。
我已经被这个错误卡住了一段时间了,我已经尝试了很多方法来更改设置,但是每次我运行蜘蛛程序时,我都会得到
twisted.internet.error.ReactorNotRestartable
我一直在寻找解决这个错误的方法,我相信只有当你多次调用process.start()时才会出现这个错误,但是我没有。
下面是我的代码:
import scrapy
from scrapy.utils.log import configure_logging
from scrapyprefect.items import ScrapyprefectItem
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class SpiderSpider(scrapy.Spider):
name = 'spider'
start_urls = ['http://www.nigeria-law.org/A.A.%20Macaulay%20v.%20NAL%20Merchant%20Bank%20Ltd..htm']
def __init__(self, *args,**kwargs):
super().__init__(*args,**kwargs)
def parse(self, response):
item = ScrapyprefectItem()
...
yield item
process = CrawlerProcess(settings=get_project_settings())
process.crawl('spider')
process.start()
错误:
Traceback (most recent call last):
File "/Users/pluggle/Documents/Upwork/scrapyprefect/scrapyprefect/spiders/spider.py", line 59, in <module>
process.start()
File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/scrapy/crawler.py", line 309, in start
reactor.run(installSignalHandlers=False) # blocking call
File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 1282, in run
self.startRunning(installSignalHandlers=installSignalHandlers)
File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 1262, in startRunning
ReactorBase.startRunning(self)
File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 765, in startRunning
raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
我注意到只有当我试图将我的项目保存到mongodb时才会发生这种情况。pipeline.py:
import logging
import pymongo
class ScrapyprefectPipeline(object):
collection_name = 'SupremeCourt'
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
# pull in information from settings.py
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE')
)
def open_spider(self, spider):
# initializing spider
# opening db connection
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
# clean up when spider is closed
self.client.close()
def process_item(self, item, spider):
# how to handle each post
self.db[self.collection_name].insert(dict(item))
logging.debug("Post added to MongoDB")
return item
如果我将www.example.com更改pipeline.py为默认值,即...
import logging
import pymongo
class ScrapyprefectPipeline(object):
def process_item(self, item, spider):
return item
...脚本运行良好。我认为这与我如何设置pycharm设置来运行代码有关。因此,为了参考,我还包括了我的pycharm设置
我希望有人能帮助我。让我知道如果需要更多的细节
3条答案
按热度按时间bkhjykvo1#
雷纳尔多,
非常感谢-你拯救了我的项目!
你让我想到,这可能是因为你有一段if脚本,它在同一个文件中启动了一个进程,并带有你的spider定义。结果,每次scrapy导入你的spider定义时,它都会被执行。我不是scrapy方面的Maven,但可能它在内部执行了几次,因此我们遇到了这个错误问题。
你的建议显然解决了这个问题!
另一种方法可能是将spider类定义和运行它的脚本分开。可能,这就是scrapy假设的方法,这就是为什么在从脚本文档运行spider中甚至没有提到这个
__name__
检查。所以我做的是:
必须指出的是,运行蜘蛛的脚本(您提供的那个)从类定义my_spider.py文件中被删除。另外,请注意,我导入的site_spec.py文件的路径与run.py文件相关(见下),但与类定义文件无关,在那里发出了这个指令,正如人们所期望的那样(我猜是python相对导入)
有了这个设置,我终于能够摆脱这个扭曲的。internet。error。ReactorNotRestartable
非常感谢!!!
von4xj4u2#
好的,我解决了,所以我认为,在管道中,当scraper进入open_spider时,它会再次运行spider.py,并第二次调用process.start().
为了解决这个问题,我在spider中添加了这个函数,这样process.start()只会在运行spider时执行:
q35jwt9p3#
尝试改变Scrapy和扭曲的版本。这不是解决方案,但工作。
==22.1.0 pip安装扭曲==2.5.1