scrapy에 대한 이해를 깊이 하다

5775 단어 ScrapyFriday-IO

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입니다.
주식회사에서는 금요일마다 관심 있는 일에 힘쓰고 어떤 형태로든 성과를 출력한다.감사합니다.

좋은 웹페이지 즐겨찾기