পাইথন ব্যবহার করে এইচটিটিপি-র মাধ্যমে আমি কীভাবে একটি ফাইল ডাউনলোড করব?


874

আমার একটি ছোট্ট ইউটিলিটি রয়েছে যা আমি কোনও সময়সূচীতে একটি ওয়েবসাইট থেকে একটি এমপি 3 ফাইল ডাউনলোড করতে ব্যবহার করি এবং তারপরে আমি পডকাস্ট এক্সএমএল ফাইলটি তৈরি / আপডেট করি যা আমি আইটিউনে যুক্ত করেছি।

এক্সএমএল ফাইল তৈরি / আপডেট করে এমন পাঠ্য প্রক্রিয়াকরণটি পাইথনে লেখা আছে is তবে, আমি .batআসল এমপি 3 ফাইল ডাউনলোড করতে উইন্ডোজ ফাইলের অভ্যন্তরে উইজেট ব্যবহার করি । আমি পাইথনে সম্পূর্ণ ইউটিলিটি লেখা পছন্দ করবো।

পাইথনে ফাইলটি প্রকৃতপক্ষে ডাউনলোড করার জন্য আমি কোনও উপায় খুঁজে পেতে লড়াই করেছি, সুতরাং কেন আমি ব্যবহারটি অবলম্বন করেছি wget

সুতরাং, আমি পাইথন ব্যবহার করে ফাইলটি ডাউনলোড করব?



নীচের উত্তরগুলির অনেকের জন্য সন্তোষজনক প্রতিস্থাপন নয় wget। অন্যান্য জিনিসের মধ্যে, wget(১) টাইমস্ট্যাম্পগুলি সংরক্ষণ করে (২) ইউআরএল থেকে ফাইলের নাম স্বয়ংক্রিয়ভাবে নির্ধারণ করে, সংযোজন .1(ইত্যাদি) যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে তবে (3) অন্যান্য অনেকগুলি বিকল্প রয়েছে, যার মধ্যে কয়েকটি আপনি রেখেছেন .wgetrc। আপনি যদি এর মধ্যে কোনওটি চান তবে আপনাকে সেগুলি পাইথনে নিজেই প্রয়োগ করতে হবে তবে পাইথন থেকে কেবল অনুরোধ করা সহজ wget
শ্রীভাতসার আর

2
পাইথন 3 এর সংক্ষিপ্ত সমাধান:import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
বাসজ

উত্তর:


450

পাইথন 2 এ, urllib2 ব্যবহার করুন যা স্ট্যান্ডার্ড লাইব্রেরির সাথে আসে।

import urllib2
response = urllib2.urlopen('http://www.example.com/')
html = response.read()

লাইব্রেরিটি ব্যবহারের এটি সবচেয়ে প্রাথমিক উপায়, কোনও ত্রুটি পরিচালনার বিয়োগ করা। আপনি আরও জটিল জিনিস যেমন শিরোলেখ পরিবর্তন করতে পারেন। ডকুমেন্টেশন এখানে পাওয়া যাবে।


11
আপনার সরবরাহ করা url এর মধ্যে ফাঁকা স্থান থাকলে এটি কাজ করবে না। সেক্ষেত্রে আপনাকে ইউআরএল পার্স করতে হবে এবং পাথটি ইউলিনকোড করতে হবে।
জেসন সুন্দরাম 21

91
: এখানে পাইথন 3 সমাধান stackoverflow.com/questions/7243750/...
tommy.carstensen

6
শুধু রেফারেন্সের জন্য। পাথটি urllib2.quote
ইউলিনকোড করার উপায়টি

11
@ জেসনসুন্দরাম: যদি এর মধ্যে ফাঁকা স্থান থাকে তবে এটি ইউআরআই নয়।
জাজ

1
এটি বড় ফাইলগুলির সাথে উইন্ডোতে কাজ করে না। আপনার সব ব্লক পড়তে হবে!
আভিয়া

1115

আরও একটি, ব্যবহার করে urlretrieve:

import urllib
urllib.urlretrieve ("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

(পাইথন 3+ ব্যবহারের জন্য import urllib.requestএবং urllib.request.urlretrieve)

"প্রগতিবার" সহ আরও একটি

import urllib2

url = "http://download.thinkbroadband.com/10MB.zip"

file_name = url.split('/')[-1]
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)

file_size_dl = 0
block_sz = 8192
while True:
    buffer = u.read(block_sz)
    if not buffer:
        break

    file_size_dl += len(buffer)
    f.write(buffer)
    status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
    status = status + chr(8)*(len(status)+1)
    print status,

