3

一般的なスクレイピースパイダーも作成しようとしているため、これらの2つの投稿のアドバイスに従いました。

スクレイピースパイダーでユーザー定義の引数を渡す方法

一般的なスクレイピー スパイダーの作成

しかし、引数として渡すはずの変数が定義されていないというエラーが表示されます。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
4

1 に答える 1

6

super(companySpider, self).__init__(*args, **kwargs)の先頭で呼び出す必要があります__init__

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):
        ...
于 2013-07-19T21:28:49.913 に答える