스크랩 스파이더에서 사용자 정의 인수를 통과하는 방법
나는 스크랩의 거미에게 사용자가 정의한 논쟁을 전달하려고 합니다.그것을 어떻게 하는지 제안해 줄 수 있는 사람?
매개 변수에 대해 읽었습니다.-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를 이용하여 작업을 예약할 수 있는 장점이 있습니다.
언급URL : https://stackoverflow.com/questions/15611605/how-to-pass-a-user-defined-argument-in-scrapy-spider
'programing' 카테고리의 다른 글
제출 양식에서 생성된 URL을 JavaScript로 가져옵니다. (0) | 2023.10.01 |
---|---|
PowerShell 스크립트 대신 PowerShell 모듈 개발을 선택하는 경우 (0) | 2023.10.01 |
MySQL: VARCHAR(255) 대신 VARCHAR(20)를 사용하는 이유는 무엇입니까? (0) | 2023.10.01 |
AngularJS 출고 시 http가 비어 있음을 반환합니다. (0) | 2023.10.01 |
Chrome network Timing, 컨텐츠 다운로드 개선 방법 (0) | 2023.10.01 |