Scrapy - формат и типы запросов - PullRequest
0 голосов
/ 28 июня 2019

Это отправная точка моего процесса очистки.

https://www.storiaimoveis.com.br/alugar/brasil

Это вызов AJAX, который возвращает данные в формате JSON для каждой страницы.

https://www.storiaimoveis.com.br/api/search?fields=%24%24meta.geo.postalCodeAddress.city%2C%24%24meta.geo.postalCodeAddress.neighborhood%2C%24%24meta.geo.postalCodeAddress.street%2C%24%24meta.location%2C%24%24meta.created%2Caddress.number%2Caddress.postalCode%2Caddress.neighborhood%2Caddress.state%2Cmedia%2ClivingArea%2CtotalArea%2Ctypes%2Coperation%2CsalePrice%2CrentPrice%2CnewDevelopment%2CadministrationFee%2CyearlyTax%2Caccount.logoUrl%2Caccount.name%2Caccount.id%2Caccount.creci%2Cgarage%2Cbedrooms%2Csuites%2Cbathrooms%2Cref&optimizeMedia=true&size=20&from=0&sessionId=5ff29d7e-88d0-54d5-2641-e203cafd6f4e

Мой запрос POST завершается неудачно с ошибкой 404. Эти запросы требуют полезной нагрузки, что доставляло мне проблемы в прошлом.Я всегда как-то решал проблему, но теперь я пытаюсь понять, что я с ними не так делаю.

Мои вопросы;

  • Требуются ли для полезных данных запроса, отправляемых вместе с запросами на удаление, определенный тип или формат?
  • Нужно ли мне вызывать json.dumps(payload) перед их отправкой или отправлять в виде словарей?.
  • Нужно ли преобразовывать каждую пару ключ: значение в строки перед отправкой полезной нагрузки?
  • Может ли быть какая-либо другая причина, по которой мой запрос не выполняется?

Это соответствующие части моего кода.

class MySpider(CrawlSpider):

    name = 'myspider'

    start_urls = [
        'https://www.storiaimoveis.com.br/api/search?fields=%24%24meta.geo.postalCodeAddress.city%2C%24%24meta.geo.postalCodeAddress.neighborhood%2C%24%24meta.geo.postalCodeAddress.street%2C%24%24meta.location%2C%24%24meta.created%2Caddress.number%2Caddress.postalCode%2Caddress.neighborhood%2Caddress.state%2Cmedia%2ClivingArea%2CtotalArea%2Ctypes%2Coperation%2CsalePrice%2CrentPrice%2CnewDevelopment%2CadministrationFee%2CyearlyTax%2Caccount.logoUrl%2Caccount.name%2Caccount.id%2Caccount.creci%2Cgarage%2Cbedrooms%2Csuites%2Cbathrooms%2Cref&optimizeMedia=true&size=20&from=0&sessionId=5ff29d7e-88d0-54d5-2641-e203cafd6f4e'
    ]

    page = 1
    payload = {"locations":[{"geo":{"top_left":{"lat":5.2717863,
                                                "lon":-73.982817},
                                    "bottom_right":{"lat":-34.0891,
                                                    "lon":-28.650543}},
                             "placeId":"ChIJzyjM68dZnAARYz4p8gYVWik",
                             "keywords":"Brasil",
                             "address":{"label":"Brasil","country":"BR"}}],
               "operation":["RENT"],
               "bathrooms":[],
               "bedrooms":[],
               "garage":[],
               "features":[]}
    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'Referer': 'https://www.storiaimoveis.com.br/alugar/brasil',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
    }


    def parse(self, response):
        for url in self.start_urls:
            yield scrapy.Request(url=url,
                                 method='POST',
                                 headers=self.headers,
                                 body=json.dumps(self.payload),
                                 callback=self.parse_items)

    def parse_items(self, response):
        from scrapy.shell import inspect_response
        inspect_response(response, self)
        print response.text

1 Ответ

1 голос
/ 29 июня 2019

Да, вам нужно позвонить json.dumps(payload), потому что тело запроса должно быть str or unicode, как указано в документации: https://docs.scrapy.org/en/latest/topics/request-response.html#request-objects

Но, в вашем случае, ваш запрос не выполняется из-за этих 2отсутствующие заголовки: Content-Type и Referer.

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

  1. Проверка заголовков в инструментах разработчика Chrome:

enter image description here

Используйте curl или Postman, чтобы сделать запрос, пока я не получу правильные заголовки.В этом случае Content-Type и Referer, по-видимому, достаточно для статуса ответа HTTP 200:

enter image description here

enter image description here

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