स्रोत पृष्ठ के केवल पहले कुछ बाइट्स डाउनलोड करें


9

मैं cURLकमांड का उपयोग करके वेबसाइट का HTML स्रोत पृष्ठ डाउनलोड कर रहा हूं । समस्या यह है, मुझे पेज की अधिकांश सामग्री नहीं चाहिए। मुझे स्रोत पृष्ठ की पहली 100 पंक्तियों की आवश्यकता है। क्या पहले कुछ पंक्तियों के बाद पृष्ठ के डाउनलोड को रोकने का कोई तरीका है?

वर्तमान में, मेरे पास नीचे का कमांड काम कर रहा है, लेकिन यह समय प्रभावी नहीं लगता है।

curl -r[0-1] "http://www.freebase.com/m/045c7b" > foo.txt

मैं से मान बदलने की कोशिश की 1करने के लिए .5और .05और अभी भी पूरे वेब पेज से डाउनलोड हो रही है।

मैं उपरोक्त कमांड को निष्पादित करने के लिए एक सेकंड से भी कम समय देख रहा हूं।

संपादित करें

के मैन पेज से cURL, मैं देखता हूं कि " आपको यह भी पता होना चाहिए कि कई HTTP / 1.1 सर्वर में यह सुविधा सक्षम नहीं है, ताकि जब आप एक सीमा प्राप्त करने का प्रयास करें, तो आप इसके बजाय पूरे दस्तावेज़ प्राप्त करेंगे। " सर्वर रेंज क्वेरी का समर्थन नहीं कर रहा है, क्या nixपर्यावरण में कुछ अन्य कमांड है जो मुझे पूरा करने में मदद करेगा कि मैं क्या करने की कोशिश कर रहा हूं?

जवाबों:


6

आप एक पृष्ठ के एक हिस्से को डाउनलोड करने के लिए उपयोग headऔर -sस्विच कर सकते हैं curl। बस यह बताइए headकि आपको आउटपुट की कितनी लाइनें चाहिए।

उदाहरण

$ curl -r[0-1] "http://www.freebase.com/m/045c7b" -s 2>&1 | head -10
Warning: Invalid character is found in given range. A specified range MUST 
Warning: have only digits in 'start'-'stop'. The server's response to this 
Warning: request is uncertain.


  <!DOCTYPE html PUBLIC "null" "null">
  <html class="no-js" dir="ltr" lang="en">
    <head>
      <meta charset="utf-8">
      <title>

विवरण

  • -10करने के लिए head10 लाइनों वापस आ जाएगी और फिर बंद। यदि आप अधिक चाहते थे तो इसे अपनी आवश्यकताओं के अनुरूप बदलें।
  • -sकरने के लिए स्विच curlबताता है तो यह प्रगति बार, जबकि डाउनलोड प्रदर्शित नहीं करेगा यह चुप रहने की।

1
सामग्री को डाउनलोड करने में अभी भी काफी समय लगता है। मैं यह करने के लिए मिली सेकंड में एक समय सीमा की उम्मीद कर रहा था।
रमेश

@ रमेश - हां मैंने देखा कि यह बहुत धीमा था। सर्वर को जवाब देने के लिए कुछ समय लगता है।
slm

: - @Ramesh बल्कि तो स्थल पर कर्ल का उपयोग कर जाने के लिए आप एपीआई पर एक नज़र डालें करना चाह सकते हैं developers.google.com/freebase
SLM

हम्म, दिलचस्प। मेरा दोस्त सुझाव दे रहा था कि जावा में अगर वह फ्रीबेस एपीआई का इस्तेमाल करता है, तो उसे डेटा डाउनलोड करने के लिए 300 एमएस चाहिए। मैंने उनसे कहा कि शेल स्क्रिप्ट का उपयोग करके इसे काफी कम किया जा सकता है। यह शेल कमांड के बजाय सर्वर के साथ एक समस्या लगती है।
रमेश

