【问题标题】:passing arguments to scrapy将参数传递给scrapy
【发布时间】:2013-07-19 02:14:37
【问题描述】:

我听从了这两个帖子的建议,因为我也在尝试创建一个通用的scrapy spider:

How to pass a user defined argument in scrapy spider

Creating a generic scrapy spider

但是我得到一个错误,我应该作为参数传递的变量没有定义。我的 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 小时才能发布。待续……

标签: arguments scrapy web-crawler


【解决方案1】:

您应该在__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):
        ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2015-04-26
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多