Как мой веб-сканер (Python, Scrapy, Scrapy-splash) может сканировать быстрее? - PullRequest
0 голосов
/ 15 марта 2019

Разработка среды:

  • CentOS7
  • пункт 18,1
  • Docker версия 18.09.3, сборка 774a1f4
  • клиент командной строки anaconda (версия 1.7.2)
  • Python3.7
  • Scrapy 1.6.0
  • SCRAPY разбрызгивание
  • MongoDB (дБ версия v4.0.6)
  • PyCharm

Характеристики сервера:

  • CPU -> процессор: 22, vendor_id: GenuineIntel, семья процессора: 6, модель: 45, Название модели: Intel (R) Xeon (R) CPU E5-2430 0 @ 2,20 ГГц
  • RAM -> Mem: 31960
  • 64 бит

Hello.

Я разработчик php, и это мой первый проект на python. Я пытаюсь использовать python, потому что слышал, что у python есть много преимуществ для сканирования в Интернете.

Я сканирую один динамический веб-сайт, и мне нужно сканировать около 3500 страниц каждые 5-15 секунд. На данный момент у меня слишком медленно. Ползать только 200 страниц в минуту.

Мой источник такой:

main.py

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from spiders.bot1 import Bot1Spider
from spiders.bot2 import Bot2Spider
from spiders.bot3 import Bot3Spider
from spiders.bot4 import Bot4Spider
from pprint import pprint


process = CrawlerProcess(get_project_settings())
process.crawl(Oddsbot1Spider)
process.crawl(Oddsbot2Spider)
process.crawl(Oddsbot3Spider)
process.crawl(Oddsbot4Spider)
process.start()

bot1.py

import scrapy
import datetime
import math

from scrapy_splash import SplashRequest
from pymongo import MongoClient
from pprint import pprint


class Bot1Spider(scrapy.Spider):
    name = 'bot1'
    client = MongoClient('localhost', 27017)
    db = client.db

    def start_requests(self):
        count = int(self.db.games.find().count())
        num = math.floor(count*0.25)
        start_urls = self.db.games.find().limit(num-1)

        for url in start_urls:
            full_url = domain + list(url.values())[5]
            yield SplashRequest(full_url, self.parse, args={'wait': 0.1}, meta={'oid': list(url.values())[0]})

    def parse(self, response):
        pass

settings.py

BOT_NAME = 'crawler'

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


# Scrapy Configuration

SPLASH_URL = 'http://localhost:8050'

DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'my-project-name (www.my.domain)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 64

# Configure a delay for requests for the same website (default: 0)
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
CONCURRENT_REQUESTS_PER_DOMAIN = 16

При выполнении этого кода я использую эту команду: python main.py

После просмотра моего кода, пожалуйста, помогите мне. Я с удовольствием выслушаю любое высказывание.

1.Как мой паук может работать быстрее? Я пытался использовать многопоточность, но, похоже, он работает неправильно.

2. Какова максимальная производительность для сканирования в Интернете?

3. Можно ли сканировать 3500 динамических страниц каждые 5-15 секунд?

Спасибо.

...