向Scrapy传递参数

3
我按照以下两篇文章的建议进行操作,因为我也正在尝试创建一个通用的Scrapy爬虫:
如何在Scrapy爬虫中传递用户定义的参数
创建一个通用的Scrapy爬虫
但是,我遇到了一个错误,即我应该传递作为参数的变量未定义。 我在我的init方法中漏掉了什么吗?
代码:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from data.items import DataItem

class companySpider(BaseSpider):
    name = "woz"

    def __init__(self, domains=""):
        '''
        domains is a string
        '''
        self.domains = domains

    deny_domains = [""]
    start_urls = [domains]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('/html')
        items = []
        for site in sites:
            item = DataItem()
            item['text'] = site.select('text()').extract()
            items.append(item)
        return items

这是我的命令行:

scrapy crawl woz -a domains="http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

以下是错误信息:

NameError: name 'domains' is not defined

我忘记在start_urls中引用变量self.domains,但现在错误显示self未定义。我已经有了自己的答案,但必须等待4个小时才能发布。待续... - jstaker7
1个回答

6

在你的__init__方法开头,你应该调用super(companySpider, self).__init__(*args, **kwargs)

def __init__(self, domains="", *args, **kwargs):
    super(companySpider, self).__init__(*args, **kwargs)
    self.domains = domains

在您的情况下,如果您的第一个请求依赖于蜘蛛参数,我通常只会覆盖start_requests()方法,而不是覆盖__init__()方法。命令行中的参数名称已经作为蜘蛛的属性可用:

class companySpider(BaseSpider):
    name = "woz"
    deny_domains = [""]

    def start_requests(self):
        yield Request(self.domains) # for example if domains is a single URL

    def parse(self, response):
        ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接