from lxml.html import parse
from urllib import urlopen
from contextlib import closing
def follow(url):
"""Follow both true and soft redirects."""
while True:
with closing(urlopen(url)) as stream:
next = parse(stream).xpath("//meta[@http-equiv = 'refresh']/@content")
if next:
url = next[0].split(";")[1].strip().replace("url=", "")
else:
return stream.geturl()
print follow("http://thetechshowdown.com/Redirect4.php")
使用模块
requests
-它默认折叠重定向。在但是页面可以被javascript重定向,所以没有任何模块会遵循这种重定向。在
在浏览器中关闭javascript并转到
http://thetechshowdown.com/Redirect4.php
查看它是否将您重定向到其他页面我检查了这个页面-有javascript重定向和HTML重定向(带有“refresh”参数的标记)。两者都不是服务器发送的正常重定向-因此任何模块都不会遵循此重定向。你必须阅读网页,在代码中找到网址,并与该网址连接。在
这是因为软重定向。
urllib
没有跟踪重定向,因为它无法识别这些重定向。事实上,会发出一个HTTP响应代码200(找到页面),浏览器中的某些副作用会导致重定向发生。在第一页包含HTTP响应代码200,但包含以下内容:
它指示浏览器跟踪链接。第二个资源向另一个资源发出HTTP响应代码301或302(重定向),在那里发生第二个软重定向,这次使用Javascript:
^{pr2}$不幸的是,您将不得不提取URL来手动跟踪。不过,这并不难。代码如下:
我将把错误处理留给您:)还请注意,如果目标页面也包含一个
<meta>
标记,这可能会导致无休止的循环。这不是您的情况,但是您可以添加一些检查来防止这种情况:在n
重定向之后停止,查看页面是否重定向到它自己,无论您认为哪个更好。在您可能需要安装
lxml
库。在来自html的元刷新重定向URL可能类似于以下任何一个:
相对URL:
引号内有引号:
^{pr2}$标记的
content
中的大写字母:小结:
lower()
和两个split()
来获取url部分shelves
将结果的缓存存储在本地文件中(如果有大量的url要测试,则非常有用)。在用法:
返回如下内容:
代码:
相关问题 更多 >
编程相关推荐