2011-07-07 139 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