медленное сканирование, 6 блоков, 900 одновременных запросов, 10 тыс. веб-сайтов (облачное хранилище) - PullRequest
0 голосов
/ 02 мая 2018

Я использую простой CrawlSpider, который я использую для сбора метаданных, в списке из примерно 10 тысяч разных доменов. Цель состоит в том, чтобы сканировать каждый веб-сайт целиком.

Поскольку это «широкий обход», я дал ему 6 единиц для запуска и загрузил CONCURRENT_REQUESTS до 900, сохраняя AUTOTHROTTLE_TARGET_CONCURRENCY до 1.

Он будет работать довольно быстро в первый час, а затем будет медленно снижаться, примерно через 3 часа скорость будет составлять 50 единиц в минуту, что, я думаю, немного, когда у нас 900 параллельных запросов.

Я мог бы увеличить его в среднем до 250 элементов / минут, увеличив AUTOTHROTTLE_TARGET_CONCURRENCY до 50, но некоторые веб-сайты давали бы мне много исключений по таймауту.

Итак, мой вопрос: я что-то не так делаю? Даже когда я запускаю «верх» на пауке, я вижу, что в начале он работал между 60% -90%, сейчас он на 5% макс.

Вот мой файл settings.py

SPIDER_MODULES = ['crawl_everything.spiders']
NEWSPIDER_MODULE = 'crawl_everything.spiders'

SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': True,
}

BOT_NAME='bot'
USER_AGENT='bot'
ROBOTSTXT_OBEY = True
HTTPCACHE_ENABLED = False
LOG_LEVEL = 'WARNING'
DELTAFETCH_RESET=True

CONCURRENT_REQUESTS = 900
CONCURRENT_REQUESTS_PER_IP=20
DOWNLOAD_DELAY=1


DOWNLOAD_TIMEOUT = 30

REACTOR_THREADPOOL_MAXSIZE = 100

AUTOTHROTTLE_ENABLED=False

LOG_LEVEL = 'INFO'
COOKIES_ENABLED = False
RETRY_ENABLED = False
REDIRECT_ENABLED = True
AJAXCRAWL_ENABLED = True

Вот мой паук

class CrawlEverythingSpider(CrawlSpider):
    name = "crawl_everything"
    allowed_domains = domains
    start_urls = urls
    rules = (
        Rule(LinkExtractor(),
         callback='parse_item',
         follow=True
        ),
    )

    def parse_item(self, response):
        item = {}
        item['url'] = response.url
        try:
            item['title'] = response.xpath("//title/text()").extract_first()
        except (AttributeError, NotSupported) as e:
            return

        meta_names = response.xpath("//meta/@name").extract()
        meta_properties = response.xpath("//meta/@property").extract()

        for name in meta_names:
            item[name] = response.xpath("//meta[@name='" + name + "']/@content").extract_first()

        for property in meta_properties:
            item[property] = response.xpath("//meta[@property='" + property + "']/@content").extract_first()

        yield item

1 Ответ

0 голосов
/ 26 июня 2018

Я должен был опубликовать ответ раньше.
поэтому, когда вы хотите запустить одних и тех же пауков на тысячах веб-сайтов, лучше всего разделить их на несколько «сегментов» и присвоить каждому сегменту экземпляр паука (запуск spider_a, spider_b, spider_c ...)
Установите CONCURENT_PER_DOMAIN на 10, и вы можете увеличить CONCURRENT_REQUESTS до 1000 с 10 параллельными пауками. Это происходит намного быстрее, чем мое первое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...