f.close()

1
অদ্ভুতভাবে যথেষ্ট, উইন্ডোতে যখন urllib2 পদ্ধতিটি না ঘটে তখন এটি আমার জন্য কাজ করেছিল। যদিও urlib2 পদ্ধতি ম্যাকের জন্য কাজ করেছে।
InFreefall

6
ত্রুটি: ফাইল_সাইজ_ডিএল + = ব্লক_স্ + + = লেন (বাফার) হওয়া উচিত কারণ সর্বশেষ পঠনটি প্রায়শই একটি সম্পূর্ণ ব্লক_সেজ হয় না। উইন্ডোগুলিতে আপনাকে আউটপুট ফাইলটি "wb" হিসাবে খোলার প্রয়োজন যদি এটি কোনও পাঠ্য ফাইল না হয়।
বেগুন জেফ

1
আমিও urllib এবং urllib2 কাজ করেনি তবে urlretrieve ভাল কাজ করেছে, হতাশ হয়ে পড়েছিল - ধন্যবাদ :)
-

2
if not os.path.isfile(file_name):পডকাস্টগুলিকে ওভাররাইট করা এড়াতে পুরো জিনিসটি (ফাইলের নাম সংজ্ঞা ব্যতীত) মুড়িয়ে দিন ! এইচটিএমএল ফাইলে পাওয়া ইউআরএলগুলির সাথে ক্রোনজব হিসাবে চালানোর সময় দরকারী
শ্রীরাম মুরালি

2
@ পাবলিগ এটি এখন 31 টিরও বেশি ভোটের চেয়ে বেশি;) যাইহোক, স্ট্যাটাস বারটি মজাদার ছিল তাই আমি +1 করব
সিন্ডার

340

২০১২ সালে অজগর অনুরোধের লাইব্রেরিটি ব্যবহার করুন

>>> import requests
>>> 
>>> url = "http://download.thinkbroadband.com/10MB.zip"
>>> r = requests.get(url)
>>> print len(r.content)
10485760

আপনি pip install requestsএটি পেতে দৌড়াতে পারেন ।

অনুরোধগুলির বিকল্পগুলির তুলনায় অনেক সুবিধা রয়েছে কারণ এপিআই অনেক সহজ। আপনার যদি প্রমাণীকরণ করতে হয় তবে এটি বিশেষত সত্য। urllib এবং urllib2 এক্ষেত্রে বেশ অনিশ্চিত এবং বেদনাদায়ক।


2015-12-30

মানুষ অগ্রগতি বারের জন্য প্রশংসা প্রকাশ করেছে। এটা দুর্দান্ত, নিশ্চিত। এখন বেশ কয়েকটি অফ-শেল্ফ সমাধান রয়েছে, যার মধ্যে রয়েছে tqdm:

from tqdm import tqdm
import requests

url = "http://download.thinkbroadband.com/10MB.zip"
response = requests.get(url, stream=True)

with open("10MB", "wb") as handle:
    for data in tqdm(response.iter_content()):
        handle.write(data)

এটি মূলত 30 মাস আগে বর্ণিত @kvance বাস্তবায়ন।


জিপ ফাইলটি যদি এর মধ্যে অনেকগুলি ফাইল সহ একটি ফোল্ডার হয় তবে আমি কীভাবে সংরক্ষণ করব বা নিষ্কাশন করব?
আব্দুল মুনির

6
এটি কীভাবে বড় ফাইলগুলি পরিচালনা করে, সমস্ত কিছু মেমরির মধ্যে সঞ্চয় হয় বা বড় মেমরির প্রয়োজনীয়তা ছাড়াই এটি কোনও ফাইলে লেখা যেতে পারে?
বিবস্থ

8
অনুরোধে সত্য = সত্য সেট করে বড় ফাইলগুলি স্ট্রিম করা সম্ভব। তারপরে আপনি একবারে কিছু অংশ পড়ার প্রতিক্রিয়াতে iter_content () এ কল করতে পারেন।
kvance

7
কোনও ইউআরএল লাইব্রেরিতে একটি ফাইল আনজিপ সুবিধা থাকা দরকার কেন? ইউআরএল থেকে ফাইলটি পড়ুন, এটি সংরক্ষণ করুন এবং তারপরে আপনার নৌকাকে যেভাবেই ভাসিয়ে তুলুন তা আনজিপ করুন। একটি জিপ ফাইল কোনও 'ফোল্ডার' নয় যা এটি উইন্ডোতে দেখায়, এটি একটি ফাইল।
হেরেল

