سؤال

حسنًا ، أنا بحاجة إلى تنزيل بعض صفحات الويب باستخدام Python وقام بإجراء تحقيق سريع في خياراتي.

مدرجة مع بيثون:

urllib - يبدو لي أنني يجب أن أستخدم urllib2 بدلاً من ذلك. Urllib ليس لديه دعم ملف تعريف الارتباط ، HTTP/FTP/ملفات محلية فقط (بدون SSL)

urllib2 - لا يدعم عميل HTTP/FTP ، ويدعم معظم الأشياء التي تشتد الحاجة إليها مثل ملفات تعريف الارتباط ، جميع أفعال HTTP (فقط Get and Post ، بدون أثر ، إلخ)

مميز كامل:

ميكانيكي - يمكن استخدام/حفظ ملفات تعريف الارتباط Firefox/IE ، اتخاذ إجراءات مثل متابعة الرابط الثاني ، يتم الحفاظ عليها بنشاط (0.2.5 تم إصدارها في مارس 2011)

pycurl - يدعم كل ما يفعله Curl (FTP ، FTPs ، HTTP ، HTTPS ، Gopher ، Telnet ، DICT ، FILE و LDAP) ، الأخبار السيئة: لم يتم تحديثها منذ 9 سبتمبر 2008 (7.19.0)

إمكانيات جديدة:

urllib3 - يدعم إعادة الاستخدام/التجميع ونشر الملفات

تم إهماله (ويعرف أيضًا باسم استخدام urllib/urllib2 بدلاً من ذلك):

httplib - HTTP/HTTPS فقط (لا FTP)

httplib2 - HTTP/HTTPS فقط (لا FTP)

أول شيء يثيرني هو أن urllib/urllib2/pycurl/الميكانيكي كلها حلول ناضجة جميلة تعمل بشكل جيد. ميكانيكي وشحن Pycurl مع عدد من توزيعات Linux (مثل Fedora 13) و BSDs لذلك التثبيت هو مشكلة غير عادة (لذلك هذا جيد).

يبدو Urllib2 جيدًا ، لكنني أتساءل لماذا يبدو Pycurl و Mechanize كلاهما شائعين جدًا ، هل هناك شيء أفتقده (أي إذا كنت أستخدم urllib2 هل سأرسم نفسي في زاوية في مرحلة ما؟). أود حقًا بعض التعليقات حول إيجابيات/سلبيات هذه الأشياء حتى أتمكن من اتخاذ الخيار الأفضل بنفسي.

تحرير: ملاحظة أضيفت على دعم الفعل في urllib2

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

المحلول

  • urllib2 تم العثور عليه في كل تثبيت Python في كل مكان ، وكذلك قاعدة جيدة للبدء.
  • PycURL مفيد للأشخاص الذين يستخدمون بالفعل لاستخدام libcurl ، يعرض المزيد من التفاصيل المنخفضة المستوى لـ HTTP ، بالإضافة إلى أنه يكسب أي إصلاحات أو تحسينات مطبقة على libcurl.
  • mechanize يستخدم لقيادة اتصال باستمرار مثل المتصفح.

إنها ليست مسألة واحدة أفضل من الآخر ، إنها مسألة اختيار الأداة المناسبة لهذا الوظيفة.

نصائح أخرى

أعتقد أن هذا الحديث (في Pycon 2009) ، لديه إجابات لما تبحث عنه (لدى Asheshesh Laroia الكثير من الخبرة في هذا الشأن). ويشير إلى الخير والسيئ من معظم قائمتك

من جدول Pycon 2009:

هل تجد نفسك تواجه مواقع الويب التي تحتوي على بيانات تحتاج إلى استخراجها؟ هل ستكون حياتك أكثر بساطة إذا تمكنت من إدخال البيانات برمجيًا في تطبيقات الويب ، حتى تلك التي تم ضبطها لمقاومة التفاعل بواسطة الروبوتات؟

سنناقش أساسيات تجريف الويب ، ثم الغوص في تفاصيل الأساليب المختلفة وحيث تكون أكثر قابلية للتطبيق.

ستترك مع فهم متى يجب تطبيق أدوات مختلفة ، وتعرف على "مطرقة ثقيلة" لتجريف الشاشة التي التقطتها في مشروع لمؤسسة Frontier Electronic.

يجب على atendees إحضار جهاز كمبيوتر محمول ، إن أمكن ، لتجربة الأمثلة التي نناقشها وتدوين الملاحظات اختياريًا.

