2009-10-31 11 views
22

Tôi đang cố trích xuất tiêu đề phản hồi của yêu cầu URL. Khi tôi sử dụng firebug để phân tích sản lượng đáp ứng được yêu cầu URL, nó sẽ trả về:Python urllib2 Tiêu đề phản hồi

Content-Type text/html 

Tuy nhiên khi tôi sử dụng mã python:

urllib2.urlopen(URL).info() 

kết quả lợi nhuận đầu ra:

Content-Type: video/x-flv 

Tôi mới dùng python và lập trình web nói chung; bất kỳ thông tin chi tiết hữu ích nào được đánh giá cao. Ngoài ra, nếu cần thêm thông tin, vui lòng cho tôi biết.

Cảm ơn trước vì đã đọc bài này

+0

Điều này có vẻ như một bản sao của http://stackoverflow.com/questions/843392/python-get-http-headers-from-urllib-call –

Trả lời

2

khác biệt đặc biệt này có thể được giải thích bởi tiêu đề khác nhau (có thể những người thân của các loại chấp nhận) được gửi đi bởi hai yêu cầu - bạn có thể kiểm tra điều đó ...? Hoặc, nếu Javascript đang chạy trong Firefox (mà tôi giả sử bạn đang sử dụng khi bạn đang chạy firebug?) - vì nó chắc chắn không chạy trong trường hợp Python - "tất cả các cược được tắt", như họ nói ;-) .

+0

hmmm, tôi không chắc chắn sẽ có hai tiêu đề khác nhau và cách tôi sẽ có thể phân biệt được cả hai. Tôi khá chắc chắn javascript đang chạy trong firefox ... Điều gì sẽ là cần thiết cho tôi để làm trong python sau đó? – looter

+0

@looter, không có cách trực tiếp nào để thực thi Javascript bằng Python - nếu Javascript đóng vai trò quan trọng trong việc xác định nội dung cuối cùng của trang, thay vào đó, trình tự thực hiện đặt cược thực sự tốt nhất của bạn, ví dụ: thông qua SeleniumRC. –

+0

Tôi không chắc liệu Javascript có đang xử lý các yêu cầu hay không, bởi vì khi tôi sử dụng giám sát mạng trong firebug, tiêu đề phản hồi cũng có thể xem được trong chế độ xem HTML. Giống như tôi đã đề cập trong bài viết của tôi, tôi thực sự mới để python và lập trình web/scripting vì vậy một số điều này là đi qua đầu của tôi, tôi không chắc chắn nếu tôi là mô tả đủ. Cảm ơn vì sự giúp đỡ của bạn. – looter

5

Content-Type text/html

Thực sự, như vậy, nếu không có sự thư đại tràng?

Nếu có, điều đó có thể giải thích: đó là tiêu đề không hợp lệ, do đó, nó bị bỏ qua, do đó, urllib đoán loại nội dung thay vì bằng cách xem tên tệp. Nếu URL xảy ra có ‘.flv’ ở cuối, nó sẽ đoán loại phải là video/x-flv.

1

Hãy nhớ rằng máy chủ web có thể trả về các kết quả khác nhau cho cùng một URL dựa trên sự khác biệt trong yêu cầu. Ví dụ, thương lượng kiểu nội dung: người yêu cầu có thể chỉ định danh sách các kiểu nội dung mà nó sẽ chấp nhận và máy chủ có thể trả về các kết quả khác nhau để cố gắng đáp ứng các nhu cầu khác nhau.

Ngoài ra, bạn có thể gặp trang lỗi cho một trong các yêu cầu của mình, ví dụ: vì trang không đúng định dạng hoặc bạn chưa đặt cookie xác thực chính xác, v.v. Hãy xem chính phản hồi để xem nội dung nào bạn đang lấy.

35

Hãy thử yêu cầu bằng Firefox. Bạn có thể xem tiêu đề yêu cầu trong Firebug, vì vậy thêm chúng vào đối tượng yêu cầu của bạn:

import urllib2 

request = urllib2.Request('http://your.tld/...') 
request.add_header('User-Agent', 'some fake agent string') 
request.add_header('Referer', 'fake referrer') 
... 
response = urllib2.urlopen(request) 
# check content type: 
print response.info().getheader('Content-Type') 

Ngoài ra còn có HTTPCookieProcessor mà có thể làm cho nó tốt hơn, nhưng tôi không nghĩ rằng bạn sẽ cần nó trong hầu hết các trường hợp. Hãy nhìn vào tài liệu của python:

http://docs.python.org/library/urllib2.html

+3

cho Python 3: 'response.info() [" content-type "]' –

+0

Hoàn toàn không thể cho một trang web kiểm tra xem yêu cầu có liên kết giả mạo hay không? Tôi không may mắn với những gì tôi cố gắng, luôn có lỗi "Người giới thiệu không hợp lệ, sẽ không tải xy" ... – Nearoo

+0

Ngoài ra, nếu thông tin() không hiển thị hàng "Người giới thiệu": Tôi có thể kết luận rằng " giả mạo "không hoạt động? – Nearoo

0

Theo http://docs.python.org/library/urllib2.html chỉ có get_header() phương pháp và không có gì về getheader.

Hỏi bởi vì mã của bạn hoạt động tốt cho

response.info().getheader('Set cookie') 

nhưng một khi tôi thực hiện

response.info().get_header('Set cookie') 

tôi nhận được:

Traceback (most recent call last): 
    File "baza.py", line 11, in <module> 
    cookie = response.info().get_header('Set-Cookie') 
AttributeError: HTTPMessage instance has no attribute 'get_header' 

chỉnh sửa: Hơn nữa
response.headers.get('Set-Cookie') hoạt động tốt cũng chứ không phải đàn ông cập ở trong doc urlib2 ....

+0

get_header() là dành cho lớp urllib2.Request. Lớp đáp ứng sử dụng getheader() thay vào đó, đó là một sự không phù hợp không may. –

-1

nhập khẩu urllib.request

fhand = urllib.request.urlopen ('http://data.pr4e.org/intro-short.txt')

in (fhand.info())

+0

Chào mừng bạn đến với SO. Vui lòng đọc [cách trả lời] này (http://stackoverflow.com/help/how-to-answer) để cung cấp câu trả lời có chất lượng. – thewaywewere