Scrapy / Python XMLHTTPRequest - PullRequest
       20

Scrapy / Python XMLHTTPRequest

0 голосов
/ 27 мая 2020

Я создал парсер, который работает до определенного момента: он переходит к списку записей, анализирует записи до ключевых для дальнейшего сканирования, переходит к этим отдельным записям, но не может анализировать таблицы в записях, потому что они загружены через JavaScript. JavaScript выдает запрос POST (xmr) для их заполнения. Поэтому, если JavaScript не включен, он возвращает что-то вроде «Записей не найдено».

Итак, я прочитал этот вопрос: Ссылка

Я проверил заголовки запросов с помощью разработчика браузера. инструменты. Заголовки включают в себя:

fetch("https://example.com/Search/GridQuery?query=foo", {
  "headers": {
    "accept": "text/plain, */*; q=0.01",
    "accept-language": "en-US,en;q=0.9,es;q=0.8",
    "cache-control": "no-cache",
    "content-type": "application/x-www-form-urlencoded",
    "pragma": "no-cache",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin",
    "x-requested-with": "XMLHttpRequest"
  },
  "referrer": "https://example.com/SiteSearch/Search?query=bar",
  "referrerPolicy": "no-referrer-when-downgrade",
  "body": "page=1&size=10&useFilters=false",
  "method": "POST",
  "mode": "cors",
  "credentials": "include"
});

Браузер указывает на готовку ie, хотя не выводится копированием выборки ... Затем я попробовал следующее:

url = response.urljoin(response.css('div#Foo a::attr(href)').get())
yield Request(url=url,
              method='POST',
              body='{"filters": ["page": "1", "size": "10", "useFilters": "False"]}',
              headers={'x-requested-with': 'XMLHttpRequest'},
              callback=self.parse_table)

Я получаю ответ, но он по-прежнему говорит: «Записи не найдены». Итак, запрос POST работает неправильно.

Нужно ли мне помещать все в заголовок запроса? Как определить, что нужно включить? Требуются ли файлы cookie?

1 Ответ

0 голосов
/ 27 мая 2020

Я не тестировал это, так как вы не указали реальный URL-адрес, но я вижу здесь пару проблем.
Обратите внимание, что тип содержимого - application/x-www-form-urlencoded, и вы отправляете объект JSON в теле (это для application/json)

Вместо этого вы должны отправить FormRequest :

url = "https://example.com/Search/GridQuery?query=foo"
form_data = {"page": "1", "size": "10", "useFilters": "False"}
yield FormRequest(url, formdata=form_data, callback=self.parse_table)

Или просто добавьте параметры в качестве параметров запроса в URL-адрес (все еще запрос POST , просто опустите тело).

url="https://example.com/Search/GridQuery?query=foo&page=1&size=10&useFilters=False"

В любом случае этот "filters":[] вам не нужен, просто используйте простой объект «ключ-значение».

...