تحديث:قام Asheshesh Laroia بتحديث عرضه التقديمي لـ Pycon 2010

  • Pycon 2010: كشط الويب: استراتيجيات لمواقع البرمجة التي لا تتوقع ذلك

    * My motto: "The website is the API."
    * Choosing a parser: BeautifulSoup, lxml, HTMLParse, and html5lib.
    * Extracting information, even in the face of bad HTML: Regular expressions, BeautifulSoup, SAX, and XPath.
    * Automatic template reverse-engineering tools.
    * Submitting to forms.
    * Playing with XML-RPC
    * DO NOT BECOME AN EVIL COMMENT SPAMMER.
    * Countermeasures, and circumventing them:
          o IP address limits
          o Hidden form fields
          o User-agent detection
          o JavaScript
          o CAPTCHAs 
    * Plenty of full source code to working examples:
          o Submitting to forms for text-to-speech.
          o Downloading music from web stores.
          o Automating Firefox with Selenium RC to navigate a pure-JavaScript service. 
    * Q&A; and workshopping
    * Use your power for good, not evil. 
    

تحديث 2:

Pycon US 2012 - تجريف الويب: سحب البيانات بشكل موثوق وكفاءة من الصفحات التي لا تتوقعها

المعلومات المثيرة محاصرة في صفحات الويب وخلف نماذج HTML. في هذا البرنامج التعليمي ، سوف تتعلم كيفية تحليل تلك الصفحات ومتى يتم تطبيق التقنيات المتقدمة التي تجعل من تجريف أسرع وأكثر استقرارًا. سنقوم بتغطية التنزيل الموازي مع Twisted و Gevent و> وغيرها ؛ تحليل المواقع وراء SSL. قيادة مواقع JavaScript-Y مع السيلينيوم ؛ و> تهرب من تقنيات مكافحة الانتشار المشتركة.

بيثون الطلبات هو أيضا مرشح جيد لأشياء HTTP. إنه يحتوي على API IMHO ، وهو مثال على طلب HTTP من وثائقها غير الحكومية:

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...

"للحصول على بعض صفحات الويب" ، استخدم الطلبات!

من http://docs.python-requests.org/en/latest/ :

توفر وحدة URLLIB2 القياسية من Python معظم إمكانيات HTTP التي تحتاجها ، ولكن API مكسورة تمامًا. تم بناؤه لوقت مختلف - وشبكة مختلفة. يتطلب الأمر قدرًا هائلاً من العمل (حتى تجاوزات الطريقة) لأداء أبسط المهام.

لا ينبغي أن تكون الأمور على هذا النحو. ليس في بيثون.

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

لا تقلق بشأن "آخر تحديث". لم يتغير HTTP كثيرًا في السنوات القليلة الماضية ؛)

urllib2 هو الأفضل (كما هو في ثنائية المليون) ، ثم قم بالتبديل إلى الميكانيكي إذا كنت بحاجة إلى ملفات تعريف الارتباط من Firefox. يمكن استخدام الميكانيكية كبديل للمنزل لـ urllib2 - لديهم طرق متشابهة وما إلى ذلك. استخدام ملفات تعريف الارتباط Firefox يعني أنه يمكنك الحصول على أشياء من المواقع (مثل Say ScackOverflow) باستخدام بيانات اعتماد تسجيل الدخول الشخصية الخاصة بك. فقط كن مسؤولاً عن عدد الطلبات الخاصة بك (أو ستحصل على حظر).

Pycurl هو للأشخاص الذين يحتاجون إلى جميع الأشياء منخفضة المستوى في libcurl. سأحاول المكتبات الأخرى أولاً.

يدعم urllib2 فقط HTTP GET والنشر ، قد يكون هناك حلول ، ولكن إذا كان تطبيقك يعتمد على أفعال HTTP الأخرى ، فمن المحتمل أن تفضل وحدة مختلفة.

كل مكتبة Python التي تتحدث HTTP لها مزاياها الخاصة.

استخدم تلك التي لديها الحد الأدنى من الميزات اللازمة لمهمة معينة.

قائمتك مفقودة على الأقل urllib3 - مكتبة HTTP من طرف ثالث رائع يمكنها إعادة استخدام اتصال HTTP ، وبالتالي تسرع بشكل كبير عملية استرداد عناوين URL متعددة من نفس الموقع.

ألقِ نظرة على الاستيلاء (http://grablib.org). إنها مكتبة شبكة توفر واجهتين رئيسيتين: 1) انتزاع لإنشاء طلبات الشبكة وحوض تحليل البيانات المستردة 2) عنكبوت لإنشاء كاشفات الموقع السائبة

تحت Hood Grab ، يستخدم Pycurl و LXML ولكن من الممكن استخدام عمليات نقل الشبكة الأخرى (على سبيل المثال ، مكتبة الطلبات). طلبات النقل لم يتم اختبارها جيدًا بعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top