programing

스크랩 스파이더에서 사용자 정의 인수를 통과하는 방법

oldcodes 2023. 10. 1. 21:56
반응형

스크랩 스파이더에서 사용자 정의 인수를 통과하는 방법

나는 스크랩의 거미에게 사용자가 정의한 논쟁을 전달하려고 합니다.그것을 어떻게 하는지 제안해 줄 수 있는 사람?

매개 변수에 대해 읽었습니다.-a어디론가 사용법을 전혀 모릅니다.

거미의 주장은 다음과 같이 전달됩니다.crawl명령어를 사용합니다.-a선택.예를 들어,

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

Spider는 특성으로 인수에 액세스할 수 있습니다.

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: 새로운 기본 클래스를 사용하고 super를 추가합니다. @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

그리고 그것은 그냥 효과가 있습니다.

크롤 명령을 사용하여 인수를 전달하려면 다음과

스크랩 크롤 마이 거미 -a category='my category' -a domain='example.com '

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

curl http://your.ip.address.여기: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 옵션을 사용하여 크롤 명령을 실행하는 동안 Spider 인수가 전달됩니다.예를 들어 도메인 이름을 거미에게 인수로 전달하려면 이렇게 해야 합니다.

스크랩 크롤 마이 거미 -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 name을 전달할 수 있는 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 및 기타 param을 수락할 수 있는 자신만의 UI를 구축하고 위의 scrapd schedule API를 이용하여 작업을 예약할 수 있는 장점이 있습니다.

자세한 내용은 스크랩드 API 설명서 참조

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

반응형