将论据传递给scrapy

jst*_*er7 3 arguments web-crawler scrapy

我遵循这两篇文章的建议,因为我也在尝试创建一个通用的scrapy蜘蛛:

如何在scrapy spider中传递用户定义的参数

创建一个通用的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
Run Code Online (Sandbox Code Playgroud)

这是我的命令行:

scrapy crawl woz -a domains="http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
Run Code Online (Sandbox Code Playgroud)

这是错误:

NameError: name 'domains' is not defined
Run Code Online (Sandbox Code Playgroud)

pau*_*rth 5

你应该super(companySpider, self).__init__(*args, **kwargs)在你的开头打电话__init__.

def __init__(self, domains="", *args, **kwargs):
    super(companySpider, self).__init__(*args, **kwargs)
    self.domains = domains
Run Code Online (Sandbox Code Playgroud)

在你的第一个请求依赖于蜘蛛参数的情况下,我通常只做覆盖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):
        ...
Run Code Online (Sandbox Code Playgroud)