Scrapy总是以相同的参数运行,持久的Twisted reactor?

时间:2013-10-30 17:24:58

标签: python twisted scrapy

我一直在使用几个帐户运行我的Scrapy项目(该项目擦除了一个特殊的站点,需要登录凭据),但无论我设置的参数如何,它总是以相同的(相同的凭据)运行。 / p>

我在virtualenv下运行。我缺少一个变量或设置吗?

修改

似乎这个问题与Twisted有关。

即使我跑:

scrapy crawl -a user='user' -a password='pass' -o items.json -t json SpiderName

我仍然收到错误说:

ERROR: twisted.internet.error.ReactorNotRestartable

我获得的所有信息都是蜘蛛的最后一次“成功”运行。

2 个答案:

答案 0 :(得分:2)

您应该检查您的蜘蛛的__init__方法,如果不存在,您应该传递用户名和密码。像那样:

class MySpider(BaseSpider):
name = 'myspider'

def __init__(self, username=None, password=None, *args, **kwargs):
    super(MySpider, self).__init__(*args, **kwargs)
    self.start_urls = ['http://www.example.com/']
    self.username = username
    self.password = password

def start_requests(self):
    return [FormRequest("http://www.example.com/login",
                    formdata={'user': self.username, 'pass': self.password,
                    callback=self.logged_in)]
def logged_in(self, response):
    # here you would extract links to follow and return Requests for
    # each of them, with another callback
    pass

运行它:

scrapy crawl myspider -a username=yourname password=yourpass

代码改编自:http://doc.scrapy.org/en/0.18/topics/spiders.html

修改 你只能有一个扭曲的反应堆。但是您可以在同一进程中使用不同凭据运行多个蜘蛛。运行多个蜘蛛的示例:http://doc.scrapy.org/en/0.18/topics/practices.html#running-multiple-spiders-in-the-same-process

答案 1 :(得分:1)

发现问题。我的项目树很“脏”。

在另一位开发人员更改了包含蜘蛛代码的文件名后,我用这些更改更新了我的本地仓库,这只删除了旧文件的.py版本并保留了.pyc文件(.hgignore的原因) 。这使得Scrapy两次找到相同的蜘蛛模块(因为同一个蜘蛛在两个不同的文件下),并在同一个Twisted反应堆下调用它们。

删除有问题的文件后,一切都恢复正常。