如何使用python重定向后获取url

时间:2015-12-31 06:17:20

标签: python python-2.7

我正在开发一个网络爬虫项目,现在我遇到了一个问题。

如何在重定向页面后获取URL?

我尝试了请求,并返回值<Response [200]>

当我抓取一个文件的下载链接时,例如这个http://filehippo.com/download_firefox/download/f28dbaab19e38f3239d69ed7c350ac5d/,它会打开一个页面,在那里编写程序正在下载但几秒后程序开始下载...我想要的网址是下载

提前感谢..

3 个答案:

答案 0 :(得分:1)

只有在浏览器上运行某些代码

后才会启动下载

您的示例网址似乎不是使用HTTP重定向重定向,一旦浏览器找到该页面并执行了某些客户端代码,它似乎就会启动下载。您的URL不是HTTP重定向。

要了解我所说的在浏览器的“网络”标签中打开开发控制台(FireBug,Chrome控制台等)并刷新页面,请查看浏览器下载实际文件之前发生的所有情况。在网络选项卡中,您也可以获取该文件的URL。

然而,抓取可能没有用,因为URL可能会被“腌制”一个令牌过期或仅对抓取它的客户端有效,基本上使该下载URL不可共享。

浏览器自动化

您可以使用某些浏览器自动化(如Selenium或PhantomJS)访问该URL,通过查看网络日志并获取所需的URL结构(例如,对于此文件,您正在寻找.exe URL)

底线是:可以获取该网址,方法是使用浏览器自动化工具并捕获其所有网络数据,但安全架构会使该网址无法共享。

实际重定向的网址

但是,我会给你一个重定向的示例,向您展示如何使用Python requests library

实际重定向HTTP的URL

您的网址未重定向

>>> import requests
>>> response = requests.get('http://filehippo.com/download_firefox/download/f28dbaab19e38f3239d69ed7c350ac5d/')
>>> response.history
[]  # There's no redirect there
>>> response.status_code
200

让我们尝试使用重定向的测试网址

>>> response = requests.get('http://httpbin.org/redirect/3')
>>> response.history
[<Response [302]>, <Response [302]>, <Response [302]>]
>>> for r in response.history: print r.status_code, r.url
... 
302 http://httpbin.org/redirect/3
302 http://httpbin.org/relative-redirect/2
302 http://httpbin.org/relative-redirect/1
>>> 

答案 1 :(得分:1)

直接下载文件的链接位于元标记中:

<meta http-equiv="Refresh" content="3; url=/download/file/0d48d61bb8c894b7388e83a3c873cde48f0b2cc330872f5ce77a3b38b24a4942/"/>

您需要从文件中读取该链接,然后请求它。完成后,它会引导您进入实际的文件下载链接:

HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://fs41.filehippo.com/9452/f9851528b9974e08bf9fa217a7daa049/Firefox Setup 43.0.3.exe [following]

对于请求;它将自动为您处理此重定向;最后的结果是你可以开始下载文件。

答案 2 :(得分:0)

使用self.request.url 要么 获取当前网址

function mouseover() {
//this will make all the circle fade out
d3.selectAll("circle").style("opacity", 0.2);
//this will make our circle opacity 1
d3.select(this).select("circle").style("opacity", 1)

d3.select(this).select("circle").transition().style("stroke-width","9");
}