2017-01-06 3 views
0

저는 Scrapy를 시작하면서 튜토리얼을 살펴 보았습니다. 튜토리얼 및/또는 문서에서 답변을 찾을 수 없거나 대답을 읽은 문제가 있습니다. 여러 번 지금,하지만 난 그냥 ... 제대로 이해하고 있지 않다치료 - HTTP 상태 코드를 기반으로 역동적으로 URL을 작성 하시겠습니까?

시나리오 :

의 나는 내가 크롤링하려는 정확히 1 개 웹 사이트를 운영한다고 가정 해 보겠습니다. 콘텐츠는 url에 전달 된 검색어 매개 변수를 기반으로 동적으로 렌더링됩니다. 나는 "category"의 URL pram에 기초한 데이터의 3 "세트"를 긁어 낼 필요가있을 것이다.

모든 나는이 같은 공통 기본 URL의 잡고 수 있습니다 필요한 정보 :

"http://shop.somesite.com/browse/?product_type=instruments"

그래서 같은 각 범주에 대한 URL :

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums"

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=keyboards"

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=guitars"

여기에 한 가지주의 할 점은 초기 요청 당 사이트에 30 개의 결과 만로드한다는 것입니다. 사용자가 더보고 싶다면 맨 아래쪽에있는 "더 많은 결과로드 ..."버튼을 클릭해야합니다. 이 부분을 조금 조사한 후에 페이지의 초기로드 중에 상위 30 개 요청 만 이루어지고 (의미가 있음) "추가로드 ..."버튼을 클릭하면 "pagex = 2"가 추가 된 URL이 업데이트됩니다 컨테이너는 30 개의 결과로 새로 고침됩니다. 그런 다음 버튼이 사라지고 사용자가 페이지를 아래로 계속 스크롤하면 다음 30 개의 결과를 얻기 위해 서버에 후속 요청이 이루어지고 "pagex"값이 1 씩 증가하고 결과가 첨부 된 컨테이너가 새로 고침되고 헹굼 및 반복됩니다.

사이트에서 페이지 매김을 처리하는 방법이 정확히 모르겠지만 가장 간단한 해결책은 각 카테고리에 대해 최대 숫자 "pagex"를 찾는 것입니다. URL을 시작 번호로 설정하면됩니다. . 예를 들어

, 당신이 브라우저에 URL을 전달하는 경우 :

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums&pagex=22"

HTTP 응답 코드 (200)는 수신 된 모든 결과 페이지로 렌더링됩니다. 큰! 그게 내가 필요로하는 것을 준다!

하지만 다음 주에 50 개 항목이 추가되었으므로 최대 값은 "... pagex = 24"입니다. 최신 정보를 얻지는 못합니다.

또는 50 개의 항목이 삭제되었으며 새 최대 수가 "... pagex = 20"인 경우 "22"를 요청할 때 404 응답을 받겠습니다.

마지막으로 알려진 "좋은"최대 페이지 번호로 테스트 응답을 보내고 제공된 HTTP 응답을 기준으로 어떤 URL이 될지 결정할 때 사용하십시오.

크롤링을 시작하기 전에 "pagex"에 1을 추가하고 404를 확인하고 싶습니다. 404가 좋으면 알 수 있고, 200을 얻으면 계속 1을 늘려야합니다. 404를 얻으므로 나는 max가 어디에 있는지 알 필요가있다.

나는이 검사를 먼저 실행하기 위해 다른 모듈을 사용해야하는 Scrapy를 사용하여이 작업을 수행 할 수 있는지 알 수 없습니다. "구문 분석"및 "start_requests"메서드에서 테스트 목적으로 간단한 검사를 추가하고 운이 없었습니다.start_requests는 응답을 처리 할 수있는 것 같지 않고 구문 분석은 응답 코드를 확인할 수 있지만 지시 된대로 URL을 업데이트하지는 않습니다.

나는 (여전히 새로운이 모두에게) 내 가난한 코딩 기술을 확실 해요,하지만 난이 가능한 솔루션을 찾을 수 없습니다 ....

어떤 생각이나 아이디어가 대단히 감사합니다!

답변

0

방법으로 의사 결정을 내릴 수있는 상태로 구성 할 수 있습니다. response.status. the documentation에서 상태를 처리하는 방법을 확인하십시오. 예 :

class MySpider(CrawlSpider): 
    handle_httpstatus_list = [404] 
+0

지연 과용에 감사드립니다. 나는 잠시 동안 다른 프로젝트에서 일하기 위해 웹 사이트 크롤링에 대한 나의 작은 실험을 연기했다. 오늘 밤에 여기에서 당신의 제안을 시험해 볼 것이고 실제로 이것이 효과가 있다면 대답으로 표시 할 것입니다. 내 "전략"에 대한 전반적인 생각을 제공 할 수 있는지 궁금합니다. 제가하고 싶은 일과 구체적인 도전에 직면했을 때,이 문제를 극복하기위한 수용 가능한 방법으로 볼 수 있습니까? 아니면 다른 접근 방식을 제안 하시겠습니까? –