404 পাওয়ার পরে আপনি কীভাবে 'উইজেট' বন্ধ করবেন?


12

আপনি যদি ব্রেস প্রসারণটি এর সাথে ব্যবহার করেন তবে আপনি wgetসহজেই ক্রমানুসারে সংখ্যাযুক্ত চিত্রগুলি আনতে পারেন:

$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'

এটা তোলে সংখ্যাযুক্ত প্রথম 10 ফাইল নিয়ে আসে 90.jpgকাছে 99.jpgশুধু জরিমানা, কিন্তু 100.jpgএবং অনওয়ার্ড একটি ফিরতি 404: ফাইল পাওয়া যায়নি ত্রুটি (আমি শুধুমাত্র সার্ভারে সংরক্ষণ করা 100 টি ছবি আছে)। আপনি যদি বৃহত্তর পরিসীমা ব্যবহার করেন, যেমন {00..200}100 টি অস্তিত্বহীন ফাইল ব্যবহার করে তবে স্ক্রিপ্টটির সম্পাদনের সময়টি বাড়িয়ে তোলে এবং এমনকি সামান্য বোঝা (বা কমপক্ষে বিরক্তিও) হয়ে উঠতে পারে যদি এই অস্তিত্বহীন ফাইলগুলি "সমস্যা" হয়ে যায় সার্ভার.

wgetএটির প্রথম 404 ত্রুটি পাওয়ার পরে কি থামার কোনও উপায় আছে ? (বা আরও ভাল, একের পর এক দুটি ক্ষেত্রে, অন্য কোনও কারণে সীমার মধ্যে কোনও ফাইল অনুপস্থিত ছিল) উত্তরের ব্রেস সম্প্রসারণ ব্যবহার করার প্রয়োজন নেই; লুপগুলিও ঠিক আছে।


1
রিয়েল-টাইম দৃশ্যে, আপনি স্ট্যাটাসটি জানতে প্রতিটি ইউআরএল হিট করতে চাইতে পারেন। 1, 2 or even n failuresআপনি [begin .. end]সূচকগুলি জানেন যখন সঠিক উপায় নয় । আপনি [1..200]কেবলমাত্র 100 টি চিত্র রয়েছে বলে আপনি কেন রেঞ্জটি নির্দিষ্ট করবেন [1..100]। আমি অনুমান করি parallelযে প্রক্রিয়াটি দ্রুততর করার জন্য আপনি একযোগে অনুরোধের জন্য জিএনইউ চেষ্টা করতে পারেন ।
স্পারকোট

1
@ স্পারকোট ॐ মূল কথাটি আমি জানি না যে সার্ভারে কেবলমাত্র 100 টি চিত্র রয়েছে, আমি শেষটি কোথায় রয়েছে তা সন্ধান না করা পর্যন্ত স্ক্রিপ্টটি সিরিজটিতে যতগুলি চিত্র ডাউনলোড করতে পারে তা ডাউনলোড করতে চাই।
আইকিউ আন্দ্রেয়াস

উত্তর:


9

আপনি যদি একটি লুপ দিয়ে খুশি হন:

for url in 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
do
    wget "$url" || break
done

এটি wgetআপনার প্রসারণের প্রতিটি ইউআরএল চালিত হবে যতক্ষণ না এটি ব্যর্থ হয়, এবং তারপরে breakলুপটি শেষ হয় না।

আপনি যদি পর পর দুটি ব্যর্থতা চান তবে এটি আরও জটিল হয়ে উঠবে:

for url in 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
do
    if wget "$url"
    then
        failed=
    elif [ "$failed" ]
    then
        break
    else
        failed=yes
    fi
done

আপনি এটির সাথে &&এবং এর ||পরিবর্তে কিছুটা সঙ্কুচিত করতে পারেন ifতবে এটি বেশ কুৎসিত হয়।

আমি বিশ্বাস করি না wgetএটি করতে কিছু অন্তর্নিহিত রয়েছে।


