>  기사  >  백엔드 개발  >  scrapy 맞춤 크롤러 크롤링 자바스크립트 콘텐츠

scrapy 맞춤 크롤러 크롤링 자바스크립트 콘텐츠

高洛峰
高洛峰원래의
2016-10-17 13:57:561283검색

많은 웹사이트에서 javascript를 사용합니다. 웹페이지 콘텐츠는 js에 의해 동적으로 생성되며 일부 js 이벤트는 페이지 콘텐츠 변경 및 링크 열기를 트리거합니다. 심지어 일부 웹사이트는 js 없이는 전혀 작동하지 않고 대신 유사한 메시지를 반환합니다.

Javascript를 지원하는 네 가지 솔루션이 있습니다.
1. 인터페이스를 사용하여 브라우저를 호출하는 코드를 작성합니다. 테스트에 널리 사용되는 Selenium과 유사합니다.
3. 인터페이스가 없는 브라우저, 다양한 웹킷 기반 브라우저, casperjs, phantomjs 등을 사용합니다.
4. 가벼운 브라우저를 직접 구현하세요.

간단하고 제한적인 크롤링 작업의 경우 코드를 통해 js 로직을 시뮬레이션할 수 있다면 이 솔루션이 선호됩니다. 예를 들어 duckduckgo 검색 엔진에서는 페이지의 작업이 트리거됩니다. by js. 시뮬레이션하기 어려운 것 같습니다. 그런데 그의 페이지에서 두 번째 양식을 제출한 후 페이지를 넘길 수 있는 것 같습니다.

관련 코드를 작성하고 있습니다. js 로직을 사용하려면 먼저 브라우저의 js를 닫아 필요한 것을 얻을 수 있는지 확인하세요. 일부 페이지는 js 없이도 호환성을 제공합니다. 작동하지 않으면 chrome 콘솔이나 firebug를 열어 js 로직을 관찰하세요. -송수신과 같습니다. urllib2(권장 요청 라이브러리)를 사용하여 시뮬레이션하거나 dom 등을 수정하고 lxml을 사용하여 그에 맞게 수정하면 됩니다.

셀레늄을 사용하도록 선택할 수도 있습니다. 단점은 효율성이 매우 낮다는 것입니다. 이번에는 셀레늄이 브라우저 인스턴스를 시작하는 데 필요한 시간이 허용되는지 테스트해야 합니다. 일반적으로 두 번째 수준에서 브라우저가 페이지 렌더링을 여는 것을 고려하면 효율성이 허용된다는 전제에서 이 솔루션은 나쁘지 않습니다.

이 솔루션의 또 다른 문제는 서버에 있다는 것입니다. 데스크톱 환경이 없으면 셀레늄은 시각적으로 실행할 수 없습니다.

규모가 작지 않고 js를 시뮬레이션하는 것이 불가능하거나 셀레늄이 너무 비효율적이거나 데스크톱이 아닌 환경에서 실행해야 하는 인터페이스가 있습니다. 여러 인터페이스 없는 브라우저의 일반적인 상황은 다음과 같습니다.

1, casperjs, phantomjs: non py, 명령줄을 통해 호출할 수 있으며 기본적으로 이 두 가지를 충족하는지 확인하는 것이 좋습니다. 먼저 Phantomjs에는 비공식 웹 드라이버 프로토콜 구현이 있으므로 phantomjs는 인터페이스를 달성하지 못하도록 조정할 수 있습니다.
2. Ghost, spynner 등: 개인적으로 py 맞춤형 웹킷입니다. spynner 코드는 지저분하고 고스트 코드는 품질이 좋습니다. 그러나 버그가 있습니다.
이 솔루션에 대한 자세한 내용은 아래를 참조하세요. 옵션을 사용하면 js를 지원하는 경량의 인터페이스 없는 브라우저를 구현할 수 있습니다. 크롤링해야 할 콘텐츠가 많지 않다면 효율성이 매우 중요합니다. pyv8을 살펴볼 수 있습니다. v8을 기반으로 한 간단한 브라우저 모델이 있습니다. 예, 이는 단지 모델일 뿐이며 직접 수행해야 합니다. 내부에 몇 가지 메소드를 입력해야 합니다. 이를 위해서는 js 엔진(v8) 및 http 라이브러리(urllib2) 위에 이러한 기능을 구현해야 합니다. 1. 웹 페이지가 열릴 때 포함된 js 코드를 가져옵니다. 2. 다양한 이벤트를 포함하는 브라우저 모델을 구축합니다. 3. js를 실행합니다.
Yitao에서 사용하는 쇼핑 가격 비교 크롤러에 대한 관련 ppt도 있습니다. 세 번째 해결 방법은 이 ppt를 참조하세요. 크롤러는 아마도 webkit과 scrapy를 사용하고 배포를 위해 scrapy 스케줄링 대기열을 redis 기반으로 변경합니다.

구현 방법:

Scrapy는 비동기 네트워크 프레임워크인 Twisted를 사용하므로 잠재적인 차단 상황에 주의해야 합니다. 그러나 ItemPipeline의 병렬성을 설정하는 매개변수가 있다는 것을 알아냈습니다. 차단되지 않습니다. 파이프라인은 스레드 풀에서 실행될 수 있습니다(검증되지 않음). 파이프라인은 일반적으로 캡처된 정보(데이터베이스 쓰기, 파일 쓰기)를 저장하는 데 사용되므로 여기서는 시간이 많이 걸리는 작업에 대해 걱정할 필요가 없습니다. 전체 프레임워크를 차단하며 파이프라인에서 이 쓰기 작업을 비동기식으로 구현할 필요가 없습니다.

이 외에도 프레임워크의 다른 부분은 모두 비동기식으로 간단히 말하면 크롤러에서 생성된 요청이 처리됩니다. 다운로드를 위해 스케줄러에 전달되고 크롤러는 계속해서 실행됩니다. 스케줄러가 다운로드를 완료한 후 응답은 분석을 위해 크롤러에 전달됩니다.

인터넷에서 찾은 참조 예에는 DownloaderMiddleware에 작성된 Node.js 지원은 scrapy 공식 웹사이트의 코드 조각에도 적용됩니다. 이러한 방식으로 구현되면 전체 프레임워크에서 크롤러의 작업 모드가 다운로드 구문 분석이 됩니다. -download-parse, 병렬 다운로드 대신 높은 효율성이 필요하지 않은 소규모 크롤링에서는 큰 문제가 되지 않습니다.
더 나은 접근 방식은 scrapy의 다운로더에 js 지원을 작성하는 것입니다. (selenium+phantomjs 사용) 그러나 get 요청만 지원합니다.

scrapy의 다운로더에 웹킷을 적용할 때 처리가 필요합니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.