Как увеличить скорость сканирования Scrapy на одном компьютере? - PullRequest
0 голосов
/ 05 мая 2019

Моя ситуация:

У меня около 40 миллионов страниц для сканирования, и все меры по борьбе с пауками будут взломаны.

Теперь я использую скрапы, могу сканировать только 60-100 страниц одной минуты на одном компьютере. (у сайта достаточно производительности, и у меня неплохая пропускная способность и процессор)

Как мне увеличить скорость ползания?

Мой start_urls имеет только один URL. Все последующие ссылки создаются по предыдущему ответу. Я думаю, что это, возможно, резонанс моей проблемы.

Некоторые из моих настроек:

RETRY_ENABLED = 1 
RETRY_TIMES = 2
DOWNLOAD_TIMEOUT = 15
DOWNLOAD_DELAY = 0 
CONCURRENT_REQUESTS = 100 
CONCURRENT_REQUESTS_PER_DOMAIN = 100 
CONCURRENT_REQUESTS_PER_IP = 100

И если я смогу получить все 40 миллионов страниц, как мне сделать, чтобы увеличить скорость сканирования? (Я действительно уверен, что смогу получить это.)

Поместить все URL в start_urls и установить concurrent_requests 30 или больше?

Один метод, который я подумал, заключается в том, чтобы поместить все 40 миллионов URL-адресов страниц в базу данных Redis и создать 10 или более потоков, чтобы одновременно получать URL-адреса и сканировать.

Итак, могу ли я установить потоки, чтобы получить URL-адрес от Redis одновременно. И все это должно быть в одном компьютере.

Как увеличить скорость сканирования Scrapy на одном компьютере?

Частичный код

def start_requests(self):

    url =  'https://www.xxxx.com/map_searchByLocation'

    longitude, latitude = get_next_coordinate(self.points, self.start_longitude, self.start_latitude, self.radius)

    data = get_form(longitude, latitude, self.radius)
    proxy = 'http://' + get_proxy()
    yield FormRequest(url, method='POST', formdata=data, callback=self.parse, dont_filter=True, meta={'proxy':proxy,'download_timeout':3,'longitude':data['longitude'], 'latitude':data['latitude'], 'data':data})

def parse(self, response):
    info_list = json.loads(response.text)
    if info_list['listCount']:
        for item in info_list['list']:
            item_loader = QiyeItemloader(item=QiyeItem())
            item_loader.add_value('hash', item['KeyNo'])
            item_loader.add_value('name', item['Name'])
            item_loader.add_value('longitude', response.meta['longitude'])
            item_loader.add_value('latitude', response.meta['latitude'])
            qiye_item= item_loader.load_item()
            yield qiye_item
    longitude, latitude = get_next_coordinate(self.points, response.meta['longitude'], response.meta['latitude'], self.radius)
    next_data = get_form(longitude, latitude, self.radius)
    yield FormRequest(response.url, method='POST', formdata = next_data, callback=self.parse, dont_filter=True, meta={'proxy':response.meta['proxy'],'download_timeout':3,'longitude':next_data['longitude'], 'latitude':next_data['latitude'], 'data':next_data})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...