我一直在使用几个帐户运行我的Scrapy项目(该项目擦除了一个特殊的站点,需要登录凭据),但无论我设置的参数如何,它总是以相同的(相同的凭据)运行。 / p>
我在virtualenv下运行。我缺少一个变量或设置吗?
修改
似乎这个问题与Twisted有关。
即使我跑:
scrapy crawl -a user='user' -a password='pass' -o items.json -t json SpiderName
我仍然收到错误说:
ERROR: twisted.internet.error.ReactorNotRestartable
我获得的所有信息都是蜘蛛的最后一次“成功”运行。
答案 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反应堆下调用它们。
删除有问题的文件后,一切都恢复正常。