Hướng dẫn python code to download file from url with authentication - mã python để tải xuống tệp từ url với xác thực

11

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi có một tập lệnh Python 2.6 tải xuống một tệp từ một máy chủ web. Tôi muốn tập lệnh này truyền tên người dùng và mật khẩu (để xác thực trước khi tìm nạp tệp) và tôi sẽ truyền chúng như một phần của URL như sau:

import urllib2
response = urllib2.urlopen("http://'user1':'password'@server_name/file")

Tuy nhiên, tôi đang gặp lỗi cú pháp trong trường hợp này. Đây có phải là cách chính xác để đi về nó? Tôi khá mới đối với Python và mã hóa nói chung. Ai có thể giúp tôi không? Cảm ơn!

hỏi ngày 13 tháng 2 năm 2016 lúc 4:15Feb 13, 2016 at 4:15

Hướng dẫn python code to download file from url with authentication - mã python để tải xuống tệp từ url với xác thực

2

Nếu bạn có thể sử dụng thư viện yêu cầu, điều đó thật dễ dàng. Tôi rất khuyên bạn nên sử dụng nó nếu có thể:

import requests

url = 'http://somewebsite.org'
user, password = 'bob', 'I love cats'
resp = requests.get(url, auth=(user, password))

Đã trả lời ngày 13 tháng 2 năm 2016 lúc 5:36Feb 13, 2016 at 5:36

Hướng dẫn python code to download file from url with authentication - mã python để tải xuống tệp từ url với xác thực

willnxwillnxwillnx

1.2431 huy hiệu vàng9 Huy hiệu bạc14 Huy hiệu đồng1 gold badge9 silver badges14 bronze badges

1

Tôi cho rằng bạn đang cố gắng vượt qua một xác thực cơ bản. Trong trường hợp này, bạn có thể xử lý nó theo cách này:

import urllib2

username = 'user1'
password = '123456'

#This should be the base url you wanted to access.
baseurl = 'http://server_name.com'

#Create a password manager
manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
manager.add_password(None, baseurl, username, password)

#Create an authentication handler using the password manager
auth = urllib2.HTTPBasicAuthHandler(manager)

#Create an opener that will replace the default urlopen method on further calls
opener = urllib2.build_opener(auth)
urllib2.install_opener(opener)

#Here you should access the full url you wanted to open
response = urllib2.urlopen(baseurl + "/file")

Đã trả lời ngày 13 tháng 2 năm 2016 lúc 4:45Feb 13, 2016 at 4:45

Hướng dẫn python code to download file from url with authentication - mã python để tải xuống tệp từ url với xác thực

2

Sử dụng thư viện yêu cầu và chỉ cần đặt thông tin đăng nhập trong tệp .Netrc của bạn.

Thư viện sẽ tải chúng từ đó và bạn sẽ có thể cam kết mã cho SCM mà bạn lựa chọn mà không phải lo lắng về bảo mật.

Đã trả lời ngày 13 tháng 2 năm 2016 lúc 9:54Feb 13, 2016 at 9:54

Sorinsorinsorin

153K170 Huy hiệu vàng515 Huy hiệu bạc767 Huy hiệu đồng170 gold badges515 silver badges767 bronze badges

1

Trong bài đăng này, chúng tôi sẽ tập trung vào cách viết mã của riêng mình để tải xuống dữ liệu từ thư mục HTTPS với các thư mục và tệp dữ liệu. Chúng tôi sẽ sử dụng một số trang web của NASA làm ví dụ, nhưng quy trình có thể được áp dụng nói chung.

Đây là các URL chúng tôi muốn tìm nạp dữ liệu từ:

baseurls = ['https://gpm1.gesdisc.eosdis.nasa.gov/data/GPM_L3/GPM_3IMERGM.06/',
    'https://e4ftl01.cr.usgs.gov/MOLA/MYD13C1.006/', 
    'https://e4ftl01.cr.usgs.gov/MOLT/MOD13C1.006/',
    'https://n5eil01u.ecs.nsidc.org/SMAP/SPL3SMP.007/']

Bước 1: Tạo tệp .Netrc để lưu trữ mật khẩu của bạn

Chúng tôi có thể tự động hóa quy trình đăng nhập bằng tệp .Netrc, cho phép sử dụng các ứng dụng dòng lệnh như Curl hoặc WGET. Trong Python, thư viện ‘Yêu cầu cũng sẽ tự động đọc các thông tin đăng nhập đó.In Python, the ‘requests’ library will also read those credentials automatically.

Trong ví dụ của chúng tôi, chúng tôi cần thêm tên người dùng và mật khẩu cho máy chủ ‘urs.earthdata.nasa.gov, mà chúng tôi đã nhận được từ eosdis.

Để làm điều này, hãy nhập phần sau vào vỏ:

cd ~
touch .netrc
echo "machine urs.earthdata.nasa.gov login username_goes_here password password_goes_here" > .netrc
chmod 0600 .netrc

Thư viện yêu cầu khá mạnh mẽ và có thể xử lý các loại xác thực khác nhau. Xem ví dụ như tài liệu tham khảo này.

Bước 2: Liệt kê tất cả các liên kết từ thư mục web

Chúng tôi sẽ sử dụng các yêu cầu tải xuống dữ liệu và phân tích cú pháp HTML với Stringio và Etree. Đảm bảo bao gồm các thư viện đó:

import requests
from lxml import etree
from io import StringIO

Bây giờ, để tạo một danh sách các liên kết có trong URL, chúng ta có thể sử dụng chức năng sau:

def getLinks(url):
    print("Getting links from: " + url)
    page = session.get(url)
    html = page.content.decode("utf-8")
    tree = etree.parse(StringIO(html), parser=etree.HTMLParser())
    refs = tree.xpath("//a")    
    return list(set([link.get('href', '') for link in refs]))

