سؤال

لدي قائمة URL كبيرة ، والتي يتعين علي تنزيلها بالتوازي والتحقق من أحد الرؤوس التي يتم إرجاعها مع كل استجابة.

استطيع ان استخدم curlmulti للتوازي. استطيع ان استخدم /dev/null بصفتي FB ، لأنني لست مهتمًا بالجسم ، فقط الرؤوس.

ولكن كيف يمكنني التحقق من كل رأس؟

لتلقي رأس ، يجب أن أعدد رد اتصال HeaderFunction. أحصل على ذلك.

لكن في وظيفة رد الاتصال هذه ، أحصل على عازلة فقط مع الرؤوس. كيف يمكنني التمييز بين طلب واحد؟

لا أحب فكرة إنشاء الكثير من وظائف رد الاتصال كما توجد عناوين URL. هل يجب أن أقوم بإنشاء بعض الفصول الدراسية والكثير من الحالات من تلك الفئة؟ أيضا ليس ذكي جدا.

هل كانت مفيدة؟

المحلول 3

يتمثل الحل في استخدام القليل من البرمجة الوظيفية "لالتصاق" ببعض المعلومات الإضافية لوظيفة رد الاتصال لدينا.

functools.partial

نصائح أخرى

أود استخدام وحدات Python المدمجة في HTTPLIB ووحدات الخيوط. لا أرى حاجة إلى وحدة الطرف الثالث.

أعلم أنك تسأل عن Pycurl ، لكني أجد أنه من الصعب جدًا استخدامه. واجهة برمجة التطبيقات غريبة.

ها هو ملتوية مثال:

from twisted.web.client import Agent
from twisted.internet import reactor, defer

def get_headers(response, url):
    '''Extract a dict of headers from the response'''
    return url, dict(response.headers.getAllRawHeaders())

def got_everything(all_headers):
    '''print results and end program'''
    print dict(all_headers)
    reactor.stop()

agent = Agent(reactor)
urls = (line.strip() for line in open('urls.txt'))
reqs = [agent.request('HEAD', url).addCallback(get_headers, url) for url in urls if url]
defer.gatherResults(reqs).addCallback(got_everything)
reactor.run()

يبدأ هذا المثال جميع الطلبات بشكل غير متزامن ، وجمع جميع النتائج. إليك الإخراج لملف يحتوي على 3 عناوين URL:

{'http://debian.org': {'Content-Type': ['text/html; charset=iso-8859-1'],
                       'Date': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                       'Location': ['http://www.debian.org/'],
                       'Server': ['Apache'],
                       'Vary': ['Accept-Encoding']},
 'http://google.com': {'Cache-Control': ['public, max-age=2592000'],
                       'Content-Type': ['text/html; charset=UTF-8'],
                       'Date': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                       'Expires': ['Sat, 03 Apr 2010 13:27:25 GMT'],
                       'Location': ['http://www.google.com/'],
                       'Server': ['gws'],
                       'X-Xss-Protection': ['0']},
 'http://stackoverflow.com': {'Cache-Control': ['private'],
                              'Content-Type': ['text/html; charset=utf-8'],
                              'Date': ['Thu, 04 Mar 2010 13:27:24 GMT'],
                              'Expires': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                              'Server': ['Microsoft-IIS/7.5']}}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top