Scrapy-Splash没有设置自定义请求标头

时间:2018-08-09 16:45:22

标签: python header request scrapy splash-screen

我试图在Python 2.7中使用Scrapy + Splash抓取一个网站。 该网站使用JavaScript生成大多数HTML,这就是为什么我需要Splash的原因。

首先,我用Scrapy发出FormRequest来登录网站。成功了。

然后我从JSON响应中提取“ access_token”,因为它应在下一个请求中用作“授权”标头-确认我已登录的网站。

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)

result.body中的HTML确认我已登录。太棒了!

调用 response.request.headers 显示“授权”标头也已发送。

{'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显示所有cookie均已发送,没有任何问题。

之后,我将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
"""

但是,我从Splash响应中获得的HTML显示我未登录

Cookie DEBUG没有显示任何问题-发送的Cookie与以前一样。

但这是我从调用 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中设置我自己的请求标头

0 个答案:

没有答案