python - with - 웹 스크레이퍼 속도 높이기




web scraping with python (3)

다음은 시도 할 사항입니다.

  • 최신 치료 버전 사용 (이미 사용하지 않는 경우)
  • 비표준 미들웨어가 사용되는지 확인하십시오.
  • CONCURRENT_REQUESTS_PER_DOMAIN , CONCURRENT_REQUESTS 설정 ( docs )을 늘리십시오.
  • 로깅 사용 LOG_ENABLED = False ( docs )
  • 항목을 items 목록에 수집하고 반환하는 대신 루프에서 항목을 yield
  • 로컬 캐시 DNS 사용 ( 이 스레드 참조)
  • 이 사이트가 다운로드 임계 값을 사용하고 있는지 확인하고 다운로드 속도를 제한하십시오 ( 이 스레드 참조).
  • 스파이더를 실행하는 동안 로그 CPU 및 메모리 사용량 - 거기에 문제가 있는지 확인
  • scrapyd 서비스에서 동일한 거미를 실행 해보십시오.
  • grequests + lxml 이 더 잘 수행되는지 확인하십시오 (이 솔루션을 구현하는 데 도움이 필요한지 물어보십시오)
  • Scrapy 에서 pypy실행 해보고 PyPy에서 Scrapy를 실행 해보십시오.

희망이 도움이됩니다.

나는 치료법을 사용하여 아주 간단한 웹 스크레이퍼로 23770 개의 웹 페이지를 긁어 모으고 있습니다. 나는 치료법과 심지어 파이썬에 익숙하지 만 그 일을하는 거미를 쓰려고 노력했다. 그러나 실제로는 느립니다 (23770 페이지를 크롤링하는 데 약 28 시간이 소요됩니다).

나는 스 scrapy 웹 페이지와 메일 링리스트 및 stackoverflow 를 보았지만 초보자가 이해하기 쉬운 빠른 크롤러를 작성하는 일반적인 권장 사항을 찾을 수없는 것 같습니다. 어쩌면 내 문제는 거미 자체가 아니라 그것을 실행하는 방법입니다. 모든 제안을 환영합니다!

필요한 경우 아래 코드를 나열했습니다.

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field
import re

class Sale(Item):
    Adresse = Field()
    Pris = Field()
    Salgsdato = Field()
    SalgsType = Field()
    KvmPris = Field()
    Rum = Field()
    Postnummer = Field()
    Boligtype = Field()
    Kvm = Field()
    Bygget = Field()

class HouseSpider(BaseSpider):
    name = 'House'
    allowed_domains = ["http://boliga.dk/"]
    start_urls = ['http://www.boliga.dk/salg/resultater?so=1&type=Villa&type=Ejerlejlighed&type=R%%C3%%A6kkehus&kom=&amt=&fraPostnr=&tilPostnr=&iPostnr=&gade=&min=&max=&byggetMin=&byggetMax=&minRooms=&maxRooms=&minSize=&maxSize=&minsaledate=1992&maxsaledate=today&kode=&p=%d' %n for n in xrange(1, 23770, 1)]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select("id('searchresult')/tr")
        items = []      
        for site in sites:
            item = Sale()
            item['Adresse'] = site.select("td[1]/a[1]/text()").extract()
            item['Pris'] = site.select("td[2]/text()").extract()
            item['Salgsdato'] = site.select("td[3]/text()").extract()
            Temp = site.select("td[4]/text()").extract()
            Temp = Temp[0]
            m = re.search('\r\n\t\t\t\t\t(.+?)\r\n\t\t\t\t', Temp)
            if m:
                found = m.group(1)
                item['SalgsType'] = found
            else:
                item['SalgsType'] = Temp
            item['KvmPris'] = site.select("td[5]/text()").extract()
            item['Rum'] = site.select("td[6]/text()").extract()
            item['Postnummer'] = site.select("td[7]/text()").extract()
            item['Boligtype'] = site.select("td[8]/text()").extract()
            item['Kvm'] = site.select("td[9]/text()").extract()
            item['Bygget'] = site.select("td[10]/text()").extract()
            items.append(item)
        return items

감사!


또한 최적화 된 C #을 사용하여 웹 스크래핑 작업을하고 CPU 바운드가 끝나서 C로 전환합니다.

HTML 구문 분석은 C / C ++를 사용하는이 기능에만 액세스 할 수 있기 때문에 CPU 데이터 캐시를 불고 CPU가 SSE 4.2를 전혀 사용하지 않는지 확실히 확신합니다.

수학을한다면 바운드를 계산할 수 있지만 메모리를 구속하지는 않습니다.


코드를 살펴보면 대부분의 시간이 응답 처리보다는 네트워크 요청에 소요된다고 말할 수 있습니다. 팁 @alecxe 그의 대답을 적용 할 제공하지만 HTTPCACHE_ENABLED 설정을 제안 할 HTTPCACHE_ENABLED 때문에 요청을 캐시하고 두 번째 일을 피할. 크롤링을 따르거나 오프라인으로 개발하는 데 도움이됩니다. 문서에서 자세한 정보보기 : http://doc.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.contrib.downloadermiddleware.httpcache







scrapy-spider