IT story

스크래피 스파이더에서 사용자 정의 인수를 전달하는 방법

hot-time 2020. 9. 15. 19:21
반응형

스크래피 스파이더에서 사용자 정의 인수를 전달하는 방법


사용자 정의 인수를 스크래피 스파이더에 전달하려고합니다. 누구든지 그 방법에 대해 제안 할 수 있습니까?

-a어딘가 에서 매개 변수에 대해 읽었 지만 사용 방법을 모릅니다.


옵션을 crawl사용하여 명령 에서 스파이더 인수가 전달됩니다 -a. 예를 들면 :

scrapy crawl myspider -a category=electronics -a domain=system

스파이더는 속성으로 인수에 액세스 할 수 있습니다.

class MySpider(scrapy.Spider):
    name = 'myspider'

    def __init__(self, category='', **kwargs):
        self.start_urls = [f'http://www.example.com/{category}']  # py36
        super().__init__(**kwargs)  # python3

    def parse(self, response)
        self.log(self.domain)  # system

Scrapy 문서에서 발췌 : http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

업데이트 2013 : 두 번째 인수 추가

2015 업데이트 : 문구 조정

2016 업데이트 : 최신 기본 클래스를 사용하고 @Birla에게 감사드립니다.

2017 업데이트 : Python3 super 사용

# previously
super(MySpider, self).__init__(**kwargs)  # python2

2018 업데이트 : @eLRuLL이 지적했듯이 스파이더는 인수에 속성으로 액세스 할 수 있습니다.


이전 답변은 정확했지만 __init__스크래피 스파이더를 코딩 할 때마다 생성자 ( ) 를 선언 할 필요는 없습니다 . 이전과 같이 매개 변수를 지정할 수 있습니다.

scrapy crawl myspider -a parameter1=value1 -a parameter2=value2

스파이더 코드에서 스파이더 인수로 사용할 수 있습니다.

class MySpider(Spider):
    name = 'myspider'
    ...
    def parse(self, response):
        ...
        if self.parameter1 == value1:
            # this is True

        # or also
        if getattr(self, parameter2) == value2:
            # this is also True

그리고 그것은 작동합니다.


크롤링 명령으로 인수를 전달하려면

스크래피 크롤링 myspider -a category = 'mycategory'-a domain = 'example.com'

scrapyd에서 실행할 인수를 전달하려면 -a-d로 바꿉니다.

curl http://your.ip.address.here:port/schedule.json -d spider = myspider -d category = 'mycategory'-d domain = 'example.com'

스파이더는 생성자에서 인수를받습니다.


class MySpider(Spider):
    name="myspider"
    def __init__(self,category='',domain='', *args,**kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.category = category
        self.domain = domain

Scrapy puts all the arguments as spider attributes and you can skip the init method completely. Beware use getattr method for getting those attributes so your code does not break.


class MySpider(Spider):
    name="myspider"
    start_urls = ('https://httpbin.org/ip',)

    def parse(self,response):
        print getattr(self,'category','')
        print getattr(self,'domain','')


Spider arguments are passed while running the crawl command using the -a option. For example if i want to pass a domain name as argument to my spider then i will do this-

scrapy crawl myspider -a domain="http://www.example.com"

And receive arguments in spider's constructors:

class MySpider(BaseSpider):
    name = 'myspider'
    def __init__(self, domain='', *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [domain]
        #

...

it will work :)

참고URL : https://stackoverflow.com/questions/15611605/how-to-pass-a-user-defined-argument-in-scrapy-spider

반응형