2
@ অলি:: r.textপাঠ্য বা ইউনিকোড সামগ্রীর জন্য। ইউনিকোড হিসাবে ফিরে এসেছেন। r.content: বাইনারি বিষয়বস্তুর জন্য। বাইট হিসাবে ফিরে এসেছে। এটি সম্পর্কে এখানে পড়ুন: docs.python-requests.org/en/latest/user/quickstart
হিউডব্রাউন

159
import urllib2
mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3")
with open('test.mp3','wb') as output:
  output.write(mp3file.read())

wbমধ্যে open('test.mp3','wb')একটি ফাইল খোলে (এবং কোনো বিদ্যমান ফাইল মুছে যাবে) বাইনারি মোডে আপনি শুধু লেখার পরিবর্তে এটি সঙ্গে ডেটা সংরক্ষণ করতে পারেন।


30
এই সমাধানটির অসুবিধাটি হ'ল, পুরো ফাইলটি ডিস্কে সংরক্ষণের পূর্বে র‌্যামে লোড করা হয়, সীমিত র‌্যাম সহ রাউটারের মতো একটি ছোট সিস্টেমে বড় ফাইলগুলির জন্য এটি ব্যবহার করার ক্ষেত্রে কিছু মনে রাখা দরকার।
ট্রিপলেট

2
@ ট্রিপলেট তাই আমরা কীভাবে এটি ঠিক করব?
লুকাস হেনরিক 14

11
মেমরিতে পুরো ফাইলটি পড়া এড়াতে, পড়ার file.readজন্য বাইটের সংখ্যা এটির পক্ষে একটি আর্গুমেন্ট পাস করার চেষ্টা করুন । দেখুন: gist.github.com/hughdbrown/c145b8385a2afa6570e2
হিউডব্রাউন

@ হাগডব্রাউন আমি আপনার স্ক্রিপ্টটি দরকারী বলে মনে করেছি, তবে একটি প্রশ্ন আছে: পোস্ট-প্রসেসিংয়ের জন্য আমি কি ফাইলটি ব্যবহার করতে পারি? মনে করুন যে আমি একটি জেপিজি ফাইল ডাউনলোড করেছি যা আমি ওপেনসিভি দিয়ে প্রক্রিয়া করতে চাই, আমি কি কাজ চালিয়ে যাওয়ার জন্য 'ডেটা' ভেরিয়েবলটি ব্যবহার করতে পারি? বা ডাউনলোড ফাইল থেকে আবার পড়তে হবে?
রদ্রিগো ই। প্রিন্সিপ

5
shutil.copyfileobj(mp3file, output)পরিবর্তে ব্যবহার করুন।
অরলিয়ান ওমস

129

পাইথন ঘ

  • urllib.request.urlopen

    import urllib.request
    response = urllib.request.urlopen('http://www.example.com/')
    html = response.read()
    
  • urllib.request.urlretrieve

    import urllib.request
    urllib.request.urlretrieve('http://www.example.com/songs/mp3.mp3', 'mp3.mp3')
    

    দ্রষ্টব্য: ডকুমেন্টেশন অনুসারে, urllib.request.urlretrieveএটি একটি "লিগ্যাসি ইন্টারফেস" এবং "ভবিষ্যতে অবহেলিত হতে পারে" (ধন্যবাদ জারিত )

পাইথন 2


2
এটি অবশ্যই কিছুটা সময় নিয়েছে, তবে শেষ অবধি, পাইথন স্টাডলিবের কাছ থেকে প্রত্যাশা করা সহজ সোজা সোজা এপিআই :)
থারস্মমনার

পাইথন 3 এর জন্য খুব সুন্দর উত্তর, ডকস.পিথন.আর.৩ / ৩ / লাইব্রেরি / দেখুন দেখুন
থিয়েল

@ এডওয়ার্ডথিল আপনি যদি urllib.request.urlretrieveউপরে ক্লিক করেন তবে এটি আপনাকে সেই সঠিক লিঙ্কে নিয়ে আসবে। চিয়ার্স!
bmaupin

2
urllib.request.urlretrieve"লিগ্যাসি ইন্টারফেস" হিসাবে নথিভুক্ত করা হয় এবং "ভবিষ্যতে অবহেলিত হতে পারে"।
জেরিট

@gerrit আমি একটি নোট যুক্ত করেছি, মাথা আপ করার জন্য ধন্যবাদ!
bmaupin


