2011-07-07 52 views
4

我正在使用Scrapy進行報廢項目。Scrapy,網址上的哈希標記

我意識到Scrapy將URL從哈希標籤剝離到最後。

下面是從外殼輸出:

[s] request <GET http://www.domain.com/b?ie=UTF8&node=3006339011&ref_=pe_112320_20310580%5C#/ref=sr_nr_p_8_0?rh=n%3A165796011%2Cn%3A%212334086011%2Cn%3A%212334148011%2Cn%3A3006339011%2Cp_8%3A2229010011&bbn=3006339011&ie=UTF8&qid=1309631658&rnid=598357011> 
[s] response <200 http://www.domain.com/b?ie=UTF8&node=3006339011&ref_=pe_112320_20310580%5C> 

這確實影響了我再殺因爲經過了幾個小時試圖找出爲什麼不選擇一些項目,我認識到,通過長期提供的HTML網址與短網址提供的網址不同。另外,經過一番觀察,內容在一些關鍵部分發生了變化。

有沒有辦法修改這個行爲,讓Scrapy保持整個URL?

感謝您的反饋和建議。

+0

感謝您的回答,我能夠在URL中獲得這個哈希標記背後的概念。基本上,按照@also的說法,JAX請求會生成一個響應,在我的情況下我必須解析JSON。下面的Scrapy示例在這個問題上提出了一些清晰的觀點。 這些文件有助於進一步參考: http://blog.scrapy.org/scraping-ajax-sites-with-scrapy http://code.google.com/web/ajaxcrawling/docs/ getting-started.html – romeroqj

回答

9

這不是scrapy本身可以改變 - 在url中的哈希以下的部分是用於客戶端(scrapy這裏,通常是瀏覽器),而不是服務器的fragment identifier

當您在瀏覽器中獲取頁面時可能發生的事情是該頁面包含一些查看片段標識符的JavaScript並通過AJAX加載一些附加數據並更新頁面。您需要了解瀏覽器的功能,看看您是否可以模擬它 - 像Firebug或Chrome或Safari檢查器這樣的開發人員工具可以輕鬆實現。

例如,如果您導航到http://twitter.com/also,那麼您將被重定向到http://twitter.com/#!/also。這裏瀏覽器加載的實際URL只是http://twitter.com/,但是該頁面然後加載用於生成頁面的數據(http://twitter.com/users/show_for_profile.json?screen_name=also),並且在這種情況下,就是您可以解析自己的JSON數據。您可以在Chrome中使用Network Inspector查看此情況。

+0

可以使用Selenium來執行JavaScript代碼,但是,碎片標識符會從所有請求中剝離。問題依然存在:我如何產生包含片段標識符的請求?我可以將它包含在元字段中,但Scrapy只會加載一個這樣的頁面,因爲它會過濾掉帶有重複URL的請求。 –

0

實際上,當在網頁瀏覽器中輸入該URL時,它只會將散列標籤前面的部分發送到Web服務器。如果內容不同,可能是因爲頁面上有一些JavaScript(基於哈希標記部分的內容) - 在已被加載後更改了頁面的內容(最有可能是加載了XmlHttpRequest額外的內容)。

1

看起來這是不可能的。問題不在於響應,而在請求中,它會對url進行排序。

它可以從Javascript檢索 - 作爲 window.location.hash。從那裏你可以將它發送到服務器,例如使用Ajax ,或者將其編碼並將其 放入URL中,然後通過 傳遞給服務器端。

Can I read the hash portion of the URL on my server-side application (PHP, Ruby, Python, etc.)?

爲什麼你需要這部分如果服務器沒有從瀏覽器收到該被剝離? 如果你正在與亞馬遜合作 - 我還沒有看到這樣的網址的任何問題。

+0

我發現一個案例,其中沒有哈希標籤的URL適用於打折產品的一種過濾器,因此列出較少的產品。 – romeroqj

+0

然後你要麼沒有解決方案,要麼嘗試提出額外的請求。找到製作請求的算法並製作它。 – warvariuc