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

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

-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는 모든 인수를 스파이더 속성으로 지정하므로 init 메서드를 완전히 건너 뛸 수 있습니다 . 코드가 깨지지 않도록 getattr 메소드를 사용하여 해당 속성을 가져 오십시오 .


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

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


답변

-a 옵션을 사용하여 crawl 명령을 실행하는 동안 스파이더 인수가 전달됩니다. 예를 들어 스파이더에 대한 인수로 도메인 이름을 전달하려면 다음을 수행합니다.

스크래피 크롤링 myspider -a domain = “http://www.example.com”

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

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

작동합니다 🙂


답변

또는 start_url 및 spider 이름을 전달할 수있는 API를 노출하는 ScrapyD 를 사용할 수 있습니다 . ScrapyD에는 스파이더를 중지 / 시작 / 상태 / 나열하는 API가 있습니다.

pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default

scrapyd-deploy거미를 달걀 형태로 데몬에 배치하고 심지어 거미의 버전을 유지합니다. 스파이더를 시작하는 동안 사용할 스파이더 버전을 언급 할 수 있습니다.

class MySpider(CrawlSpider):

    def __init__(self, start_urls, *args, **kwargs):
        self.start_urls = start_urls.split('|')
        super().__init__(*args, **kwargs)
    name = testspider

curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"

추가 된 이점은 사용자의 URL 및 기타 매개 변수를 수락하고 위의 scrapyd 일정 API를 사용하여 작업을 예약하는 고유 한 UI를 구축 할 수 있다는 것입니다.

자세한 내용은 scrapyd API 문서 를 참조하십시오.


답변