21

পাইথন 2/3 এর জন্য পাবলোজি কোডের একটি উন্নত সংস্করণ:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import ( division, absolute_import, print_function, unicode_literals )

import sys, os, tempfile, logging

if sys.version_info >= (3,):
    import urllib.request as urllib2
    import urllib.parse as urlparse
else:
    import urllib2
    import urlparse

def download_file(url, dest=None):
    """ 
    Download and save a file specified by url to dest directory,
    """
    u = urllib2.urlopen(url)

    scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
    filename = os.path.basename(path)
    if not filename:
        filename = 'downloaded.file'
    if dest:
        filename = os.path.join(dest, filename)

    with open(filename, 'wb') as f:
        meta = u.info()
        meta_func = meta.getheaders if hasattr(meta, 'getheaders') else meta.get_all
        meta_length = meta_func("Content-Length")
        file_size = None
        if meta_length:
            file_size = int(meta_length[0])
        print("Downloading: {0} Bytes: {1}".format(url, file_size))

        file_size_dl = 0
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break

            file_size_dl += len(buffer)
            f.write(buffer)

            status = "{0:16}".format(file_size_dl)
            if file_size:
                status += "   [{0:6.2f}%]".format(file_size_dl * 100 / file_size)
            status += chr(13)
            print(status, end="")
        print()

    return filename

if __name__ == "__main__":  # Only run if this file is called directly
    print("Testing with 10MB download")
    url = "http://download.thinkbroadband.com/10MB.zip"
    filename = download_file(url)
    print(filename)

আমি প্রথম লাইন থেকে প্রথম বন্ধনী সরিয়ে ফেলব, কারণ এটি খুব বেশি পুরানো বৈশিষ্ট্য নয়।
অর্পদ হরভাথ

21

লাইব্রেরির Python 2 & Python 3সাথে সহজ তবে সুসংগত উপায় আসে six:

