Проблема со слишком большим количеством перенаправлений в модуле запросов Python - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь сократить список примерно из 150 000 ссылок t.co, и мой код работает по большей части, однако у меня есть куча ссылок t.co, которые все перенаправляют сюда , и дляпо некоторым причинам запросы получают слишком много перенаправлений.

def expand_url(url):
  s = requests.Session()
  try:
     r = s.head(url.rstrip(), allow_redirects=True,verify=False)
     return r.url.rstrip()
  except requests.exceptions.ConnectionError as e:
    print(e)

Я попытался использовать строку s.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36', как предложено в другом потоке.Я также попытался увеличить максимальное перенаправление, но это не помогло.

Вот некоторые ссылки t.co, которые вызывают проблему:

https://tdot co / 5FXvHY1Rbx

https://t dot co / L3Ytnz2916

Есть предложения о том, что делать?

Спасибо

1 Ответ

0 голосов
/ 19 ноября 2018

Установите максимальное время перенаправления, которое вы можете перенести.

http://docs.python -requests.org / ен / ведущий / апи / # requests.Session.max_redirects

s = requests.Session()
s.max_redirects = 3

причина, по которой вы попали в тупик, потому что WH не поддерживает метод head, он продолжает посылать вам 302 Moved Temporarily. Но на самом деле вы перенаправили завершено (с короткого URL на WH). Попробуйте использовать r.history, чтобы увидеть все ответы

import requests

def expand_url(url):
  s = requests.Session()
  #s.allow_redirects = -1
  try:
     r = s.get(url.rstrip(),allow_redirects=3,verify=False)
     print([resp.url for resp in r.history])
     return r.url.rstrip()
  except requests.exceptions.ConnectionError as e:
    print(e)

print(expand_url("https://t<dot>co/5FXvHY1Rbx"))

Также вы можете написать свои собственные max_redirects.

import requests

def expand_url(url,times):
    s = requests.Session()
    times -= 1
    if not times:
        return url
    try:
        r = s.head(url.rstrip(),verify=False)
        location = r.headers.get("location").rstrip()
        if url.find(location) > 0:
            # in case redirect to same page
            return url 
        next_step = expand_url(location,times) if location else url
        return next_step
    except requests.exceptions.ConnectionError as e:
        print(e)

print(expand_url("https://t<dot>co/5FXvHY1Rbx",4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...