#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
. Взгляните на скудную архитектуру , чтобы понять, почему. Также динамическая нагрузка на прокрутку означает, что на веб-странице выполняются дополнительные запросы, изучите, как строятся эти запросы, возможно, вам не понадобится даже Селен. Кроме того, выполнение запросов в промежуточном программном обеспечении выглядит как неправильное место.