scrapy: как включить хэштег в URL - PullRequest
0 голосов
/ 11 марта 2019

У меня есть URL-адрес вида

url = "http://www.example.com/search.html#query=test"

Когда я передаю его в scrapy.Request как

yield scrapy.Request(url, self.parse_result)

и собираю его в parse_result вот так

def parse_result(self, response):
    print(response.url)

последний бит в строке всегда обрезается и печатается следующим образом

http://www.example.com/search.html

Что мне нужно сделать, чтобы иметь возможность полностью подобрать строку из значения response.urlвключая часть #query=test?Попытка использовать код% 23 вместо хэштега, но он просто передается как число, а не как хэштег.И использование

urllib.parse.quote(url)

создает ошибку значения:

ValueError: Missing scheme in request

1 Ответ

0 голосов
/ 11 марта 2019

Питер, дело в том, что серверы никогда не получают hash (или идентификатор фрагмента - так называется этот фрагмент).В соответствии с https://en.wikipedia.org/wiki/Fragment_identifier «его обработка исключительно на стороне клиента».

В вашем случае это означает, что на веб-странице есть какой-то JS, который будет загружать хеш после загрузки страницы, обрабатывать ее и приводить страницу в актуальное состояние.Из коробки Scrapy не способен выполнять JS.Таким образом, у вас есть несколько вариантов:

  • Проверьте вкладку Network вашего браузера и попробуйте посмотреть, выполняет ли браузер какие-либо запросы XHR / Ajax.Если да, они могут содержать информацию, которую вам нужно почистить.
  • Если браузер не отправляет запросы ajax / xhr, то, вероятно, вся необходимая информация уже есть в ответе HTML, полученном с сервера.Это может быть в атрибутах данных тегов html, в скрытых блоках и так далее.Попробуйте поискать ответ html (не используйте Inspect Element - он покажет вам html после того, как он был обработан JS. Вместо этого используйте View page source - он точно покажет, какой сервер отправил вам).
  • Существуют способы выполнения JS с помощью Scrapy - https://github.com/scrapy-plugins/scrapy-splash, но требуются расширенная настройка и больше работы, чем простая обработка на стороне сервера.
...