من فضلك تحمل معي لأنني جديد تمامًا مع Python و Github بشكل عام.
لقد كنت أستخدم الطلبات لكشط البيانات من متجر Play. أحتاج إلى تقديم عدد كبير من الطلبات (حوالي 20 ألفًا). إنه يعمل بشكل رائع لحوالي 3000-4000 طلب ولكنه يتعطل بعد ذلك (خطأ SSL). لست على دراية بـ SSL والطلبات ، لذلك لا أعرف سبب ذلك.
خطأ:
(SSLError Traceback (most recent call last)
<ipython-input-23-1da544640d89> in <module>()
53 time.sleep(0.1)
54
---> 55 r = requests.get('https://play.google.com' + link + '&hl=en')
56 link_tree = html.fromstring(r.content)
57 description = link_tree.xpath('//div[@jsname="C4s9Ed"]/text()') + link_tree.xpath('//div[@jsname="C4s9Ed"]/p/text()')
C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\api.pyc in get(url, params, **kwargs)
65
66 kwargs.setdefault('allow_redirects', True)
---> 67 return request('get', url, params=params, **kwargs)
68
69
C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\api.pyc in request(method, url, **kwargs)
51 # cases, and look like a memory leak in others.
52 with sessions.Session() as session:
---> 53 return session.request(method=method, url=url, **kwargs)
54
55
C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
466 }
467 send_kwargs.update(settings)
--> 468 resp = self.send(prep, **send_kwargs)
469
470 return resp
C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\sessions.pyc in send(self, request, **kwargs)
574
575 # Send the request
--> 576 r = adapter.send(request, **kwargs)
577
578 # Total elapsed time of the request (approximately)
C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
445 except (_SSLError, _HTTPError) as e:
446 if isinstance(e, _SSLError):
--> 447 raise SSLError(e, request=request)
448 elif isinstance(e, ReadTimeoutError):
449 raise ReadTimeout(e, request=request)
SSLError: EOF occurred in violation of protocol (_ssl.c:590) )
يبدو أن efi ، على github هذا ، لديه نفس المشكلة في هذا الموضوع: https://github.com/kennethreitz/requests/issues/3006 (انظر أدناه ، لم يكن OP) لكنني لم أتمكن من العثور عليه الخيط الذي فتحه لمزيد من المساعدة. أستخدم Python 2.7. أيضا.
لقد علقت في هذا الأمر لفترة طويلة الآن ولا يمكنني العثور على أي إجابة هنا ولا StackOverflow (ربما كانت الإجابة صحيحة تحت أنفي ولكني واجهت مشكلة في فهمها بسبب نقص معرفتي في SSL والطلبات) .
شكرًا لك مقدمًا على مساعدتك ، وآسف إذا كان هناك شيء غير واضح - يرجى إعلامي.
عندما تقول إنك عالق ، هل هذا هو الاستثناء فقط؟ أم أن طلبات المتابعة لا تعمل؟ أسأل بسبب حدوث أخطاء عابرة في الشبكة ، وإذا كنت تقدم عددًا كبيرًا من طلبات الويب ، فيجب أن تفكر في تنفيذ نوع من منطق إعادة المحاولة في مواجهة تلك الأخطاء.
حرائق الاستثناء. يبدو أن طلبات المتابعة تعمل ، لكني لم أحاول تنفيذ إعادة المحاولة بعد. كنت أخشى أنني كنت أعارض قواعد تقديم الكثير من الطلبات إلى خادم أو شيء من هذا القبيل ، على ما أعتقد.
سأحاول بالتأكيد ذلك وأقوم بتحديث هذا الموضوع. شكرا!
حسنًا ، لما يستحقه ، نظرًا لأنك تستخدم requests.*
فأنت تعرض نفسك لخطر زيادة التحميل على موارد الشبكة بينك وبين الخادم. يجب أن تحاول استخدام الجلسة .
لأي شخص لديه هذه المشكلة:
لقد أصلحته باتباع اقتراحات
import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries = 20)
sess.mount('http://', adapter)
بعد ذلك ، حيث كنت أستخدم requests.get()
قبل ، استخدمت sess.get()
.
نأمل أن يساعدك هذا ، وشكرًا على مساعدتك Lukasa !
كان لدي نفس رسالة الخطأ بالضبط ، كانت المشكلة أنني لم أقم بتثبيت عميل ndg-https
variable لقد قمت بتثبيت ndg-httpsclient ولكن الخطأ نفسه
التعليق الأكثر فائدة
كان لدي نفس رسالة الخطأ بالضبط ، كانت المشكلة أنني لم أقم بتثبيت عميل ndg-https
https://github.com/kennethreitz/requests/issues/3605