使用Base64数据请求的URL编码

问题描述:

我想请与base64编码有数据的URL,像这样:使用Base64数据请求的URL编码

http://www.somepage.com/es_e/bla_bla#eyJkYXRhIjp7ImNvdW50cnlJZCI6IkVTIiwicmVnaW9uSWQiOiI5MjAiLCJkdXJhdGlvbiI6NywibWluUGVyc29ucyI6MX0sImNvbmZpZyI6eyJwYWdlIjoiMCJ9fQ==

我要做的,是建立一个JSON对象,其编码为BASE64和其追加到URL这样的:

new_data = {"data": {"countryId": "ES", "regionId": "920", "duration": 7, "minPersons": 1}, "config": {"page": 2}} 
json_data = json.dumps(new_data) 
new_url = "http://www.somepage.com/es_es/bla_bla#" + base64.b64encode(json_data) 
yield scrapy.Request(url=new_url, callback=self.parse) 

问题是,Scrapy抓取URL http://www.somepage.com/es_es/bla_bla没有编码,并且附加了数据的仅此一部分... ...但是如果我贴new_url成它显示了我的浏览器我想要的数据编码的结果!

不知道发生了什么......任何人都可以帮我一把吗?

+2

查询片段(URL的一部分在'#'之后)仅适用于浏览器。服务器忽略URL的那部分。 –

+0

由浏览器加载的Javascript代码可以自由使用查询片段来改变行为。例如。脚本可能会使用该部分来加载AJAX数据或以某种方式更改页面。这都是客户端,并且与服务器发送浏览器的内容无关。 –

+0

所以,在服务器端没有办法达到同样的效果?! @MartijnPieters – wj127

一直在寻找了很多之后,我读到这样的网址,在一个用#末(即我的网址http://www.somepage.com/es_e/bla_bla#eyJkYXRhIjp7ImNvdW50cnlJZCI6IkVTIiwicmVnaW9uSWQiOiI5MjAiLCJkdXJhdGlvbiI6NywibWluUGVyc29ucyI6MX0sImNvbmZpZyI6eyJwYWdlIjoiMCJ9fQ==)被称为段网址,基本上他们表示资源内的位置,像一个锚(你可以读它here)。

然后,感谢这个post我了解到,这些内容需要由页面加载,所以网站本身发出请求,以获得这些数据(传出请求),所以我所做的就是寻找那些使用Firefox开发者版(您可以使用任何其他系统向您显示这些请求,例如Tamper Data)发送传送请求,并构建提供我所查找的HTML内容的URL。

# The base64 data encoded as a JSON is appended after the 'searchRequest=' instead of using the '#' element, and voilà! 
"http://www.somewebsite.es/?controller=ajaxresults&action=getresults&searchRequest=eyJkYXRhIjp7ImNvdW50cnlJZCI6IkVTIiwicmVnaW9uSWQiOiI5MjAiLCJkdXJhdGlvbiI6N30sImNvbmZpZyI6eyJwYWdlIjoiMCJ9fQ==" 

我还可以通过使用Selium库,您可以在这个其他post看,但不是最好的做法实现这个...