2013-06-06 3 views
4

나는 다운로드하여 데이터베이스에 추가 처리 및 수정을 위해 저장하려는 목록에 100,000 개 이상의 URL (다른 도메인)이 있습니다.URL 목록에서 <very large> 페이지 수를 다운로드하는 가장 좋은 방법은 무엇입니까?

파이썬의 멀티 프로세싱/멀티 스레딩 대신 치료를 사용하는 것이 현명합니까? 그렇다면 동일한 작업을 수행하는 독립 실행 형 스크립트를 작성하려면 어떻게해야합니까?

또한 마음에 드는 다른 멋진 접근 방식을 제안하십시오.

답변

2

가져 오기 URL을 잘 알고 있으면 치료가 관련없는 것으로 보입니다 (여기에 크롤링이 없습니다).

가장 쉬운 방법은 Requests을 사용하는 것입니다. 그러나 시퀀스의 각 URL을 쿼리하고 응답을 기다리는 블록은 효율적이지 않으므로 GRequests을 요청의 요청을 비동기 적으로 보낼 수 있다고 생각할 수 있습니다.

+1

그 중 하나는 당신이 그들을 만나러 간 후에 당신이없이 살 것이라고 상상할 수 없습니다. 나를 Grequests에게 소개시켜 줘서 고마워. –

0

갑자기 높은로드를 생성하면 대부분의 사이트 소유자가 크롤러를 차단하려고합니다. 당신은 당신이 scrapy에 제어 시간 제한, HTTP 응답 코드, 프록시 등이 필요하거나 grab

0

Scrapy 여전히 옵션 링크의 목록을 해결 한 그래서 경우에도

.

  1. 속도/성능/효율성

    Scrapy는 트위스트, 파이썬에 대한 인기 이벤트 중심의 네트워킹 프레임 워크를 작성

    . 따라서 동시성을 위해 non-blocking (일명 비동기식) 코드를 사용하여 구현됩니다.

  2. 데이터베이스 파이프 라인

    당신은 당신이 당신의 데이터가 데이터베이스에 파이프 라인 될 것인지 언급

    - 당신은 Scrapy이 Item Pipelines 기능이다시피 : 아이템이로 스크랩 한 후

    을 스파이더는 항목으로 보내지며 파이프 라인은 순차적으로 실행되는 여러 구성 요소를 통해 처리합니다.

    따라서 각 페이지를 다운로드 한 후 즉시 데이터베이스에 쓸 수 있습니다.

  3. 코드 조직

    Scrapy이 당신이 등을 설정, 거미, 항목, 파이프 라인은 논리적으로 분리가 당신에게 좋은 명확한 프로젝트 구조를 제공합니다. 심지어 이렇게하면 코드를 명확하고 쉽게 지원하고 이해할 수 있습니다. 코드

    Scrapy가 무대 뒤에서 당신을 위해 많은 일을 수행하는

  4. 시간. 이렇게하면 실제 코드와 논리 자체에 초점을 맞추고 "금속"부분에 대해 생각하지 않게됩니다. 프로세스, 스레드 등을 만듭니다.

그러나 동시에, Scrapy가 오버 헤드 일 수 있습니다. Scrapy는 웹 페이지에서 데이터를 크롤링하고 긁어 모으기 위해 설계되었습니다. 당신이 그들을 보지 않고 다수의 페이지를 다운로드하기를 원한다면, 그렇습니다. grequests은 좋은 대안입니다.

+0

나는 치료와 함께 일했으며 혜택을 알고 있습니다. 나는 scrapy 프레임 워크의 프로젝트 구조에 묶이지 않고 scrapy를 라이브러리로 사용하는 프로그램을 작성하는 방법에 더 관심이 많았습니다. –

+0

물론, 어쨌든 그것을 지적하고 싶었습니다. 스파이더를 만들고 실행하기 위해 프로젝트 구조를 만들 필요는 없습니다. 예 : http://stackoverflow.com/questions/13437402/how-to-run-scrapy-from-within-a-python-script. – alecxe

관련 문제