2

我一直在用几个帐户运行我的 Scrapy 项目(该项目会抓取一个需要登录凭据的特定站点),但无论我设置什么参数,它总是使用相同的参数运行(相同的凭据)。

我在 virtualenv 下运行。是否有我缺少的变量或设置?

编辑:

似乎这个问题与 Twisted 有关。

即使我跑步:

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

我仍然收到一条错误消息:

ERROR: twisted.internet.error.ReactorNotRestartable

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

4

2 回答 2

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

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

于 2013-10-30T17:39:18.313 回答
1

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

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

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

于 2013-11-01T13:26:12.177 回答