@ रमेश - हाँ इस मामले में सुस्ती डेटाबेस क्वेरी और प्रतिक्रिया में उस डेटा की तैयारी में है। यदि डेटाबेस JSON के रूप में अन्य स्वरूपों में डेटा को उजागर करता है, तो आप आउटपुट को HTTP के रूप में लेने के बजाय इसका उपयोग करके प्रतिक्रिया को तेज कर सकते हैं। HTTP के रूप में प्रतिक्रिया तैयार करने में ओवरहेड है जो कि एक बेकार है यदि अंतिम usecase परिणाम पढ़ने वाला मानव नहीं है।
स्लम

1

मैंने वास्तव में इस विशेष एप्लिकेशन का अभी तक परीक्षण नहीं किया है, लेकिन कुछ मुझे बताता है कि आप यहां dd और nc जोड़ सकते हैं:

$ nc www.website.com 80 <<GOT | dd bs=$BYTE_COUNT iflag=fullblock \
     count=1 of=$OUTFILE
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
$(printf %b '\r\r')
GOT

Netcat ( nc) अनुरोध हेडर सही पाने के लिए आगे कॉन्फ़िगरेशन की आवश्यकता हो सकती है, लेकिन अगर यह एक सार्वजनिक साइट है तो आपको एक उपयोगी आउटपुट को तैयार करने में सक्षम होना चाहिए यदि आप प्रयास करने के लिए पर्याप्त देखभाल करते हैं। निश्चित रूप से dd केवल उतना ही इनपुट लेगा जितना आप निर्दिष्ट करते हैं और छोड़ देते हैं, जो कि SIGPIPE netcat होगा ताकि यह तुरंत सूट के साथ हो जाए। एकमात्र असली चाल प्रारंभिक हैंडशेक को इस्त्री कर रही है - एक बार जब आप धारा शुरू करते हैं तो आप जब चाहें इसे गिरा सकते हैं।

संपादित करें

स्लम की टिप्पणियों को पढ़ने से मुझे दूसरी गति के लिए प्रेरित किया गया है; यदि आप एक JSON POST को सही प्रारूप में अनुक्रमित कर सकते हैं जो निश्चित रूप से अधिक सामयिक प्रतिक्रिया के लिए जाने का मार्ग है। Parsing HTML वैसे भी पक्षियों के लिए है।

आपके ब्राउज़र में सर्वर के साथ संचार करते समय आपके नेटवर्क स्ट्रीम पर कब्जा करने के लिए एक उपयोगी ट्रिक है, तब जब आपका ब्राउज़र POST भेजता है जो आपको वह मिलता है जो आप चाहते हैं कि इसके बजाय इसे फिर से GET के रूप में भेजें और परिणामों पर एक नज़र डालें।


1

headआदेश आम तौर पर डाउनलोड बंद हो जाएगा से पहले ही समाप्त हो जाती है (इससे पहले कि पाइप बंद कर दिया है, हालांकि कम फ़ाइलों के लिए यह पाइप बफर भर सकते हैं)। ऐसा इसलिए है क्योंकि जब एक पाइप बंद होता है, तो curlकहीं भी लिखना नहीं होता है (फाइल डिस्क्रिप्टर बंद हो जाता है, राइट फेल हो जाता है)।

हालांकि, मेरे अनुभव में, डाउनलोड करते समय सबसे लंबी बात डीएनएस अनुरोधों के लिए इंतजार कर रही है (दर्दनाक जब आप सैकड़ों फाइलों को क्रमिक रूप से डाउनलोड कर रहे हैं)। इसे स्थानीय DNS कैश के साथ मदद की जा सकती है dnsmasqया, यदि आप एक ही डोमेन नाम का उपयोग कई बार विभिन्न निर्देशिका संरचना के साथ कर रहे हैं, तो बस इसे एक बार एक आईपी पर हल करें और URL पर प्रतिस्थापित करें।

मेरी बात को साबित करने के लिए ... time netstatबनाम प्रयास करें time netstat -n(कैश के बिना अंतर नाटकीय है, कैश के साथ, यह केवल पहली बार खराब है, फिर याद है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.