2009-06-25 34 views
5

Tôi hiện đang có một tập lệnh nhỏ tải xuống một trang web và trích xuất một số dữ liệu mà tôi quan tâm. Không có gì lạ mắt.HTTPS đăng nhập bằng urllib2

Hiện nay tôi đang tải trang như vậy:

import commands 
command = 'wget --output-document=- --quiet --http-user=USER --http-password=PASSWORD https://www.example.ca/page.aspx' 
status, text = commands.getstatusoutput(command) 

Mặc dù công trình này một cách hoàn hảo, tôi nghĩ rằng nó sẽ làm cho tinh thần để loại bỏ sự phụ thuộc vào wget. Tôi nghĩ rằng nó sẽ là tầm thường để chuyển đổi trên để urllib2, nhưng do đó đến nay tôi đã không thành công. Internet là đầy đủ các ví dụ về urllib2, nhưng tôi không tìm thấy bất kỳ thứ gì phù hợp với nhu cầu xác thực HTTP tên người dùng và mật khẩu đơn giản của tôi với một máy chủ HTTPS.

Trả lời

1

Module requests cung cấp một API hiện đại để HTTP/HTTPS khả năng.

import requests 

url = 'https://www.someserver.com/toplevelurl/somepage.htm' 

res = requests.get(url, auth=('USER', 'PASSWORD')) 

status = res.status_code 
text = res.text 
+0

Trong khi tôi đã có thể ưa thích một cái gì đó trong thư viện chuẩn, điều này có vẻ như là cách rõ ràng để đi. –

6

this nói, nó phải là thẳng về phía trước

[như] miễn là Python địa phương của bạn có hỗ trợ SSL.

Nếu bạn chỉ sử dụng Xác thực cơ bản HTTP, bạn phải đặt trình xử lý khác, như được mô tả here.

Trích dẫn ví dụ có:

import urllib2 

theurl = 'http://www.someserver.com/toplevelurl/somepage.htm' 
username = 'johnny' 
password = 'XXXXXX' 
# a great password 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
# this creates a password manager 
passman.add_password(None, theurl, username, password) 
# because we have put None at the start it will always 
# use this username/password combination for urls 
# for which `theurl` is a super-url 

authhandler = urllib2.HTTPBasicAuthHandler(passman) 
# create the AuthHandler 

opener = urllib2.build_opener(authhandler) 

urllib2.install_opener(opener) 
# All calls to urllib2.urlopen will now use our handler 
# Make sure not to include the protocol in with the URL, or 
# HTTPPasswordMgrWithDefaultRealm will be very confused. 
# You must (of course) use it when fetching the page though. 

pagehandle = urllib2.urlopen(theurl) 
# authentication is now handled automatically for us 

Nếu bạn làm Digest, bạn sẽ phải thiết lập một số tiêu đề bổ sung, nhưng họ đều giống nhau bất kể việc sử dụng SSL. Google cho python + urllib2 + http + thông báo.

Chúc mừng,

+0

Vừa kiểm tra: Làm việc cho tôi. – Boldewyn

+0

Rất tiếc, không nhận được phần xác thực. Tôi sẽ cập nhật câu trả lời của tôi trong một giây. – Boldewyn

+0

Ồ, oh. Có vẻ như bạn sẽ phải thực hiện thêm một số công việc trong urllib2: http://docs.python.org/howto/urllib2.html Về cơ bản, urllib2 thực hiện xác thực cơ bản cũng thông qua tiêu đề. Lấy làm tiếc. – Boldewyn

1

Các tài liệu urllib2 có một ví dụ về làm việc với Basic Authentication:

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

+0

Làm cách nào để biết mà "lĩnh vực" và "uri" để vượt qua để add_password? Tôi đoán rõ ràng là tôi không biết nhiều về HTTP và xác thực. –

+0

Sử dụng urllib2.HTTPPasswordMgrWithDefaultRealm, nó không cần phải biết lĩnh vực. Các lĩnh vực, theo như tôi hiểu, chỉ là một cách của máy chủ để cung cấp một (con người có thể đọc được) tên cho khu vực để đăng nhập vào. Chúc mừng, – Boldewyn

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