Проблема перенаправления URL - PullRequest
1 голос
/ 14 февраля 2010

У меня есть следующий URL

http://bit.ly/cDdh1c

Когда вы поместите вышеупомянутый URL в браузер и нажмете Enter, он будет перенаправлен на следующий URL http://www.kennystopproducts.info/Top/?hop=arnishad

Но где, когда я пытаюсь найти базовый URL (после устранения всех URL-адресов перенаправления) для того же самого выше URL-адреса http://bit.ly/cDdh1c через программу Python (ниже вы можете увидеть код) я получаю следующий URL-адрес http://www.cbtrends.com/ в качестве базового URL. Пожалуйста, смотрите файл журнала ниже

Почему один и тот же URL ведет себя по-разному в браузере и в программе на Python. Что мне следует изменить в программе на Python, чтобы она могла перенаправлять на правильный URL-адрес? Мне интересно, как может происходить это странное поведение .?

Другой URL, для которого я наблюдаю похожее поведение,

  1. http://bit.ly/bEKyOx ====> http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=150413977509 (через браузер)
  2. http://www.ebay.com (через питона программа)

          maxattempts = 5
          turl = url
          while (maxattempts  >  0) :               
            host,path = urlparse.urlsplit(turl)[1:3]
            if  len(host.strip()) == 0 :
               return None
    
            try: 
                    connection = httplib.HTTPConnection(host,timeout=10)
                    connection.request("HEAD", path)
                    resp = connection.getresponse()                      
            except:                         
                     return None                     
            maxattempts = maxattempts - 1
            if (resp.status >= 300) and (resp.status <= 399):
                self.logger.debug("The present %s is a redirection one" %turl)
                turl = resp.getheader('location')
            elif (resp.status >= 200) and (resp.status <= 299) :
                self.logger.debug("The present url %s is a proper one" %turl)
                return turl
            else :
                #some problem with this url
                return None               
          return None
    

Журнал для вашей справки

2010-02-14 10:29:43,260 - paypallistener.views.MrCrawler - INFO - Bringing down the base URL
2010-02-14 10:29:43,261 - paypallistener.views.MrCrawler - DEBUG - what is the url=http://bit.ly/cDdh1c
2010-02-14 10:29:43,994 - paypallistener.views.MrCrawler - DEBUG - The present http://bit.ly/cDdh1c is a redirection one
2010-02-14 10:29:43,995 - paypallistener.views.MrCrawler - DEBUG - what is the url=http://www.cbtrends.com/get-product.html?productid=reFfJcmpgGt95hoiavbXUAYIMP7OfiQn0qBA8BC7%252BV8%253D&affid=arnishad&tid=arnishad&utm_source=twitterfeed&utm_medium=twitter
2010-02-14 10:29:44,606 - paypallistener.views.MrCrawler - DEBUG - The present http://www.cbtrends.com/get-product.html?productid=reFfJcmpgGt95hoiavbXUAYIMP7OfiQn0qBA8BC7%252BV8%253D&affid=arnishad&tid=arnishad&utm_source=twitterfeed&utm_medium=twitter is a redirection one
2010-02-14 10:29:44,607 - paypallistener.views.MrCrawler - DEBUG - what is the url=http://www.cbtrends.com/
2010-02-14 10:29:45,547 - paypallistener.views.MrCrawler - DEBUG - The present url http://www.cbtrends.com/ is a proper one
http://www.cbtrends.com/

Ответы [ 2 ]

1 голос
/ 14 февраля 2010

Ваша проблема исходит из этой строки:

host,path = urlparse.urlsplit(turl)[1:3]

Вы пропускаете строку запроса. Таким образом, в примере журнала, который вы предоставляете, второй HEAD запрос, который вы сделаете, будет на http://www.cbtrends.com/get-product.html без параметров GET. Откройте этот URL в вашем браузере, и вы увидите, что он перенаправляет на http://www.cbtrends.com/.

Вы должны рассчитать путь, используя все элементы кортежа, возвращаемые urlsplit.

parts = urlparse.urlsplit(turl)
host = parts[1]
path = "%s?%s#%s" % parts[2:5]
1 голос
/ 14 февраля 2010

Ваша проблема в том, что при вызове urlsplit переменная пути содержит только путь и пропускает запрос.

Итак, вместо этого попробуйте:

import httplib
import urlparse

def getUrl(url):
    maxattempts = 10
    turl = url
    while (maxattempts  >  0) :               
        host,path,query = urlparse.urlsplit(turl)[1:4]
        if  len(host.strip()) == 0 :
            return None
        try: 
            connection = httplib.HTTPConnection(host,timeout=10)
            connection.request("GET", path+'?'+query)
            resp = connection.getresponse()
        except:                         
            return None                     
        maxattempts = maxattempts - 1
        if (resp.status >= 300) and (resp.status <= 399):
            turl = resp.getheader('location')
        elif (resp.status >= 200) and (resp.status <= 299) :
            return turl
        else :
            #some problem with this url
            return None               
    return None
print getUrl('http://bit.ly/cDdh1c')
...