Как получить динамически загруженный контент с этого сайта с помощью scrapy-splash?

#python #scrapy #scrapy-splash

#python #scrapy #scrapy-splash

Вопрос:

Я пытаюсь получить данные с этого веб-сайта с помощью scrapy-splash, но я не могу извлечь данные. Я хочу получить данные о каждом реальном состоянии, например, href, price и т.д. Вот мой код:

в setings.py:

 ROBOTSTXT_OBEY = False

USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36"

SPLASH_ENABLED = True


DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

SPLASH_URL = 'http://localhost:8050/'

SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
  

мой паук:

 class M2Spider(scrapy.Spider):
    
    name = "m2"
    allowed_domains = ['metrocuadrado.com']
    start_urls = [
            'https://www.metrocuadrado.com/bodega/arriendo'
            ]
    
    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url,callback= self.parse, 
                               endpoint='render.html',
                               args={'wait': 10},)
                  
    def parse(self, response):
        print("--------------------------------------------------------------")
        real_states= response.selector.xpath(".//a[@class='sc-bdVaJa ebNrSm']").getall()

        print("real_states")
  

Выводимый print представляет собой пустой список []. Я новичок в splash. Есть предложения?

Ответ №1:

Вместо этого я бы сделал следующее:

Отправьте запрос на https://www.metrocuadrado.com/results/_next/static/chunks/commons.8afec6af6d5add2097bf.js , в ответе вы найдете API-ключ, если будете искать «X-Api-Key». Так что это можно легко извлечь с помощью регулярных выражений, что-то вроде: re.findall(r'"X-Api-Key":"(w )"') .

Затем, когда вы извлекли ключ API, отправьте запрос на https://www.metrocuadrado.com/rest-search/search?seo=/bodega/arriendoamp;from=0amp;size=50 , который является скрытым API на веб-сайте, который вы отправили. Чтобы получить действительный ответ, вы должны прикрепить заголовок следующим образом

 scrapy.Request(
    url=url_variable,
    headers={
        "x-api-key": api_key_variable_from_prev_step
    }
)
  

Из этого API вы получаете данные в формате JSON, которые обычно более надежны, чем синтаксический анализ html, поскольку это часто меняется.

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

1. Ваш ответ был очень полезен, но у меня возникли некоторые проблемы с получением всех элементов. Когда я отправил запрос на metrocuadrado.com/rest-search/search?seo=/bodega/… Я получил первые 50 элементов, но когда я отправил следующий запрос на metrocuadrado.com/rest-search/search?seo=/bodega/… Я продолжаю получать те же 50 ранее полученных элементов, что я могу делать неправильно?

2. Попробуйте использовать этот URL-адрес, нашел его при разбивке сайта на страницы в chrome inspect. metrocuadrado.com/rest-search /…

3. это работает для меня, но у меня есть еще одна небольшая «проблема», я могу получить только 10000 элементов, не могли бы вы помочь мне еще раз, пожалуйста?

4. Я думаю, что сайт ограничен предоставлением только 10 000 элементов. Если вы посмотрите на обычный сайт, вы увидите, что вы можете разбивать страницы максимум на 200 страниц. Так что я не думаю, что есть способ обойти это, к сожалению.