2012-11-20 5 views
8

"www.yahoo.com/thispage"로 이동하면 yahoo에서/thispage를/thatpage로 리디렉션하는 필터를 설정했습니다. 그래서 누군가가/thispage에 갈 때마다 그는/thatpage에 착륙 할 것입니다.파이썬 요청을 사용하여 사이트를 검사 할 때 사이트가 다른 페이지로 리디렉션되는 경우 알 수 있습니까?

httplib/requests/urllib을 사용하는 경우 리디렉션이 있음을 알 수 있습니까? 어떤 오류 페이지가 있습니까? 일부 사이트는 페이지를 찾을 수 없을 때마다/errorpage로 사용자를 리디렉션합니다.

+2

해결하려는 문제는 무엇입니까? 코드가 어떻게 올바르게 작동하지 않습니까? 단순히 오류 모드에 대해 알고 싶다면이 동작을 직접 테스트하십시오. – Marcin

+1

확인 http://stackoverflow.com/questions/554446/how-do-i-prevent-pythons-urllib2-from-following-a-redirect – OneOfOne

+0

@Marcin 나는 거대한 목록 (1k +)을 가지고 있는지 테스트 할 URL이 있습니다. 있습니다. 나는 수동으로 테스트하기 위해 40-50 개를 무작위로 선택했다. 페이지를 찾을 수 없을 때마다 오류 페이지로 리다이렉트되고있다. 또한 URL 패턴이 변경 되었기 때문에 많은 URL이 리디렉션 된 것을 볼 수 있습니다. 이름이 다르게 작성된 동일한 이름입니다. – iCodeLikeImDrunk

답변

13

requests을 사용하면 응답 개체의 .history 특성에있는 모든 리디렉션 목록을 가져옵니다. 파이썬리스트를 반환합니다. 자세한 내용은 documentation을 참조하십시오.

1

리디렉션을 수행하는 방법에 따라 다릅니다. "올바른"방법은 리디렉션 된 HTTP 상태 코드 (301/302/303)를 반환하는 것입니다. "잘못된"방법은 새로 고침 메타 태그를 HTML에 배치하는 것입니다.

전자 메일을 처리하는 경우 requests이 투명하게 처리합니다. 정상적인 오류 페이지 리디렉션에는 여전히 오류 상태 코드 (예 : 404)가 있으며 이는 response.status_code으로 확인할 수 있습니다. 다음 리디렉션 요청을 방지하기 위해

9

사용 :

은 참으로 리디렉션에있는 경우

r = requests.get('http://www.yahoo.com/thispage', allow_redirects=False)

, 당신이 r.headers에서 [ '위치'] 리디렉션 대상 위치를 확인할 수 있습니다.

1

허용되는 대답은 올바른 첫 번째 옵션이지만 사이트가 메타 태그로 리디렉션하는 경우 리디렉션되는 경우 정식 링크가 지정되는 경우도 있습니다. 이 예에서는 리디렉션하는 URL 인 위키 백과에서 http://en.wikipedia.org/wiki/Google_Inc_Class_A을 요청하겠습니다.

>> request = requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A') 

나는 확인 :

>> request.history 
[] 

대안을 시도하고 잘하면로 리디렉션되고있는 무슨이 있어야 정식 URL을 당겨하는 것입니다. (나뿐만 아니라 여기 BeautifulSoup로 사용하고 있습니다)이 특정 경우에 리디렉션 URL을 일치 않습니다

>> soup = BeautifulSoup(request._content) 
>> canonical = soup.find('link', {'rel': 'canonical'}) 
>> canonical['href'] 
'http://en.wikipedia.org/wiki/Google' 

. 그래서 분명히하기 위해, 이것은 추악한 두 번째 옵션이지만 다른 모든 것이 실패 할 경우 시도해 볼 가치가 있습니다.

+0

앞으로의 독자를 위해 :이 예제를 살펴보고 히스토리가 정확하게 채워 졌는지 확인한다 :'requests.get ('http://en.wikipedia.org/wiki/Google_Inc_Class_A', allow_redirects = True)'. "allow_redirects"매개 변수 또는 새 버전의 요청 패키지 때문인지는 알 수 없습니다. – boh