Как получить запросы «получить», чтобы следовать всем перенаправлениям - PullRequest
0 голосов
/ 01 мая 2018

Я пишу скрипт, чтобы выяснить, к каким полным URL приводит большое количество сокращенных URL. Я использую модуль запросов, чтобы следить за перенаправлениями и получать URL-адрес, на который в итоге попадет URL-адрес в браузере. Это работает почти для всех средств сокращения ссылок, но не работает для URL-адресов из disq.us по причинам, которые я не могу понять (т. Е. Для URL-адресов disq.us я получаю тот же URL-адрес, который я ввожу, тогда как при вводе его в браузере я получаю перенаправление)

Ниже приведен фрагмент, который корректно разрешает битовую ссылку, но с ошибкой с диском. Я запускаю его с Python 3.6.4 и версией 2.18.4 модуля запросов. SO не позволяет мне включать сокращенные URL в вопрос, поэтому я оставлю их в комментарии.

import requests

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'

url1 = "SOME BITLY URL"
url2 = "SOME DISQ.US URL"

for url in [url1, url2]:
    s = requests.Session()
    s.headers['User-Agent'] = user_agent
    r = s.get(url, allow_redirects=True, timeout=10)
    print(r.url)

1 Ответ

0 голосов
/ 01 мая 2018

Ваш первый URL 404 для меня. Интересно, что я просто попробовал это со вторым URL, и это сработало, но я использовал другой пользовательский агент. Затем я попробовал это с вашим пользовательским агентом, и он не перенаправляет.

Это говорит о том, что веб-сервер делает что-то странное в ответ на эту строку пользовательского агента, и проблема не в requests.

>>> import requests
>>> user_agent = 'foo'
>>> url = 'THE_DISCUS_URL'
>>> s = requests.Session()
>>> s.headers['User-Agent'] = user_agent
>>> r = s.get(url, allow_redirects=True, timeout=10)
>>> r.url
'https://www.elsevier.com/connect/could-dissolvable-microneedles-replace-injected-vaccines'

против

>>> import requests
>>> 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'
>>> url = 'THE_DISCUS_URL'
>>> s = requests.Session()
>>> s.headers['User-Agent'] = user_agent
>>> r = s.get(url, allow_redirects=True, timeout=10)
>>> r.url
'THE_DISCUS_URL'

Мне стало любопытно, поэтому я исследовал немного больше. Фактическим содержанием ответа является тег noscript со ссылкой и некоторый javascript, который выполняет перенаправление.

Вероятно, здесь происходит то, что, если Discus видит реального агента пользователя веб-браузера, он пытается перенаправить его через javascript (и, вероятно, выполняет кучу отслеживания в процессе). С другой стороны, если пользовательский агент не знаком, сайт предполагает, что посетитель является скриптом, который, вероятно, не может выполнять JavaScript, и просто перенаправляет.

...