Как извлечь выгоду из параллелизма Scrapy с неселениевыми запросами - PullRequest
0 голосов
/ 18 февраля 2020

У меня здесь интересная проблема. Я пишу веб-скребок Scrapy, чтобы получить продукты с веб-сайта. Страницы каталога используют ленивую загрузку, что означает, что я не могу получить больше, чем первые 12 предметов, или использую нумерацию страниц, используя Scrapy по умолчанию. Я начал использовать Selenium с безголовым chrome клиентом, чтобы прокручивать страницу вручную для получения данных.

Я прочитал в Интернете, что использование Scrapy + Selenium означает, что я не могу выполнять запросы Scrapy одновременно, что прискорбно, потому что подавляющее большинство моих запросов не требует Selenium. Мое промежуточное программное обеспечение Selen проверяет свойство request.meta, чтобы выяснить, нужно ли ему что-либо делать, в противном случае оно просто возвращает None. Однако все запросы фильтруются через промежуточное ПО.

Мой вопрос таков: есть ли способ разрешить одновременное выполнение запросов, которым НЕ требуется Selenium?

Мое промежуточное ПО:

def __init__(self):
    options = Options()
    options.add_argument("--headless")
    self.driver = webdriver.Chrome("path/to/driver", chrome_options=options)

def process_request(self, request, spider):
    if request.meta.get("selenium"):
        self.driver.get(request.url)
        ... # Perform selinium scroll logic and return body
    return None

Функция анализа моего паука:

def parse(self, response):
    meta = {"otherMetaData": "data", "selenium": True}
    ... # Obtain link to catalog page
    yield response.follow(page_link, callback=self.parseProducts, meta=meta)

def parseProducts(self, response):
    ... # Obtain links to product pages
    response.meta.pop("selenium")
    yield response.follow(page_link, callback=self.parseProductPage, response.meta)

РЕДАКТИРОВАТЬ: Форматирование

1 Ответ

0 голосов
/ 18 февраля 2020

Это была проблема, с которой я столкнулся недавно, что вам нужно знать, это то, что Scrapy полагается на планировщик для выдачи времени запросов. Планировщик ждет до значения CONCURRENT_REQUESTS (это значение будет пропущено, если есть меньше запросов, которые будут сделаны, т.е. когда паук завершает окончательные запросы), то он будет выполнять свои запросы, планировщик также зависит от priority, который вы можете изменить, чтобы дать определенным ссылкам более высокий приоритет, чтобы они запускались раньше в queue.

Нет прямого способа сделать то, что вы просите, но хорошим способом сделать это было бы передать ваши запросы "не селена" другому пауку с его собственным custom_settings

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