Scrapy,URL上的哈希标签
我正在进行一个使用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>
这对我的抓取工作影响很大,因为经过几个小时的努力,我才发现有些项目没有被选中是因为长URL提供的HTML和短URL提供的HTML不一样。而且,经过观察,我发现内容在一些关键部分也会有所不同。
有没有办法修改这个行为,让Scrapy保留整个URL呢?
谢谢大家的反馈和建议。
3 个回答
其实,当你在网页浏览器里输入那个网址时,浏览器只会把井号(#)前面的部分发送给网站服务器。如果你看到的内容不一样,可能是因为页面上有一些JavaScript代码,它会根据井号后面的内容,在页面加载完成后再改变页面的内容(很可能是通过一种叫XmlHttpRequest的方式来加载额外的内容)。
看起来这是不可能的。问题不在于响应,而是在请求中,网址被截断了。
你可以通过JavaScript获取这个信息,比如使用
window.location.hash
。然后你可以用Ajax把它发送到服务器,或者把它编码后放到网址里,这样就可以传给服务器了。
我可以在服务器端应用程序(PHP、Ruby、Python等)读取网址的哈希部分吗?
为什么你需要这一部分呢?因为如果服务器没有从浏览器接收到它,这部分就会被去掉。如果你在使用亚马逊,我没有看到这样的网址有什么问题。
这件事不是 scrapy 自己能改变的——在网址中,井号后面的部分是一个叫做 片段标识符 的东西,它是由客户端(在这里是 scrapy,通常是浏览器)使用的,而不是服务器。
当你在浏览器中打开页面时,可能会发生这样的事情:页面里有一些 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 的网络检查工具看到这个过程。