2017-09-03 99 views
0

我想請與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

回答

0

一直在尋找了很多之後,我讀到這樣的網址,在一個用#末(即我的網址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看,但不是最好的做法實現這個...