Hàm này tải xuống một trang web và phân tích nội dung HTML để lọc các liên kết có trong đó.

Bước 3: Phân loại liên kết thành các thư mục và tệp dữ liệu

Các trang chúng tôi đang loại bỏ sẽ chứa các thư mục - thường là mỗi trang cho một ngày khác nhau. Bằng cách xác định và xử lý các ngày này, chúng tôi cũng có thể lọc một khoảng thời gian cụ thể, nhưng trong ví dụ này, chúng tôi đang tìm nạp toàn bộ danh mục.

def isDate(l):
    isDate = False
    for fmt,substr in [('%Y.%m.%d',l[0:10]), ('%Y',l[0:4])]:
    try:
        d = datetime.strptime(substr,fmt).date()
        return True
    except ValueError:
        isDate = False
    return False

def isHDFFile(l):
    ext = ['.HDF5', '.H5', '.HDF']
    return any([l.lower().endswith(e.lower()) for e in ext])

Bước 4: Vòng lặp qua các thư mục con và tải xuống tất cả các tệp dữ liệu mới

Tất cả những gì còn lại bây giờ sẽ đi vào tất cả các thư mục con và nhận các tệp dữ liệu. Trong ví dụ của chúng tôi, chúng tôi sẽ chỉ đi xuống một cấp, nhưng mã có thể dễ dàng sửa đổi để đối phó với nhiều thư mục con hơn.

Cũng nên tạo một phiên tải xuống liên tục, đặc biệt nếu chúng tôi đang tải xuống một số lượng lớn các tệp. Có thể được thực hiện với một dòng mã duy nhất

session = requests.Session()

Vì có lẽ chúng tôi sẽ chạy tập lệnh của chúng tôi khá thường xuyên và các tệp chúng tôi đang tìm nạp hiếm khi được cập nhật trên các máy chủ, chúng tôi muốn tránh ghi đè lên các tệp hiện có, để có hiệu quả. Theo cách này, sẽ dễ dàng hơn không chỉ để lấy dữ liệu từ toàn bộ thư mục web, mà còn giữ nó đồng bộ.get data from entire web directory, but also keep it in sync.

for url in baseurls:
    session = requests.Session()
    basedir = pathlib.PurePath(url).name 
    links = getLinks(url)
    ldates = [l for l in links if isDate(l)]
    for d in ldates:
        links_date = getLinks(url + d)
        l_hdf = [l for l in links_date if isHDFFile(l)]
        for f in l_hdf:
            folder = basedir + '/' + d
            filepath = folder + f
            if pathlib.Path(filepath).is_file():
                print ("File exists: " + filepath )
            else:
                print("File doesn't exist: " + filepath )
                print("Downloading... " + url + d + f)
                f = session.get(url + d + f)
                time.sleep(1)
                pathlib.Path(folder).mkdir(parents=True, exist_ok=True)
                open(filepath, 'wb').write(f.content)

Hoàn thành tập lệnh

Tìm tập lệnh hoàn chỉnh getData.py trong kho github của dự án Python4RemoteSensing của tôi.

Nếu bạn muốn để lại ý kiến, đừng ngần ngại bắt đầu một vấn đề, hoặc liên hệ với tôi!

Cần thêm trợ giúp với Python Web-SCRAPK?

Đôi khi, Python Web có thể trở nên khó khăn và một bộ sưu tập các kỹ năng khác nhau có thể cần thiết. Nếu bạn cần thêm một bàn tay cho dự án loại bỏ web hiện tại của mình, đừng quên rằng việc thuê một freelancer có thể rất tiện dụng, giống như những người được đề xuất dưới đây bởi Fiverr:hire a freelancer, like the ones recommended below by Fiverr:

Làm thế nào để bạn tải xuống dữ liệu từ một url trong python?

Để tải xuống một tệp từ URL bằng Python, hãy làm theo ba bước sau:..
Cài đặt mô -đun yêu cầu và nhập nó vào dự án của bạn ..
Sử dụng yêu cầu. Nhận () để tải xuống dữ liệu đằng sau url đó ..
Viết tệp vào tệp trong hệ thống của bạn bằng cách gọi Open () ..

Làm cách nào để tự động tải xuống một tệp từ một trang web bằng Python?

Nhập mô -đun.Nhập yêu cầu ..
Nhận liên kết hoặc URL.url = 'https://www.facebook.com/favicon.ico' r = requests.get (url, allow_redirects = true).
Lưu nội dung với tên.Mở ('Facebook.ICO', 'WB'). Viết (R.Content) lưu tệp dưới dạng Facebook.....
Nhận tên tệp từ một url.Để có được tên tệp, chúng ta có thể phân tích URL ..

Làm cách nào để xác thực tải xuống?

Nhấp vào Cài đặt & Thiết bị.Trong "Tùy chọn xác thực", chọn cài đặt ...
Mở ứng dụng Google Play ..
Ở phía trên bên phải, nhấn vào biểu tượng hồ sơ ..
Nhấn vào Cài đặt xác thực.Yêu cầu xác thực để mua hàng ..
Chọn một cài đặt ..
Thực hiện theo các hướng dẫn trên màn hình..

Làm thế nào để bạn mã hóa xác thực trong Python?

Xác thực mật khẩu bằng Python..
Tạo một từ điển tên người dùng bằng mật khẩu của họ ..
Sau đó, bạn phải yêu cầu đầu vào của người dùng làm tên người dùng bằng cách sử dụng hàm đầu vào trong Python ..
Sau đó, bạn phải sử dụng mô -đun GetPass trong Python để yêu cầu đầu vào của người dùng làm mật khẩu ..