Scrapy-Splash не устанавливает пользовательские заголовки запросов

75
8

Я пытаюсь очистить сайт, используя Scrapy + Splash в Python 2.7. Веб-сайт использует JavaScript для генерации большей части HTML, поэтому мне нужен Splash.

Во-первых, я делаю FormRequest с помощью Scrapy для входа на сайт. Это успешно.

Затем я извлекаю "access_token" из ответа JSON, потому что он должен использоваться в следующем запросе как заголовок "Авторизация" - для подтверждения на веб-сайте, на котором я вошел.

jsonresp = json.loads(response.body_as_unicode())
self.token = 'Bearer ' + jsonresp['access_token']
self.my_headers['Authorization'] = self.token

Прежде чем продолжить работу с SplashRequest, я решил протестировать сеанс с помощью scrapy.Request. Я передал файлы cookie и новые заголовки:

 yield scrapy.Request('https://www.example.com/products', cookies=self.cookies, dont_filter=True, callback=self.parse_pages,  headers=self.my_headers)

HTML из result.body подтвердил, что я вошел в систему. Отлично!

Вызов response.request.headers показал, что заголовок "Authorization" также был отправлен.

{'Accept-Language': ['en-US,en;q=0.5'], 
'Accept-Encoding': ['gzip,deflate'],
'Accept': ['application/json, text/plain, */*'],
'User-Agent': ['Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'],
'Connection': ['keep-alive'],
'Referer': ['https://www.example.com/Web'],
'Cookie': ["___cookies___"],
'Content-Type': ['application/x-www-form-urlencoded'],
'Authorization': ['Bearer Zyb9c20JW0LLJCTA-GmLtEeL9A48se_AviN9xajP8NZVE8r6TddoPHC6dJnmbQ4RCddM8QVJ2v23ey-kq5f8S12uLMXlLF_WzInNI9eaI29WAcIwNK-FixBpDm4Ws3SqXdwBIXfkqYhd6gJs4BP7sNpAKc93t-A4ws9ckpTyih2cHeC8KGQmTnQXLOYch2XIyT5r9verzRMMGHEiu6kgJWK9yRL19PVqCWDjapYbtutKiTRKD1Q35EHjruBJgJD-Fg_iyMovgYkfy9XtHpAEuUvL_ascWHWvrFQqV-19p-6HQPocEuri0Vu0NsAqutfIbi420_zhD8sDFortDmacltNOw-3f6H1imdGstXE_2GQ']}

Cookie DEBUG показал, что все куки были отправлены без проблем.

После этого я заменил scrapy.Request с SplashRequest:

yield SplashRequest('https://www.example.com/products', cookies=self.cookies,  callback=self.parse_pages, args={"lua_source": lua_script, 'headers':self.my_headers},  endpoint='execute', errback=self.errors)

lua_script:

lua_script = """
function main(splash)
splash:init_cookies(splash.args.cookies)
assert(splash:go{
splash.args.url,
headers=splash.args.headers,
http_method=splash.args.http_method,
body=splash.args.body,
})
assert(splash:wait(2))

local entries = splash:history()
local last_response = entries[#entries].response

return {
url = splash:url(),
headers = last_response.headers,
http_status = last_response.status,
html = splash:html(),
}
end
"""

Тем не менее, HTML, который я получил от ответа Splash, показал, что я не был зарегистрирован.

Cookie DEBUG не показывал никаких проблем - те же куки были отправлены, как и раньше.

Но вот что я получил от вызова response.request.headers:

 {'Accept-Language': ['en'], 
'Accept-Encoding': ['gzip,deflate'],
'Accept': ['text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'],
'User-Agent': ['Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0'],
'Cookie': ["___cokies___"],
'Content-Type': ['application/json']}

Как вы можете видеть, Splash не установил мои пользовательские заголовки, вместо этого он просто комбинировал файлы cookie с настройками по умолчанию.

Я попытался настроить свои собственные заголовки как аргументы функции SplashRequest, так и внутри lua_script, но ни один из подходов не работал.

Мой вопрос: как установить свои собственные заголовки запросов в Splash?

спросил(а) 2021-01-27T23:37:14+03:00 2 месяца, 2 недели назад
1
Решение
130

Вы пытались переместить headers вне словаря args? Это сработало для меня:

yield SplashRequest('https://www.example.com/products', cookies=self.cookies, callback=self.parse_pages, args={"lua_source": lua_script}, headers=self.my_headers, endpoint='execute', errback=self.errors)

ответил(а) 2021-01-27T23:37:14+03:00 2 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема