2012-11-20 34 views
8

Ý tôi là, nếu tôi truy cập "www.yahoo.com/thispage" và yahoo đã thiết lập bộ lọc để chuyển hướng/trang này đến/trang đó. Vì vậy, bất cứ khi nào ai đó truy cập vào/thispage, anh ấy sẽ truy cập vào/trang đó.Khi tôi sử dụng các yêu cầu python để kiểm tra một trang web, nếu trang web chuyển hướng tôi đến một trang khác, tôi có biết không?

Nếu tôi sử dụng httplib/requests/urllib, nó sẽ biết rằng có một chuyển hướng? Trang lỗi nào? Một số trang web chuyển hướng người dùng đến/errorpage bất cứ khi nào trang không thể tìm thấy.

+2

Vấn đề bạn đang cố giải quyết là gì? Làm thế nào là mã của bạn không làm điều đúng? Nếu bạn chỉ muốn biết về các chế độ lỗi, hãy tự mình kiểm tra hành vi này. – Marcin

+1

Kiểm tra http://stackoverflow.com/questions/554446/how-do-i-prevent-pythons-urllib2-from-following-a-redirect – OneOfOne

+0

@Marcin Tôi có một danh sách lớn (1k +) url để kiểm tra xem họ có có hay không. Tôi chọn ngẫu nhiên 40-50 trong số chúng để kiểm tra thủ công, tôi thấy rằng một số được chuyển hướng đến một trang lỗi bất cứ khi nào một trang không thể tìm thấy. Ngoài ra tôi thấy nhiều url được chuyển hướng cũng bởi vì mẫu url đã thay đổi, cùng một tên chỉ được viết khác nhau. – iCodeLikeImDrunk

Trả lời

13

Với requests, bạn sẽ có danh sách bất kỳ chuyển hướng nào trong thuộc tính .history của đối tượng phản hồi. Nó trả về một danh sách Python. Xem documentation để biết thêm.

1

Điều đó tùy thuộc vào cách họ đang thực hiện chuyển hướng. Cách "đúng" là trả lại mã trạng thái HTTP được chuyển hướng (301/302/303). Cách "sai" là đặt thẻ meta làm mới trong HTML.

Nếu chúng thực hiện trước đây, requests sẽ xử lý rõ ràng. Lưu ý rằng mọi chuyển hướng trang lỗi sane sẽ vẫn có mã trạng thái lỗi (ví dụ: 404) mà bạn có thể kiểm tra là response.status_code.

9

Để ngăn chặn yêu cầu từ đổi hướng sau đây sử dụng:

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

Nếu đó là trong thực sự là một chuyển hướng, bạn có thể kiểm tra vị trí mục tiêu chuyển hướng trong r.headers [ 'vị trí'].

1

Câu trả lời được chấp nhận là tùy chọn đầu tiên chính xác, nhưng trong một số trường hợp nếu trang web chuyển hướng bằng thẻ meta, chúng cũng có liên kết chuẩn được chỉ định khi chúng chuyển hướng. Trong ví dụ này, tôi thử yêu cầu http://en.wikipedia.org/wiki/Google_Inc_Class_A từ wikipedia, đó là url chuyển hướng.

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

tôi kiểm tra và:

>> request.history 
[] 

Một cách khác là để thử và kéo url kinh điển mà hy vọng sẽ có những gì bạn đang được chuyển hướng đến. (Lưu ý tôi đang sử dụng BeautifulSoup tại đây)

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

Điều gì khớp với url bạn được chuyển hướng đến trong trường hợp cụ thể này. Vì vậy, để được rõ ràng, đây là một lựa chọn thứ hai xấu xí nhưng giá trị cố gắng nếu tất cả đều thất bại.

+0

Đối với người đọc trong tương lai: Tôi vừa kiểm tra ví dụ này và lịch sử được điền chính xác: 'requests.get ('http://en.wikipedia.org/wiki/Google_Inc_Class_A', allow_redirects = True)'. Tôi không biết liệu đó có phải là do tham số "allow_redirects" hay gói phiên bản yêu cầu mới hay không. – boh

Các vấn đề liên quan