2014-09-24 73 views
1

所以我試圖通過Scrapyd獲得大約數百個在EC2實例上運行的蜘蛛。我有一噸的URL像這樣的:curl截取部分查詢字符串?

https://items.initrode.com/TGWebHost/searchitems.aspx?partnerid=25233&siteid=5296 

但是當我運行通過捲曲蜘蛛...

curl http://localhost:6800/schedule.json -d project=MYPROJECT -d spider=SOMESPIDER -d spider_specific_option=1 -d url="https://items.initrode.com/TGWebHost/searchitems.aspx?partnerid=25233&siteid=5296" 

...並檢查我的蜘蛛start_urls名單中,我在通過URL似乎缺少& SITEID值,就像這樣:

https://items.initrode.com/TGWebHost/searchitems.aspx?partnerid=2523 

後的研究時間我發現,捲曲在「&」字符停止處理並認爲ÿ你試圖將這個過程推到後臺,我發現它的確如此,最終的結果是我缺少查詢字符串的一部分。

我已經設法解決了這個問題,我用一個%26替換了所有網址中的&,但是爲什麼curl會像這樣解釋URL,當時URL已經在引號中了?我認爲引號應該可以防止這樣的問題發生?

回答

1

我查看了文檔,curl-d選項的情況下確實將&解釋爲分隔符,因此您不能在此處使用它並需要正確地將其解除。在Python中,你可以做到這一點使用urllib.parse.quote()和結果看起來就會像下面這樣:

https%3A//items.initrode.com/TGWebHost/searchitems.aspx%3Fpartnerid%3D25233%26siteid%3D5296 

,那麼你會運行如下捲曲:

curl 'http://localhost:6800/schedule.json' \ 
    -d project=MYPROJECT \ 
    -d spider=SOMESPIDER \ 
    -d spider_specific_option=1 \ 
    -d "url=https%3A//items.initrode.com/TGWebHost/searchitems.aspx%3Fpartnerid%3D25233%26siteid%3D5296" 

所以問題並不在shell引用我最初建議,並且它不嚴格按照curl解釋參數的方式,但更多的方式是在服務器端解釋查詢字符串,其中&需要解釋爲分隔符。

+0

我做了一些編輯到上面的帖子,但我錯過了命令行的url。所以你說的是我需要把它放在單引號而不是雙引號? – cornjuliox 2014-09-24 08:22:57

+0

重編,現在我認爲答案取決於任務。 – 2014-09-24 08:43:39