scrapy에 대한 이해를 깊이 하다
scrapy 1.4.0
샘플 코드
class HogeSpider(scrapy.Spider):
name: str = 'hoge'
start_urls: List[str] = ['https://data-ippai.com/']
def parse(self, response):
for li in response.xpath('li-no-xpath'):
url = li.xpath('anchor-no-link').extract_first()
yield Request(
url=url,
callbacl=self.parse_detail,
)
def parse_detail(self, response):
loader = HogeItemLoader(
response=response,
selector=response.body,
)
return loader.load_item()
이 문장의 목적
예를 들어 스파이더류의 경우 일반적으로 상술한 샘플 코드의 느낌으로 쓴다
Spider의 행동이 생각하는 동작과 다르다
자유형 대상 사이트 쪽에 문제가 있는 건지, 아니면 스파이더에 문제가 있는 건지.
왜냐하면 떼어놓기 힘든 상황이 많았거든요.
스크래피에 대한 이해와 비망록을 깊이 있게 하기 위해 이 보도를 남겼다.
scrapy의 구조
공식적인 사진이지만 이 그림을 보고도 도무지 이해가 되지 않는다.
Request 객체가 생성되거나 반환될 때 scrapy 측에서 수행되는 작업
샘플 코드로 다음과 같은 부분이라면그림으로 말하자면 2 의 이야기다.yield Request(
url=url,
callbacl=self.parse_detail,
)
리퀘스트 대상을 spider 클래스로 되돌려줍니다.スケジューラー
에 등록되어 있습니다.
그럼 이거スケジューラー
는 뭐예요?이렇게 말하지만 タスクキュー
이런 구조는 기본적으로 옳다고 생각합니다.
scrapy에서 queuelib 라는 프로그램 라이브러리 사용하기
Request 객체를 심각도로 만들고 파일을 삽입합니다.(대기열)
삽입된 Request 객체가 하나씩 체크 아웃되어 요청 간격을 계산하여 요청합니다.
그 결과는 콜백이 지정한 방법을 실행하는 메커니즘이다.
스파이더가 지정한 호출 방법 내의yeld,return에서 Request オブジェクト
또는 scrapy.Item オブジェクト
만 받아들일 수 있습니다.
전달Request オブジェクト
후 スケジューラー
에 등록
납품scrapy.Item オブジェクト
후 처리가 ItemPipeline
로 옮겨졌다.이것은 그림7과 8의 이야기다.
(샘플 코드 중 def parse
도scrapy 내부에서 호출하는 호출 방법입니다.)
Request 객체는 언제 요청되었습니까?
위에서 언급한 바와 같이 스케줄러에서 Request 레벨을 추출할 때입니다.그림3, 4면.
스케줄러에서 Request 클래스를 꺼낸 간격은 대략적인 설정값DOWNLOAD_DELAY
이 지정한 초입니다.
(정확히 말하면 scrapy 측에서 DOWNLOAD_DELAY
를 바탕으로 지연된 초수를 계산한다)
터미널 출력의 요청 로그를 보면 순서대로 요청하지 않습니다.
그림4 근처면
scrapy의 대열의 추출 순서가 어떤 곳인지 조사했다[https://doc.scrapy.org/en/latest/faq.html#does-scrapy-crawl-in-breadth-first-or-depth-first-order]에 기록되어 있다.
기본적으로 後入れ先出し
처리됩니다.
순서대로 방송해야 하는데 확인이 안 돼 잘 모르겠다는 얘기다.
대열이 제1위에 랭크되다
그림7, 8, 3 근처의 이야기다.
Request 클래스에 priority
를 추가할 수 있습니다.
이 값이 높은 대기열이 우선적으로 처리됩니다.
음수도 지정할 수 있습니다.
커튼을 올릴 때 정상적으로 올릴 수 있는데 잘 안 되는 문제가 생겼어요.
계단을 올라갔는데 안 올라간 게 문제야?됐어.대략 그림7, 4, 5면.
결론적으로 중간부품DupeFilter
이 걸렸고 scrapy는 요구를 포기했다.
이것DupeFilter
은 무엇입니까?이렇게 하면
scrapy는 URL에 따라 같은 요청을 요청했는지 판단합니다
같은 요청이라면 이후 처리를 하지 않는다.
이 문제의 해결책으로 Request급 매개 변수dont_filter=True
에 입력하면 같은 URL도 정상적으로 복사됩니다.
최후
요즘 게으름 피우고 있어요. 오늘의 Friday I/O입니다.
주식회사에서는 금요일마다 관심 있는 일에 힘쓰고 어떤 형태로든 성과를 출력한다.감사합니다.
Reference
이 문제에 관하여(scrapy에 대한 이해를 깊이 하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takecore@github/items/afd5f4e8c5dc7a11e33b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class HogeSpider(scrapy.Spider):
name: str = 'hoge'
start_urls: List[str] = ['https://data-ippai.com/']
def parse(self, response):
for li in response.xpath('li-no-xpath'):
url = li.xpath('anchor-no-link').extract_first()
yield Request(
url=url,
callbacl=self.parse_detail,
)
def parse_detail(self, response):
loader = HogeItemLoader(
response=response,
selector=response.body,
)
return loader.load_item()
yield Request(
url=url,
callbacl=self.parse_detail,
)
요즘 게으름 피우고 있어요. 오늘의 Friday I/O입니다.
주식회사에서는 금요일마다 관심 있는 일에 힘쓰고 어떤 형태로든 성과를 출력한다.감사합니다.
Reference
이 문제에 관하여(scrapy에 대한 이해를 깊이 하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takecore@github/items/afd5f4e8c5dc7a11e33b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)