如何弄清楚网址重定向过程中究竟发生了什么?

时间:2013-11-26 23:44:00

标签: python http url redirect curl

我正在尝试编写一个Python脚本来抓取攀岩排名网站,该网站正在使用重定向和框架的组合,这会混淆我在访问URL上的数据时所做的每一次尝试。我尝试了一些不同的爬虫脚本,以及命令行上的curl,并且它们都不会获得任何东西而不是空文档。

作为参考,我尝试访问的URL类型的示例如下:

http://www.8a.nu/Scorecard/AscentList.aspx?UserId=1476&AscentType=0&AscentClass=0&AscentListTimeInterval=1&AscentListViewType=0&GID=ea0fb3b90e4b0b655580384e07974b38

哪个重定向到此网址:

http://www.8a.nu/?IncPage=http%3A//www.8a.nu/Scorecard/AscentList.aspx%3FUserId%3D1476%26AscentType%3D0%26AscentClass%3D0%26AscentListTimeInterval%3D1%26AscentListViewType%3D0%26GID%3Dea0fb3b90e4b0b655580384e07974b38

这本身就是一个包含多个框架的页面。令人困惑的是,如果您尝试单独查看框架,作者会再次使用javascript重定向到主框架。

似乎Web服务器拒绝为帧的内容提供任何数据,除非它实际上包含在该帧中。这使得以编程方式访问帧的内容非常困难。关于如何获得这个框架的内容的建议将非常感激。在更深层次,更概念化的层面上,当网站不在框架中时,网站如何知道拒绝提供文档?

3 个答案:

答案 0 :(得分:0)

你之所以没有得到curl的回应(即零内容长度),是因为他们很可能有一种机制来拒绝来自看似僵尸/蜘蛛的请求。

他们会根据User-Agent标题以及Referer标题执行此操作。

您可以通过指定这些以及请求来轻松规避这一点:

wget --header="User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0" --referer="http://www.8a.nu/?IncPage=http%3A//www.8a.nu/Scorecard/AscentList.aspx%3FUserId%3D1476%26AscentType%3D0%26AscentClass%3D0%26AscentListTimeInterval%3D1%26AscentListViewType%3D0%26GID%3Dea0fb3b90e4b0b655580384e07974b38" "http://www.8a.nu/Scorecard/AscentList.aspx?UserId=1476&AscentType=0&AscentClass=0&AscentListTimeInterval=1&AscentListViewType=0&GID=ea0fb3b90e4b0b655580384e07974b38"

请注意--header选项添加User-Agent标头和--referer选项以添加Referer。此示例使用wget,但您可以轻松使用其他方法,只需设置这两个标题。

由于网站使用Javascript进行重定向(而不是301或302响应代码),因此您无需在重定向后自动担心代码,并且您应该能够以编程方式获取内容。

如果站点拒绝具有旧ID的请求,您可能需要首先以编程方式加载外部页面并存储基于会话的ID以用于将来的请求。

编辑:我刚看了http://www.8a.nu/js/commonScripts.js,他们正在检测该页面是否未使用此javascript文件加载到iframe中。

答案 1 :(得分:0)

也许你需要使用无头浏览器来解决这个问题。

无头浏览器的简要说明是here

据我所知,有三种方法可以实现无头浏览器,即:

  • qtwebkit :这是example
  • selenium :这是example
  • phantomjs :这是site。它的文档非常清晰易用。

这三个人可以像网页浏览器一样捕获网页,并节省大量时间和代码来处理网站导致的蜘蛛不能抓取网站爬行的不同问题。

我建议你 phantomjs 。它快速且易于使用。 Here是关于集成python和phantomjs的问题。

提示:使用 phantomjs 时,最好使用Squid来避免某些http请求,以便加快处理速度。

答案 2 :(得分:0)

昨天我做的确切。我有4,000个网站想要捕获。没有鱿鱼,我可以在2.5秒(6个线程)中获取每个鱿鱼的截图。用鱿鱼,我需要7.8秒。如果没有Squid,它只能在4,000个网站中失败3次。使用Squid,它失败了179次。

<强>结论: 当您有大量类似的页面可供访问时,Squid非常有用。但是当你拥有4,000个完全不同的网站时,这并不是那么好。在这种情况下请不要使用它。