使用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
成它显示了我的浏览器我想要的数据编码的结果!
不知道发生了什么......任何人都可以帮我一把吗?
一直在寻找了很多之后,我读到这样的网址,在一个用#
末(即我的网址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看,但不是最好的做法实现这个...
查询片段(URL的一部分在'#'之后)仅适用于浏览器。服务器忽略URL的那部分。 –
由浏览器加载的Javascript代码可以自由使用查询片段来改变行为。例如。脚本可能会使用该部分来加载AJAX数据或以某种方式更改页面。这都是客户端,并且与服务器发送浏览器的内容无关。 –
所以,在服务器端没有办法达到同样的效果?! @MartijnPieters – wj127