urllib2.HTTPError: HTTP एरर 403: निषिद्ध


102

मैं अजगर का उपयोग करके ऐतिहासिक स्टॉक डेटा के डाउनलोड को स्वचालित करने की कोशिश कर रहा हूं। वह URL जिसे मैं CSV फ़ाइल के साथ प्रतिक्रिया देने का प्रयास कर रहा हूं, लेकिन मैं urllib2 का उपयोग करके खोलने में असमर्थ हूं। मैंने उपयोगकर्ता एजेंट बदलने की कोशिश की है जैसा कि पहले कुछ प्रश्नों में निर्दिष्ट किया गया था, मैंने भी प्रतिक्रिया कुकीज़ को स्वीकार करने की कोशिश की, बिना किसी भाग्य के। क्या आप मदद कर सकते हैं

नोट: वही विधि याहू वित्त के लिए काम करती है।

कोड:

import urllib2,cookielib

site= "http://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/getHistoricalData.jsp?symbol=JPASSOCIAT&fromDate=1-JAN-2012&toDate=1-AUG-2012&datePeriod=unselected&hiddDwnld=true"

hdr = {'User-Agent':'Mozilla/5.0'}

req = urllib2.Request(site,headers=hdr)

page = urllib2.urlopen(req)

त्रुटि

फ़ाइल "C: \ Python27 \ lib \ urllib2.py", पंक्ति 527, http_error_default में HTTPError (req.get_full_url (), code, msg, hdrs, fp) urllib2.HTTPError: HTTP त्रुटि 403: बढ़ाएँ।

आपकी सहायता के लिए धन्यवाद


क्या आप प्लेटफॉर्म के रूप में खिड़कियों का उपयोग करते हैं?
डेनिस

जवाबों:


170

कुछ और हेडर जोड़कर मैं डेटा प्राप्त करने में सक्षम था:

import urllib2,cookielib

site= "http://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/getHistoricalData.jsp?symbol=JPASSOCIAT&fromDate=1-JAN-2012&toDate=1-AUG-2012&datePeriod=unselected&hiddDwnld=true"
hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
       'Accept-Encoding': 'none',
       'Accept-Language': 'en-US,en;q=0.8',
       'Connection': 'keep-alive'}

req = urllib2.Request(site, headers=hdr)

try:
    page = urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.fp.read()

content = page.read()
print content

वास्तव में, यह सिर्फ एक अतिरिक्त हेडर के साथ काम करता है:

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

आपको लगता है कि इन हेडरों में से कौन सा मूल अनुरोध से गायब था?

1
वायरशार्क ने दिखाया कि केवल यूजर-एजेंट को कनेक्शन के साथ भेजा गया था: नज़दीकी, होस्ट: www.nseindia.com, स्वीकार-एनकोडिंग: पहचान
andrean

1
आपका स्वागत है, अच्छा है कि मैंने वास्तव में क्या किया है। मैंने एक ब्राउज़र में आपकी स्क्रिप्ट से url की जाँच की है, और जैसा कि वहाँ काम किया है, मैंने अभी भेजे गए ब्राउज़र के सभी अनुरोध हेडर कॉपी किए हैं, और उन्हें यहाँ जोड़ा है, और वह समाधान था।
andrean

1
@ क्या आपने नीचे दिए जवाब पर एक नज़र डाली? यह विशेष रूप से अजगर 3 के लिए संबोधित किया गया था, जांचें कि क्या यह आपके लिए काम करता है ...
andrean

1
अन्य हेडर (मेरे उत्तर से) के अनुरोध के साथ जोड़ने का प्रयास करें। अभी भी कई अन्य कारण हैं कि कोई सर्वर 403 क्यों लौटा सकता है, इस विषय पर अन्य उत्तरों की भी जाँच करें। लक्ष्य के लिए, Google विशेष रूप से कठिन है, थोड़े कठिन परिमार्जन के लिए, उन्होंने स्क्रैपिंग को रोकने के लिए कई तरीके लागू किए हैं।
andrean

50

यह पायथन 3 में काम करेगा

import urllib.request

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'

url = "http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers"
headers={'User-Agent':user_agent,} 

request=urllib.request.Request(url,None,headers) #The assembled request
response = urllib.request.urlopen(request)
data = response.read() # The data u need

2
यह सच है कि कुछ साइटें (विकिपीडिया सहित) सामान्य गैर-ब्राउज़र उपयोगकर्ता एजेंट स्ट्रिंग्स पर ब्लॉक करती हैं, जैसे कि पायथन के पुस्तकालयों द्वारा भेजे गए "पायथन-यूरलिब / एक्सवाई"। यहां तक ​​कि एक सादे "मोज़िला" या "ओपेरा" आमतौर पर उस को बायपास करने के लिए पर्याप्त है। यह मूल प्रश्न पर लागू नहीं होता है, लेकिन यह जानना अभी भी उपयोगी है।
efotinis

7

एनएसई वेबसाइट बदल गई है और पुरानी स्क्रिप्ट वर्तमान वेबसाइट के लिए अर्ध-इष्टतम हैं। यह स्निपेट सुरक्षा के दैनिक विवरण एकत्र कर सकता है। विवरण में प्रतीक, सुरक्षा प्रकार, पिछले करीबी, खुली कीमत, उच्च कीमत, कम कीमत, औसत मूल्य, कारोबार की मात्रा, कारोबार, ट्रेडों की संख्या, वितरण योग्य मात्रा और वितरित बनाम अनुपात का प्रतिशत शामिल है। इन्हें आसानी से शब्दकोष की सूची के रूप में प्रस्तुत किया गया है।

पायथन 3.X संस्करण अनुरोधों और ब्यूटीफुल के साथ

from requests import get
from csv import DictReader
from bs4 import BeautifulSoup as Soup
from datetime import date
from io import StringIO 

SECURITY_NAME="3MINDIA" # Change this to get quote for another stock
START_DATE= date(2017, 1, 1) # Start date of stock quote data DD-MM-YYYY
END_DATE= date(2017, 9, 14)  # End date of stock quote data DD-MM-YYYY


BASE_URL = "https://www.nseindia.com/products/dynaContent/common/productsSymbolMapping.jsp?symbol={security}&segmentLink=3&symbolCount=1&series=ALL&dateRange=+&fromDate={start_date}&toDate={end_date}&dataType=PRICEVOLUMEDELIVERABLE"




def getquote(symbol, start, end):
    start = start.strftime("%-d-%-m-%Y")
    end = end.strftime("%-d-%-m-%Y")

    hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
         'Referer': 'https://cssspritegenerator.com',
         'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
         'Accept-Encoding': 'none',
         'Accept-Language': 'en-US,en;q=0.8',
         'Connection': 'keep-alive'}

    url = BASE_URL.format(security=symbol, start_date=start, end_date=end)
    d = get(url, headers=hdr)
    soup = Soup(d.content, 'html.parser')
    payload = soup.find('div', {'id': 'csvContentDiv'}).text.replace(':', '\n')
    csv = DictReader(StringIO(payload))
    for row in csv:
        print({k:v.strip() for k, v in row.items()})


 if __name__ == '__main__':
     getquote(SECURITY_NAME, START_DATE, END_DATE)

इसके अलावा यह अपेक्षाकृत मॉड्यूलर है और स्निपेट का उपयोग करने के लिए तैयार है।


धन्यवाद दोस्त! यह मेरे लिए @andrean
नीतीश कुमार पाल

नमस्ते, मैं वास्तव में नहीं जानता कि मेरे सिर को कहां से पीटना है, मैंने इस समाधान की कोशिश की है और कई और अधिक लेकिन मैं 403 त्रुटि प्राप्त करता रहता हूं। क्या कुछ और है जो मैं कोशिश कर सकता हूं?
फ्रांसेस्को

403 स्टेटस यह सूचित करने के लिए है कि आपका ब्राउज़र इस सेवा का उपयोग करने के लिए प्रमाणित नहीं है। ऐसा हो सकता है कि आपके मामले में, इसे मूल रूप से आधारभूत, ऑउथ आदि के साथ प्रमाणीकरण की आवश्यकता है
सुप्रीत सेठी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.