2010-02-14 4 views
1

я имею ниже URLURL проблема Перенаправление

http://bit.ly/cDdh1c

При размещении выше URL в браузере и нажать кнопку ввода будет перенаправлять ниже URL http://www.kennystopproducts.info/Top/?hop=arnishad

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

Почему один и тот же 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 
    

Log-файл для справки

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/ 

ответ

1

Ваша проблема в том, что при вызове 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') 
+0

Спасибо, что указал, что.Но это нормально работает. –

1

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

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] 
Смежные вопросы