আমি elifদ্বিতীয় উদাহরণটি আরও পরিষ্কার করার জন্য ব্যবহার করতে পরামর্শ দিতে পারি ? এরকম কিছু সম্ভবত? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (এটি কেবলমাত্র একটি অতিরিক্ত লাইন যুক্ত করে, thenif
এসগুলিতে

যথেষ্ট ফর্সা। এক-লাইন অনুবাদ এখনকার মতো সোজা নয়, তবে যাইহোক এটি খুব ভাল নয়।
মাইকেল হোমার

9

আপনি $?উইজেটের রিটার্ন কোড পেতে ভেরিয়েবলটি ব্যবহার করতে পারেন । যদি এটি শূন্য-না হয় তবে এর অর্থ একটি ত্রুটি ঘটেছে এবং আপনি এটি যখন একটি প্রান্তিক স্থানে পৌঁছাচ্ছেন ততক্ষণ আপনি এটি টাল আপ করেন, তবে এটি লুপ থেকে বেরিয়ে যেতে পারে।

আমার মাথার উপরের দিক থেকে এমন কিছু

#!/bin/bash

threshold=0
for x in {90..110}; do
    wget 'http://www.iqandreas.com/sample-images/100-100-color/'$x'.jpg'
    wgetreturn=$?
    if [[ $wgetreturn -ne 0 ]]; then
        threshold=$(($threshold+$wgetreturn))
        if [[ $threshold -eq 16 ]]; then
                break
        fi
    fi
done

ফর লুপটি কিছুটা পরিষ্কার করা যায় তবে আপনি সাধারণ ধারণাটি বুঝতে পারেন।

এটি পরিবর্তন $threshold -eq 16করা -eq 24মানে এটি বন্ধ হওয়ার আগে এটি 3 বার ব্যর্থ হবে, তবে এটি একটানা দু'বার হবে না, এটি লুপে দু'বার ব্যর্থ হলে এটি হবে।

যে কারণে 16এবং 24ব্যবহৃত হয় তা হ'ল মোট রিটার্ন কোডগুলি।
উইগেট 8সার্ভারের একটি ত্রুটির সাথে মিলে এমন একটি প্রতিক্রিয়া কোড পায় যখন একটি রিটার্ন কোড দিয়ে প্রতিক্রিয়া জানায় এবং এভাবে 162 টি ত্রুটির পরে মোট হয়।

কেবলমাত্র একবারে দু'বার ব্যর্থতা দেখা দিলে থামানো থ্রেশহোল্ডটি পুনরায় সেট করার মাধ্যমে যখনই wgetসাফল্য পাওয়া যায়, যখন রিটার্ন কোড 0 হয়


উইজেট রিটার্ন কোডগুলির একটি তালিকা এখানে পাওয়া যাবে - http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html


2
যদিও উত্তর থেকে অনুমিত হতে পারে, আপনি স্পষ্টভাবে নির্দেশ করে একটি 404 ত্রুটির একটি প্রস্থান কোড নিয়ে এসেছে চাইতে পারেন 8, অত যাদু সংখ্যা এর 16এবং 24
আইকিউ আন্দ্রেয়াস

1
আমি আমার উত্তর আপডেট করেছি
লরেন্স

1
ধন্যবাদ $?! খুব দরকারী!
neverindind9

2

জিএনইউ সমান্তরালের সাথে এই কাজ করা উচিত:

parallel --halt 1 wget ::: 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'

সংস্করণ 20140722 থেকে আপনার প্রায় আপনার "পর পর দুটি" থাকতে পারে - ব্যর্থতা: --হাল্ট 2% 2% কাজ ব্যর্থ হতে দেয়:

parallel --halt 2% wget ::: 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'

1

আইএমও, wgetকিছু ব্যবহারের ক্ষেত্রে প্রস্থান কোড / স্থিতিতে ফোকাস করা খুব নির্বোধ হতে পারে, তাই এইচটিটিপি স্থিতি কোড হিসাবে বিবেচনা করে কিছু দানাদার সিদ্ধান্ত গ্রহণের জন্য এখানে একটি।

wgetকমান্ডের -S/--server-responseHTTP রেসপন্স শিরোনামগুলি মুদ্রণের জন্য একটি পতাকা সরবরাহ করে STDERR- যা আমরা নিষ্কাশন করতে এবং তার উপর কাজ করতে পারি।

#!/bin/bash

set -eu

error_max=2
error_count=0

urls=( 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg' )

for url in "${urls[@]}"; do
  set +e
  http_status=$( wget --server-response -c "$url" 2>&1 )
  exit_status=$?
  http_status=$( awk '/HTTP\//{ print $2 }' <<<"$http_status" | tail -n 1 )

  if (( http_status >= 400 )); then
    # Considering only HTTP Status errors
    case "$http_status" in
      # Define your actions for each 4XX Status Code below
      410) : Gone
        ;;
      416) : Requested Range Not Satisfiable
        error_count=0  # Reset error_count in case of `wget -c`
        ;;
      403) : Forbidden
        ;&
      404) : Not Found
        ;&
      *)     (( error_count++ ))
        ;;
    esac
  elif (( http_status >= 300 )); then
     # We're unlikely to reach here in case of 1XX, 3XX in $http_status
     # but ..
     exit_status=0
  elif (( http_status >= 200 )); then
     # 2XX in $http_status considered successful
     exit_status=0
  elif (( exit_status > 0 )); then

    # Where wget's exit status is one of
    # 1   Generic error code.
    # 2   Parse error 
    #     - when parsing command-line options, the .wgetrc or .netrc...
    # 3   File I/O error.
    # 4   Network failure.
    # 5   SSL verification failure.
    # 6   Username/password authentication failure.
    # 7   Protocol errors.

    (( error_count++ ))
  fi

  echo "$url -> http_status: $http_status, exit_status=$exit_status, error_count=$error_count" >&2

  if (( error_count >= error_max )); then
    echo "error_count $error_count >= $error_max, bailing out .." >&2
    exit "$exit_status"
  fi

done

-1

অজগর আপনি করতে পারেন

from subprocess import *

def main():
    for i in range(90, 110):
       try :
          url = "url/"+str(i)
          check_output(["wget", url])
       except CalledProcessError:
          print "Wget returned none zero output, quiting"
          sys.exit(0)

আপনি যদি আরও কিছু করতে চান তবে সাবপ্রসেসের জন্য ডকুমেন্টেশন চেকআউট করুন https://docs.python.org/2/library/subprocess.html


যদি check_outputনা wgetসনাক্ত করতে চারপাশে কিছু যাদু না করে 404- আমি বিশ্বাস করি না এখানে পর্যাপ্ত চেক রয়েছে এবং তাই সত্যই প্রশ্নের উত্তর দেয় না।
শালম্ব

এটি করে, ডকগুলি পড়ে। এটি স্টাডাউট বা স্টডার মধ্যে আউটপুট পরীক্ষা করে।
উইজেটের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.