2014-10-02 2 views
0

필자는 Python으로 스파이더 링 스크립트를 작성했다. 그러나 완료하는 데 오랜 시간이 걸립니다 (사이트 링크 수에 따라 9 시간 이상 소요).거미에 쓰는 가장 좋은 방법은 무엇입니까?

시간을 단축하기 위해 스레드를 구현하고 싶지만 스레드가 가장 좋은 부분을 파악하는 데 문제가 있습니다. 언뜻 보면 각 페이지의 페이지 내용을 가져올 스레드를 만들고 visited_urlsto_visit_urls 배열을 잠궈 모든 것이 동일한 목록에서 작동하는지 확인합니다.

visited_urlsto_visit_urls 배열에서 중복을 검사하는 데 가장 많은 시간을 소비하고있는 것처럼 보입니다. 이렇게 스레딩하면 실제로 많은 시간을 절약 할 수 있을까요? 내 거미를 실을 수있는 더 좋은 방법이 있습니까?

+1

) 조회. O (1) 조회가있는 대신'set '을 사용해보십시오. –

+0

나는 내 코드를 프로파일 링하지 않았다. 나는 단지 _feeling_을 가지고있다. : D – Staunch

답변

0

grequests를 사용해야합니다. 요청의 비동기 버전으로 여러 URL을 한꺼번에 스크래핑하여 처리량을 크게 높일 수 있습니다. 당신이 당신의 URL을 반복하고 하위 목록을 작성하면 이것이 매우 효과적 일 것입니다. 중복에 관해서는 단순히 목록을 세트로 변환하면 원래대로 세트가 중복을 지원하지 않으므로이를 제거합니다. 당신이 당신의 코드를 프로파일 링 한 및 회원 검사에 많은 시간이 아마도 당신이 O를 ​​가지고있는 to_visit_urls` (n은`visited_urls``에 대한`list`를 사용하고 있음을 지출하는 경우

urls = [...] 
reqs = [grequests.get(x) for x in urls] 
resp = grequests.map(reqs) 

https://github.com/kennethreitz/grequests

+0

나는'set'으로의 변환이 모든 중복을 제거하기 위해 O (n^2)를 필요로한다는 느낌이 들지 않습니까? 그게 O (n)보다 훨씬 효율적이지 않아 현재 내가 추가하려고하는 아이템이 존재하지 않는다는 것을 보장합니다. 나는 확실히 모르지만 어디서나 그 정보를 찾을 수는 없습니다 ... – Staunch

+0

"... ** 이미 ** 존재 ** ** 목록에 **"나는 말하고자하는 것입니다. – Staunch

+0

병목 현상이 네트워크 처리량이 아니라고 확신합니까? 네트워크 속도가 계산보다 빠르면 정말 놀랍습니다. 또한 왜 하나를 반복하는 대신 두 개의 목록을 사용하고 있습니까? 또한 시작시 한 번 설정 변환을 수행 한 다음 결과를 반복하여 상당한 성능 저하가 발생하는지 의심 스럽습니다. – ragingSloth

관련 문제