Моя ситуация:
У меня около 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})