Можно ли ускорить веб-скребок с нескольких компьютеров?
Есть ли способ ускорить работу веб-скребка, если несколько компьютеров вносят свой вклад в обработку списка URL-адресов? Как компьютер A принимает URL-адреса 1–500, а компьютер B - URL-адреса 501–1000 и т. Д. Я ищу способ создания максимально быстрого веб-скребка с ресурсами, доступными для обычных людей.
Я уже использую многопроцессорную обработку из модуля grequests. Который является Gevent + запрос в сочетании.
Этот соскоб не нужно проводить постоянно, а в определенное время каждый день утром (6 часов утра), и выполнять его нужно сразу же, как только он начнется. Я ищу что-то быстрое и пунктуальное.
Также я просматриваю URL для розничных магазинов (то есть: target, bestbuy, newegg и т. Д.) И использую его для проверки того, какие товары есть в наличии на день.
Это фрагмент кода для получения тех URL-адресов в сценарии, который я пытаюсь собрать:
import datetime
import grequests
thread_number = 20
nnn = int(len(product_number_list)/100)
float_nnn = (len(product_number_list)/100)
# Product number list is a list of product numbers, too big for me to include the full list. Here are like three:
product_number_list = ['N82E16820232476', 'N82E16820233852', 'N82E16820313777']
base_url = 'https://www.newegg.com/Product/Product.aspx?Item={}'
url_list = []
for number in product_number_list:
url_list.append(base_url.format(product_number_list))
# The above three lines create a list of urls.
results = []
appended_number = 0
for x in range(0, len(product_number_list), thread_number):
attempts = 0
while attempts < 10:
try:
rs = (grequests.get(url, stream=False) for url in url_list[x:x+thread_number])
reqs = grequests.map(rs, stream=False, size=20)
append = 'yes'
for i in reqs:
if i.status_code != 200:
append = 'no'
print('Bad Status Code. Nothing Appended.')
attempts += 1
break
if append == 'yes':
appended_number += 1
results.extend(reqs)
break
except:
print('Something went Wrong. Try Section Failed.')
attempts += 1
time.sleep(5)
if appended_number % nnn == 0:
now = datetime.datetime.today()
print(str(int(20*appended_number/float_nnn)) + '% of the way there at: ' + str(now.strftime("%I:%M:%S %p")))
if attempts == 10:
print('Failed ten times to get urls.')
time.sleep(3600)
if len(results) != len(url_list):
print('Results count is off. len(results) == "' + str(len(results)) + '". len(url_list) == "' + str(len(url_list)) + '".')
это не мой код, он получен из этих двух ссылок: