पायथन 3 वेब स्क्रैपिंग में HTTP त्रुटि 403


100

मैं अभ्यास के लिए एक वेबसाइट को स्क्रैप करने की कोशिश कर रहा था, लेकिन मैं HTTP एरर 403 प्राप्त कर रहा था (क्या ऐसा लगता है कि मैं बॉट हूं)?

यहाँ मेरा कोड है:

#import requests
import urllib.request
from bs4 import BeautifulSoup
#from urllib import urlopen
import re

webpage = urllib.request.urlopen('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1').read
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')

row_array = re.findall(findrows, webpage)
links = re.finall(findlink, webpate)

print(len(row_array))

iterator = []

मुझे जो त्रुटि मिलती है वह है:

 File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python33\lib\urllib\request.py", line 479, in open
    response = meth(req, response)
  File "C:\Python33\lib\urllib\request.py", line 591, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python33\lib\urllib\request.py", line 517, in error
    return self._call_chain(*args)
  File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
    result = func(*args)
  File "C:\Python33\lib\urllib\request.py", line 599, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

जवाबों:


208

यह संभवतः mod_securityया कुछ इसी तरह के सर्वर सुरक्षा फीचर के कारण है जो ज्ञात स्पाइडर / बॉट यूजर एजेंट को ब्लॉक urllibकरता है ( कुछ ऐसा उपयोग करता है python urllib/3.3.0, यह आसानी से पता चल जाता है)। इसके साथ एक ज्ञात ब्राउज़र उपयोगकर्ता एजेंट सेट करने का प्रयास करें:

from urllib.request import Request, urlopen

req = Request('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1', headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()

यह मेरे लिए काम करता है।

वैसे, अपने कोड में आप याद कर रहे हैं ()के बाद .readमें urlopenलाइन, लेकिन मुझे लगता है कि यह एक टाइपो है।

टीआईपी: चूंकि यह व्यायाम है, इसलिए एक अलग, गैर प्रतिबंधक साइट चुनें। शायद वे urllibकिसी कारण से अवरुद्ध कर रहे हैं ...


मुझे लगता है कि reqकई urlopenकॉल के लिए पुन: उपयोग करना सुरक्षित है ।
एक्यूमेनस

यह थोड़ी देर हो सकती है, लेकिन मेरे पास पहले से ही मेरे कोड में उपयोगकर्ता-एजेंट हैं, फिर भी यह मुझे देता हैError 404: Access denied
रीमा पारख

यह काम करता है, लेकिन मुझे लगता है कि उनके पास बॉट्स ब्लॉक करने का एक अच्छा कारण होना चाहिए और मैं उनकी सेवा की शर्तों का उल्लंघन कर रहा हूं
xjcl

39

उपयोगकर्ता एजेंट के आधार पर आपके urlib के उपयोग के कारण निश्चित रूप से यह अवरुद्ध है। यही बात मुझे ऑफरअप के साथ हो रही है। आप AppURLopener नाम से एक नया वर्ग बना सकते हैं जो उपयोगकर्ता-एजेंट को मोज़िला के साथ ओवरराइड करता है।

import urllib.request

class AppURLopener(urllib.request.FancyURLopener):
    version = "Mozilla/5.0"

opener = AppURLopener()
response = opener.open('http://httpbin.org/user-agent')

स्रोत


2
शीर्ष जवाब मेरे लिए काम नहीं किया, जबकि तुम्हारा किया था। आपका बहुत बहुत धन्यवाद!
तरुण उदय

यह ठीक काम करता है, लेकिन मुझे इसके लिए ssl कॉन्फ़िगरेशन संलग्न करना होगा। मैं यह कैसे करु? इससे पहले कि मैं इसे एक दूसरे पैरामीटर के रूप में जोड़ता (urlopen (अनुरोध, संदर्भ = ctx))
Hauke

2
ऐसा लगता है कि यह खुला था, लेकिन यह कहता है 'ValueError: बंद फ़ाइल का
पाठ

@zeta आपने ऑफ़रअप को परिमार्जन करने और स्क्रिप्ट से खोज करने के लिए अपेक्षित भू निर्देशांक प्रदान करने का प्रबंधन कैसे किया?
CJ ट्रैविस

@CJTravis, मैं ऑफ़रअप को स्क्रैप नहीं कर रहा था। मैं किसी आइटम के सटीक URL के आधार पर केवल आइटम मान प्राप्त कर रहा था। मेरे लिए किसी भू-निर्देशांक की आवश्यकता नहीं थी
जेटा

13

"यह संभवतः mod_security या कुछ समान सर्वर सुरक्षा सुविधा के कारण है जो ज्ञात ब्लॉक करता है

मकड़ी / बोट

उपयोगकर्ता एजेंट (urllib python urllib / 3.3.0 जैसी किसी चीज़ का उपयोग करता है, यह आसानी से पता चल जाता है) "- जैसा कि पहले से ही Stefano Sanfilippo द्वारा बताया गया है

from urllib.request import Request, urlopen
url="https://stackoverflow.com/search?q=html+error+403"
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})

