Pycurl والكثير من وظائف رد الاتصال
سؤال
لدي قائمة URL كبيرة ، والتي يتعين علي تنزيلها بالتوازي والتحقق من أحد الرؤوس التي يتم إرجاعها مع كل استجابة.
استطيع ان استخدم curlmulti للتوازي. استطيع ان استخدم /dev/null
بصفتي FB ، لأنني لست مهتمًا بالجسم ، فقط الرؤوس.
ولكن كيف يمكنني التحقق من كل رأس؟
لتلقي رأس ، يجب أن أعدد رد اتصال HeaderFunction. أحصل على ذلك.
لكن في وظيفة رد الاتصال هذه ، أحصل على عازلة فقط مع الرؤوس. كيف يمكنني التمييز بين طلب واحد؟
لا أحب فكرة إنشاء الكثير من وظائف رد الاتصال كما توجد عناوين URL. هل يجب أن أقوم بإنشاء بعض الفصول الدراسية والكثير من الحالات من تلك الفئة؟ أيضا ليس ذكي جدا.
المحلول 3
يتمثل الحل في استخدام القليل من البرمجة الوظيفية "لالتصاق" ببعض المعلومات الإضافية لوظيفة رد الاتصال لدينا.
نصائح أخرى
أود استخدام وحدات 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']}}