как вернуть несколько ответов вместо одного только для spider в промежуточном ПО scrapy selenium

#python #selenium #scrapy #return #arguments

Вопрос:

Я использую фреймворк python scrapy для обхода информации об автомобиле на странице ниже:

 https://youjia.baidu.com/view/carDatabase?title=现代amp;key=codeamp;val=174amp;sa=pc_growth_1
 

но на этой странице используется что-то вроде техники бесконечной прокрутки для автоматической загрузки json при прокрутке страницы вниз. На каждой странице 25 результатов, для разных страниц марки автомобиля количество отличается, поэтому иногда необходимо разделить результаты на 1~3 страницы, прокручивая вниз.

Поэтому мне было интересно, что, возможно, я смогу интегрировать некоторые коды в промежуточное программное обеспечение selenium, как показано ниже:

 from scrapy import signals
from selenium import webdriver
from scrapy.http.response.html import HtmlResponse
import random
import time


class SeleniumDownloadMiddleware(object):
def __init__(self):
    # self.driver = webdriver.Chrome()
    self.driver = webdriver.Firefox()

def process_request(self,request,spider):
    self.driver.get(request.url)
    time.sleep(1)
    source = self.driver.page_source
    response = HtmlResponse(url=self.driver.current_url,body=source,request=request,encoding='utf-8')


    return response

    SCROLL_PAUSE_TIME = 2
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(SCROLL_PAUSE_TIME)
        source = self.driver.page_source
        response = HtmlResponse(url=self.driver.current_url, body=source, request=request, encoding='utf-8')
        return response

        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height
 

но проблема в том, что это промежуточное программное обеспечение возвращает ответ только один раз, поэтому spider.py разбирайте только один раз.
Как я могу изменить этот фрагмент, чтобы реализовать возврат 1~3 раза?

Комментарии:

1. кто-нибудь может мне помочь? или я недостаточно ясно излагаю проблему?

2. Вам нужно вернуться Response , попробуйте использовать process_response метод.

3. @SerhiiShynkarenko здравствуйте, вы можете быть более конкретным? Я имею в виду, когда я прокручиваю вниз, страница 2 , страница 3 загружается, а затем снова возвращает ответ. очень быстрый ответ будет использован пауком.

4. цикл выглядит следующим образом: 1-я страница 1 инициирует синтаксический анализ, перенаправляет запрос на движок >>>>>> 2-я, перенаправляет запрос на загрузчик, чтобы получить ответ страницы 1, >>>>>>>>>>>>>>> 3-й, загрузчик возвращает ответ на двигатель >>>>>>>>>>>>>>>>>>>>>>>>4-е, механизм передает извлеченные данные в виде элементов, выводимых в spider. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 5-е, паук инициирует запрос на страницу 2. Поэтому мне нужно запустить несколько запросов в spider несколько раз. верно? Ключевой момент заключается в том, чтобы запустить несколько запросов соответственно на страницу 1~3. Как я могу интегрировать несколько «инициаторов» в код spider?

5. process_request не возвращает ответа, вам нужно process_response . Взгляните на скудную архитектуру , чтобы понять, почему. Также динамическая нагрузка на прокрутку означает, что на веб-странице выполняются дополнительные запросы, изучите, как строятся эти запросы, возможно, вам не понадобится даже Селен. Кроме того, выполнение запросов в промежуточном программном обеспечении выглядит как неправильное место.