Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何取消对URL的排序?_Python_Url_Url Shortener - Fatal编程技术网

Python 如何取消对URL的排序?

Python 如何取消对URL的排序?,python,url,url-shortener,Python,Url,Url Shortener,我想能够采取缩短或非缩短的网址,并返回其未缩短的形式。如何制作一个python程序来实现这一点 补充澄清: 案例1:缩短-->未变形 案例2:未变形-->未变形 e、 g.输入数组中的bit.ly/silly应该是输出数组中的google.com e、 g.输入数组中的google.com应该是输出数组中的google.com,有一个api,可以让您发送JSON或XML请求并返回完整的URL。打开URL,看看它解析为: >>> import urllib2 >>

我想能够采取缩短或非缩短的网址,并返回其未缩短的形式。如何制作一个python程序来实现这一点

补充澄清:

  • 案例1:缩短-->未变形
  • 案例2:未变形-->未变形
e、 g.输入数组中的
bit.ly/silly
应该是输出数组中的
google.com

e、 g.输入数组中的
google.com
应该是输出数组中的
google.com

有一个api,可以让您发送JSON或XML请求并返回完整的URL。

打开URL,看看它解析为:

>>> import urllib2
>>> a = urllib2.urlopen('http://bit.ly/cXEInp')
>>> print a.url
http://www.flickr.com/photos/26432908@N00/346615997/sizes/l/
>>> a = urllib2.urlopen('http://google.com')
>>> print a.url
http://www.google.com/

向URL发送HTTP HEAD请求并查看响应代码。如果代码为30x,请查看
位置
标题以获取未排序的URL。否则,如果代码为20x,则URL不会重定向;您可能还希望以某种方式处理错误代码(4xx和5xx)。例如:

# This is for Py2k.  For Py3k, use http.client and urllib.parse instead, and
# use // instead of / for the division
import httplib
import urlparse

def unshorten_url(url):
    parsed = urlparse.urlparse(url)
    h = httplib.HTTPConnection(parsed.netloc)
    h.request('HEAD', parsed.path)
    response = h.getresponse()
    if response.status/100 == 3 and response.getheader('Location'):
        return response.getheader('Location')
    else:
        return url

使用请求:

import requests

session = requests.Session()  # so connections are recycled
resp = session.head(url, allow_redirects=True)
print(resp.url)

这里是一个src代码,它考虑了几乎所有有用的拐角情况:

  • 设置自定义超时
  • 设置自定义用户代理
  • 检查是否必须使用http或https连接
  • 递归解析输入url并防止在循环中结束
src代码位于github@

欢迎评论

import logging
logging.basicConfig(level=logging.DEBUG)

TIMEOUT = 10
class UnShortenUrl:
    def process(self, url, previous_url=None):
        logging.info('Init url: %s'%url)
        import urlparse
        import httplib
        try:
            parsed = urlparse.urlparse(url)
            if parsed.scheme == 'https':
                h = httplib.HTTPSConnection(parsed.netloc, timeout=TIMEOUT)
            else:
                h = httplib.HTTPConnection(parsed.netloc, timeout=TIMEOUT)
            resource = parsed.path
            if parsed.query != "": 
                resource += "?" + parsed.query
            try:
                h.request('HEAD', 
                          resource, 
                          headers={'User-Agent': 'curl/7.38.0'}
                                   }
                          )
                response = h.getresponse()
            except:
                import traceback
                traceback.print_exec()
                return url

            logging.info('Response status: %d'%response.status)
            if response.status/100 == 3 and response.getheader('Location'):
                red_url = response.getheader('Location')
                logging.info('Red, previous: %s, %s'%(red_url, previous_url))
                if red_url == previous_url:
                    return red_url
                return self.process(red_url, previous_url=url) 
            else:
                return url 
        except:
            import traceback
            traceback.print_exc()
            return None

要取消排序,可以使用请求。这是一个对我有效的简单解决方案

import requests
url = "http://foo.com"

site = requests.get(url)
print(site.url)

如果您使用的是Python 3.5+,则可以使用使这一过程变得非常简单的模块:

from unshortenit import UnshortenIt
unshortener = UnshortenIt()
uri = unshortener.unshorten('https://href.li/?https://example.com')
你可以用


你说的是一个特定的URL缩短服务吗?这个服务是否有一个API,你可以从中检索信息?如果你很忙,你也可以使用这个API,它可以获取整个页面。如果页面不是重定向并且恰好非常大,那么仅仅为了确定它不是重定向就浪费了大量带宽。使用HEAD请求要好得多。@Adam Rosenfeld:对于一个开始python的人来说,这可能是一个合适的辅助项目的答案。我不建议像这样的Google或Yahoo蜘蛛网页找到真正的URL。这样做不是一个好主意。你浪费了很多带宽。仅使用api更好更快,因为@user387049建议使用gnores url查询,这里的更好版本:注意使用上述代码时不会递归取消排序,以防您想要获得实际的url。试穿
http://t.co/hAplNMmSTg
。您需要执行
返回unsorten\u url(response.getheader('Location'))
以实现递归性。可能还需要跟踪集合中以前的url,以防止循环递归。如果我正确理解了您的流,您可能希望对要执行的重定向数量设置上限tolerate@Foon在某些情况下,重定向指向相同的前一个url,为了防止无限循环的陷阱,我在递归调用中传播上一个url,如果我以red_url==previous_url结束,我会停止并返回该url。否则,在正常情况下,在某些迭代中,response.status将不再等于重定向状态,因此,我们返回检索到的url。@AmirKrifa是否处理指向link.bar的link.foo,指向link.foo的link.bar?(我不知道httplib是否有遵循重定向的选项,在这种情况下,这种链接会在调用递归调用之前引发异常)我喜欢这种解决方案,它会自动遵循多个重定向。幸运的是,这只是python 2,为什么在2012年会用python代码编写未授权的打印:(
from unshortenit import UnshortenIt
unshortener = UnshortenIt()
uri = unshortener.unshorten('https://href.li/?https://example.com')
from urllib.request import urlopen
url = "bit.ly/silly"
unshortened_url = urlopen(url).geturl()
print(unshortened_url)
# google.com