from six.moves import urllib
urllib.request.urlretrieve("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

1
এটি 2 + 3 সামঞ্জস্যের জন্য এটি করার সর্বোত্তম উপায়।
ফিশ

21
import os,requests
def download(url):
    get_response = requests.get(url,stream=True)
    file_name  = url.split("/")[-1]
    with open(file_name, 'wb') as f:
        for chunk in get_response.iter_content(chunk_size=1024):
            if chunk: # filter out keep-alive new chunks
                f.write(chunk)


download("https://example.com/example.jpg")

17

খালি পাইথনে উইজেট লাইব্রেরি লিখেছিলেন কেবল এই উদ্দেশ্যে। এটি 2.0.0 সংস্করণ হিসাবে এই বৈশিষ্ট্যগুলিurlretrieve সহ পাম্প করা হয়েছে ।


3
কাস্টম ফাইল নাম দিয়ে সংরক্ষণ করার কোন বিকল্প নেই?
অ্যালেক্স


আমি যখন সাইগউইনের অধীনে এই মডিউলটি ব্যবহার করি তখন অগ্রগতি বারটি উপস্থিত হয় না।
জো কোডার

আপনি এর থেকে পরিবর্তন করা উচিত -oকাছে -O, এড়ানোর বিভ্রান্তির যেমন গনুহ wget হয় হয়। অথবা কমপক্ষে দুটি বিকল্পই বৈধ হওয়া উচিত।
এরিক

@ এরিক আমি নিশ্চিত নই যে আমি বাস্তবের জন্য wget.pyকোনও স্থান-স্থান প্রতিস্থাপন করতে চাই wget-oইতিমধ্যে ভিন্নভাবে আচরণ করবে - এটা সঙ্গে সামঞ্জস্যপূর্ণ curlএই ভাবে। ডকুমেন্টেশনের একটি নোট কি সমস্যা সমাধানে সহায়তা করবে? অথবা কমান্ড লাইনের সাথে সামঞ্জস্যপূর্ণ এমন নাম ব্যবহারের জন্য এটি কোনও প্রয়োজনীয় বৈশিষ্ট্য?
অ্যানাটোলি টেকটোনিক

15

পাইথনে ফাইলগুলি ডাউনলোড করার জন্য নিম্নলিখিত সর্বাধিক ব্যবহৃত কলগুলি:

  1. urllib.urlretrieve ('url_to_file', file_name)

  2. urllib2.urlopen('url_to_file')

  3. requests.get(url)

  4. wget.download('url', file_name)

দ্রষ্টব্য: urlopenএবং urlretrieveবড় ফাইলগুলি (আকার> 500 এমবি) ডাউনলোড করে তুলনামূলকভাবে খারাপ অভিনয় করতে দেখা যায়। requests.getডাউনলোড শেষ না হওয়া অবধি মেমরি ফাইলটি সঞ্চয় করে।


14

আমি কোরির সাথে একমত, urllib2 urllib এর চেয়ে আরও সম্পূর্ণ এবং সম্ভবত আপনি আরও জটিল কিছু করতে চাইলে ব্যবহৃত মডিউলটি হওয়া উচিত, তবে উত্তরগুলি আরও সম্পূর্ণ করতে, আপনি যদি কেবলমাত্র বেসিকগুলি চান তবে urllib একটি সহজ মডিউল:

import urllib
response = urllib.urlopen('http://www.example.com/sound.mp3')
mp3 = response.read()

ভাল কাজ করবে। অথবা, যদি আপনি "প্রতিক্রিয়া" অবজেক্টটি মোকাবেলা করতে না চান তবে আপনি সরাসরি () পড়তে কল করতে পারেন :

import urllib
mp3 = urllib.urlopen('http://www.example.com/sound.mp3').read()

10

পাইথন 3 এ আপনি urllib3 এবং shutil গ্রন্থাগার ব্যবহার করতে পারেন। পিপ বা পিপ 3 ব্যবহার করে এগুলি ডাউনলোড করুন (পাইথন 3 ডিফল্ট কিনা তা নির্ভর করে)

pip3 install urllib3 shutil

তারপরে এই কোডটি চালান

import urllib.request
import shutil

url = "http://www.somewebsite.com/something.pdf"
output_file = "save_this_name.pdf"
with urllib.request.urlopen(url) as response, open(output_file, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

আপনি ডাউনলোড urllib3কিন্তু urllibকোড ব্যবহার করুন নোট করুন


7

আপনি urlretrieve এর সাথে অগ্রগতির প্রতিক্রিয়াও পেতে পারেন:

def report(blocknr, blocksize, size):
    current = blocknr*blocksize
    sys.stdout.write("\r{0:.2f}%".format(100.0*current/size))

def downloadFile(url):
    print "\n",url
    fname = url.split('/')[-1]
    print fname
    urllib.urlretrieve(url, fname, report)

7

আপনি যদি উইজেট ইনস্টল করেন তবে আপনি প্যারালাল_সেন্সি ব্যবহার করতে পারেন।

পাইপ ইনস্টল করুন সমান্তরাল_সাইক

from parallel_sync import wget
urls = ['http://something.png', 'http://somthing.tar.gz', 'http://somthing.zip']
wget.download('/tmp', urls)
# or a single file:
wget.download('/tmp', urls[0], filenames='x.zip', extract=True)

দস্তাবেজ: https://pythonhosted.org/parallel_sync/pages/exferences.html

এটি বেশ শক্তিশালী। এটি সমান্তরালভাবে ফাইলগুলি ডাউনলোড করতে পারে, ব্যর্থতার পরে আবার চেষ্টা করতে পারে এবং এটি দূরবর্তী মেশিনে ফাইলও ডাউনলোড করতে পারে।


নোট করুন এটি কেবল লিনাক্সের জন্য
jjj

4

আপনি গতি বিষয়গুলি, আমি মডিউল জন্য একটি ছোট কর্মক্ষমতা পরীক্ষা প্রণীত urllibএবং wget, এবং সংক্রান্ত wgetআমি স্ট্যাটাস বার এবং ছাড়া একবার একবার চেষ্টা করে। আমি পরীক্ষার জন্য তিনটি 500 এমবি ফাইল নিয়েছি (বিভিন্ন ফাইল- এই হুডের নীচে কিছু ক্যাশে চলছে এমন সম্ভাবনাটি দূর করতে)। পাইথন 2 সহ ডিবিয়ান মেশিনে পরীক্ষিত।

প্রথমত, এগুলি ফলাফল (এটি বিভিন্ন রানে একই রকম):

$ python wget_test.py 
urlretrive_test : starting
urlretrive_test : 6.56
==============
wget_no_bar_test : starting
wget_no_bar_test : 7.20
==============
wget_with_bar_test : starting
100% [......................................................................] 541335552 / 541335552
wget_with_bar_test : 50.49
==============

আমি পরীক্ষাটি যেভাবে সম্পাদন করেছি তা হ'ল "প্রোফাইল" ডেকরেটার using এটি সম্পূর্ণ কোড:

import wget
import urllib
import time
from functools import wraps

def profile(func):
    @wraps(func)
    def inner(*args):
        print func.__name__, ": starting"
        start = time.time()
        ret = func(*args)
        end = time.time()
        print func.__name__, ": {:.2f}".format(end - start)
        return ret
    return inner

url1 = 'http://host.com/500a.iso'
url2 = 'http://host.com/500b.iso'
url3 = 'http://host.com/500c.iso'

def do_nothing(*args):
    pass

@profile
def urlretrive_test(url):
    return urllib.urlretrieve(url)

@profile
def wget_no_bar_test(url):
    return wget.download(url, out='/tmp/', bar=do_nothing)

@profile
def wget_with_bar_test(url):
    return wget.download(url, out='/tmp/')

urlretrive_test(url1)
print '=============='
time.sleep(1)

wget_no_bar_test(url2)
print '=============='
time.sleep(1)

wget_with_bar_test(url3)
print '=============='
time.sleep(1)

urllib দ্রুততম বলে মনে হচ্ছে


বারটিকে এত বেশি সময় বাড়ানোর জন্য হুডের নীচে অবশ্যই কিছু ভীতিজনক কিছু ঘটতে হবে।
অ্যালিস্টার ক্যারস্ক্যাডেন

4

কেবলমাত্র সম্পূর্ণতার জন্য, subprocessপ্যাকেজটি ব্যবহার করে ফাইলগুলি পুনরুদ্ধার করার জন্য কোনও প্রোগ্রাম কল করাও সম্ভব । ফাইলগুলি পুনরুদ্ধারে উত্সর্গীকৃত প্রোগ্রামগুলি পাইথন ফাংশনগুলির চেয়ে বেশি শক্তিশালী urlretrieve। উদাহরণস্বরূপ, wgetডিরেক্টরিগুলি পুনরাবৃত্তভাবে ডাউনলোড করতে পারেন ( -R), এফটিপি, পুনর্নির্দেশগুলি, এইচটিটিপি প্রক্সিগুলির সাথে ডিল করতে পারে, বিদ্যমান ফাইলগুলি পুনরায় ডাউনলোড করা এড়াতে পারে ( -nc) এবং aria2মাল্টি-সংযোগ ডাউনলোডগুলি করতে পারে যা আপনার ডাউনলোডগুলি গতিযুক্ত করতে পারে।

import subprocess
subprocess.check_output(['wget', '-O', 'example_output_file.html', 'https://example.com'])

জুপিটার নোটবুকে, !সিন্ট্যাক্সের মাধ্যমে কেউ সরাসরি প্রোগ্রামগুলি কল করতে পারে :

!wget -O example_output_file.html https://example.com

3

উত্স কোড হতে পারে:

import urllib
sock = urllib.urlopen("http://diveintopython.org/")
htmlSource = sock.read()                            
sock.close()                                        
print htmlSource  

3

আপনি পাইথন 2 এবং 3 তে পাইক URL ব্যবহার করতে পারেন ।

import pycurl

FILE_DEST = 'pycurl.html'
FILE_SRC = 'http://pycurl.io/'

with open(FILE_DEST, 'wb') as f:
    c = pycurl.Curl()
    c.setopt(c.URL, FILE_SRC)
    c.setopt(c.WRITEDATA, f)
    c.perform()
    c.close()

2

আমি নিম্নলিখিতটি লিখেছি, যা ভ্যানিলা পাইথন 2 বা পাইথন 3 এ কাজ করে।


import sys
try:
    import urllib.request
    python3 = True
except ImportError:
    import urllib2
    python3 = False


def progress_callback_simple(downloaded,total):
    sys.stdout.write(
        "\r" +
        (len(str(total))-len(str(downloaded)))*" " + str(downloaded) + "/%d"%total +
        " [%3.2f%%]"%(100.0*float(downloaded)/float(total))
    )
    sys.stdout.flush()

def download(srcurl, dstfilepath, progress_callback=None, block_size=8192):
    def _download_helper(response, out_file, file_size):
        if progress_callback!=None: progress_callback(0,file_size)
        if block_size == None:
            buffer = response.read()
            out_file.write(buffer)

            if progress_callback!=None: progress_callback(file_size,file_size)
        else:
            file_size_dl = 0
            while True:
                buffer = response.read(block_size)
                if not buffer: break

                file_size_dl += len(buffer)
                out_file.write(buffer)

                if progress_callback!=None: progress_callback(file_size_dl,file_size)
    with open(dstfilepath,"wb") as out_file:
        if python3:
            with urllib.request.urlopen(srcurl) as response:
                file_size = int(response.getheader("Content-Length"))
                _download_helper(response,out_file,file_size)
        else:
            response = urllib2.urlopen(srcurl)
            meta = response.info()
            file_size = int(meta.getheaders("Content-Length")[0])
            _download_helper(response,out_file,file_size)

import traceback
try:
    download(
        "https://geometrian.com/data/programming/projects/glLib/glLib%20Reloaded%200.5.9/0.5.9.zip",
        "output.zip",
        progress_callback_simple
    )
except:
    traceback.print_exc()
    input()

মন্তব্য:

  • একটি "অগ্রগতি বার" কলব্যাক সমর্থন করে।
  • ডাউনলোড আমার ওয়েবসাইট থেকে একটি 4 এমবি পরীক্ষা। জিপ।

দুর্দান্ত কাজ করে, জুপিটারের মাধ্যমে চালান আমি যা চাই তা পেয়েছি :-)
সমীর ওলডসাদি

1

এটি কিছুটা দেরিতে হতে পারে তবে আমি পাবলগের কোডটি দেখেছি এবং এটি একটি দুর্দান্ত দেখানোর জন্য একটি ওএস.সিস্টেম ('ক্লস') যুক্ত করতে সহায়তা করতে পারি নি! এটা দেখ :

    import urllib2,os

    url = "http://download.thinkbroadband.com/10MB.zip"

    file_name = url.split('/')[-1]
    u = urllib2.urlopen(url)
    f = open(file_name, 'wb')
    meta = u.info()
    file_size = int(meta.getheaders("Content-Length")[0])
    print "Downloading: %s Bytes: %s" % (file_name, file_size)
    os.system('cls')
    file_size_dl = 0
    block_sz = 8192
    while True:
        buffer = u.read(block_sz)
        if not buffer:
            break

        file_size_dl += len(buffer)
        f.write(buffer)
        status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
        status = status + chr(8)*(len(status)+1)
        print status,

    f.close()

উইন্ডোজ ব্যতীত অন্য পরিবেশে চলতে থাকলে আপনাকে অন্য কিছু ব্যবহার করতে হবে তারপর 'ক্লস'। ম্যাক ওএস এক্স এবং লিনাক্সে এটি 'পরিষ্কার' হওয়া উচিত।


3
clsআমার ওএস এক্স বা আমার কোনও উবুন্টু সার্ভারে কিছু করে না। কিছু ব্যাখ্যা ভাল হতে পারে।
kqw

আমি মনে করি আপনার clearলিনাক্সের জন্য ব্যবহার করা উচিত , বা পুরো কমান্ড লাইনের আউটপুট সাফ করার পরিবর্তে প্রিন্ট লাইনটি প্রতিস্থাপন করা উচিত ।
আরিজুন

4
এই উত্তরটি অন্য একটি উত্তর অনুলিপি করে এবং os.system()একটি অবহিত ফাংশনে ( ) যুক্ত করে যা একটি প্ল্যাটফর্ম নির্দিষ্ট কমান্ড ( cls) ব্যবহার করে স্ক্রিনটি সাফ করার জন্য একটি সাবপ্রসেস চালু করে । কিভাবে এই আছে কোন upvotes ?? সম্পূর্ণ মূল্যহীন "উত্তর" আইএমএইচও।
কোরি গোল্ডবার্গ

1

urlretrieve এবং অনুরোধ.জেট সহজ, তবে বাস্তবতা নয়। আমি টেক্সট এবং চিত্র সহ বেশ কয়েকটি সাইটের ডেটা পেয়েছি, উপরের দুটি সম্ভবত বেশিরভাগ কাজের সমাধান করে। তবে আরও সর্বজনীন সমাধানের জন্য আমি urlopen ব্যবহারের পরামর্শ দিচ্ছি। পাইথন 3 স্ট্যান্ডার্ড লাইব্রেরিতে এটি অন্তর্ভুক্ত হওয়ায় আপনার কোডটি এমন কোনও মেশিনে চলতে পারে যা প্রাইস-সাইট-প্যাকেজ ইনস্টল না করে পাইথন 3 চালায় machine

import urllib.request
url_request = urllib.request.Request(url, headers=headers)
url_connect = urllib.request.urlopen(url_request)

#remember to open file in bytes mode
with open(filename, 'wb') as f:
    while True:
        buffer = url_connect.read(buffer_size)
        if not buffer: break

        #an integer value of size of written data
        data_wrote = f.write(buffer)

#you could probably use with-open-as manner
url_connect.close()

এই উত্তরটি পাইথন ব্যবহার করে HTTP- র মাধ্যমে ফাইল ডাউনলোড করার সময় HTTP 403 নিষিদ্ধের সমাধান সরবরাহ করে। আমি কেবল অনুরোধ এবং urllib মডিউল চেষ্টা করেছি, অন্য মডিউলটি আরও ভাল কিছু সরবরাহ করতে পারে তবে বেশিরভাগ সমস্যা সমাধানের জন্য এটিই আমি ব্যবহার করেছি।


0

দেরিতে উত্তর, তবে python>=3.6আপনার ব্যবহারের জন্য:

import dload
dload.save(url)

এর সাথে ইনস্টল করুন dload:

pip3 install dload

0

আমি একটি ওয়েবপৃষ্ঠা থেকে সমস্ত ফাইল ডাউনলোড করতে চেয়েছিলাম। আমি চেষ্টা করেছি wgetকিন্তু এটি ব্যর্থ হয়েছিল তাই আমি পাইথন রুটের জন্য সিদ্ধান্ত নিয়েছি এবং আমি এই থ্রেডটি পেয়েছি।

এটি পড়ার পরে, আমি পাবলোজি এবং স্ট্যানের দুর্দান্তsoupget উত্তরের উপর প্রসারিত করে কিছু দরকারী বিকল্প যুক্ত করেছিলাম , একটি সামান্য কমান্ড লাইন অ্যাপ্লিকেশন তৈরি করেছি ।

এটি পৃষ্ঠার সমস্ত ইউআরএল সংগ্রহ করতে এবং তারপরে পছন্দসই এক্সটেনশন (গুলি) দিয়ে ডাউনলোড করতে বিটিফুলসপ ব্যবহার করে । শেষ পর্যন্ত এটি সমান্তরালে একাধিক ফাইল ডাউনলোড করতে পারে।

এটা এখানে:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import (division, absolute_import, print_function, unicode_literals)
import sys, os, argparse
from bs4 import BeautifulSoup

# --- insert Stan's script here ---
# if sys.version_info >= (3,): 
#...
#...
# def download_file(url, dest=None): 
#...
#...

# --- new stuff ---
def collect_all_url(page_url, extensions):
    """
    Recovers all links in page_url checking for all the desired extensions
    """
    conn = urllib2.urlopen(page_url)
    html = conn.read()
    soup = BeautifulSoup(html, 'lxml')
    links = soup.find_all('a')

    results = []    
    for tag in links:
        link = tag.get('href', None)
        if link is not None: 
            for e in extensions:
                if e in link:
                    # Fallback for badly defined links
                    # checks for missing scheme or netloc
                    if bool(urlparse.urlparse(link).scheme) and bool(urlparse.urlparse(link).netloc):
                        results.append(link)
                    else:
                        new_url=urlparse.urljoin(page_url,link)                        
                        results.append(new_url)
    return results

if __name__ == "__main__":  # Only run if this file is called directly
    # Command line arguments
    parser = argparse.ArgumentParser(
        description='Download all files from a webpage.')
    parser.add_argument(
        '-u', '--url', 
        help='Page url to request')
    parser.add_argument(
        '-e', '--ext', 
        nargs='+',
        help='Extension(s) to find')    
    parser.add_argument(
        '-d', '--dest', 
        default=None,
        help='Destination where to save the files')
    parser.add_argument(
        '-p', '--par', 
        action='store_true', default=False, 
        help="Turns on parallel download")
    args = parser.parse_args()

    # Recover files to download
    all_links = collect_all_url(args.url, args.ext)

    # Download
    if not args.par:
        for l in all_links:
            try:
                filename = download_file(l, args.dest)
                print(l)
            except Exception as e:
                print("Error while downloading: {}".format(e))
    else:
        from multiprocessing.pool import ThreadPool
        results = ThreadPool(10).imap_unordered(
            lambda x: download_file(x, args.dest), all_links)
        for p in results:
            print(p)

এর ব্যবহারের একটি উদাহরণ:

python3 soupget.py -p -e <list of extensions> -d <destination_folder> -u <target_webpage>

এবং যদি আপনি এটি কার্যকরভাবে দেখতে চান তবে প্রকৃত উদাহরণ:

python3 soupget.py -p -e .xlsx .pdf .csv -u https://healthdata.gov/dataset/chemicals-cosmetics
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.