web_byte = urlopen(req).read()

webpage = web_byte.decode('utf-8')

Web_byte सर्वर और वेबपेज में सामग्री प्रकार वर्तमान द्वारा लौटाए गए एक बाइट वस्तु है ज्यादातर है utf-8 । इसलिए आपको डीकोड विधि का उपयोग करके web_byte को डीकोड करना होगा।

जब मैं PyCharm का उपयोग कर एक वेबसाइट से स्क्रैप करने की कोशिश कर रहा था, तब यह पूरी समस्या हल करता है

PS -> मैं अजगर 3.4 का उपयोग करता हूं


2

पिछले उत्तर के आधार पर,

from urllib.request import Request, urlopen       
#specify url
url = 'https://xyz/xyz'
req = Request(url, headers={'User-Agent': 'XYZ/3.0'})
response = urlopen(req, timeout=20).read()

इसने टाइमआउट का विस्तार करके मेरे लिए काम किया।


1

चूंकि पेज ब्राउज़र में काम करता है, न कि अजगर प्रोग्राम के दौरान कॉल करने पर, ऐसा लगता है कि वेब ऐप जो कि url परोसता है, यह पहचानता है कि आप ब्राउज़र द्वारा कंटेंट का अनुरोध करते हैं।

प्रदर्शन:

curl --dump-header r.txt http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1

...
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
You don't have permission to access ...
</HTML>

और r.txt में सामग्री की स्थिति रेखा है:

HTTP/1.1 403 Forbidden

हेडर 'यूजर-एजेंट' पोस्ट करने की कोशिश करें जो वेब क्लाइंट को फेक करता है।

नोट: पृष्ठ में अजाक्स कॉल है जो उस तालिका को बनाता है जिसे आप पार्स करना चाहते हैं। आपको यह देखने के लिए पृष्ठ की जावास्क्रिप्ट तर्क या बस ब्राउज़र डीबगर (जैसे फायरबग / नेट टैब) का उपयोग करने की आवश्यकता होगी, यह देखने के लिए कि आपको तालिका की सामग्री प्राप्त करने के लिए किस url को कॉल करने की आवश्यकता है।


1

आप दो तरीकों से कोशिश कर सकते हैं। विस्तार इस लिंक में है

1) वाया पाइप

पाइप स्थापित - अद्यतन सर्टिफिकेट

2) अगर यह काम नहीं करता है, तो एक Cer Cer.com.mand चलाने की कोशिश करें जो Python 3 के साथ बंडल में आता है। * Mac के लिए: (अपने अजगर स्थापना स्थान पर जाएं और फ़ाइल पर डबल क्लिक करें)

खुले / अनुप्रयोग / पायथन \ 3। * / स्थापित \ सर्टिफिकेट। com


0

यदि आप उपयोगकर्ता-एजेंट को मोज़िला के रूप में फीका करने के बारे में दोषी महसूस करते हैं (स्टीफनो के शीर्ष उत्तर में टिप्पणी), तो यह एक गैर-urllib उपयोगकर्ता-एजेंट के साथ भी काम कर सकता है। यह उन साइटों के लिए काम करता है जिन्हें मैं संदर्भित करता हूं:

    req = urlrequest.Request(link, headers={'User-Agent': 'XYZ/3.0'})
    urlrequest.urlopen(req, timeout=10).read()

मेरा आवेदन अपने लेखों में मेरे द्वारा निर्दिष्ट विशिष्ट लिंक को स्क्रैप करके वैधता का परीक्षण करना है। जेनेरिक स्क्रैपर नहीं।


0

पिछले उत्तरों के आधार पर इसने मेरे लिए पायथन 3.7 के साथ काम किया है

from urllib.request import Request, urlopen

req = Request('Url_Link', headers={'User-Agent': 'XYZ/3.0'})
webpage = urlopen(req, timeout=10).read()

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