urllib2.HTTPError: HTTP ত্রুটি 403: নিষিদ্ধ


107

আমি পাইথন ব্যবহার করে historicতিহাসিক স্টক ডেটার ডাউনলোড স্বয়ংক্রিয় করার চেষ্টা করছি। আমি যে ইউআরএলটি একটি সিএসভি ফাইলের মাধ্যমে প্রতিক্রিয়াগুলি খোলার চেষ্টা করছি, তবে 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)

ত্রুটি

"সি: \ পাইথন 27 \ lib \ urllib2.py", লাইন 527, HT_error_default মধ্যে HTTPError (req.get_full_url (), কোড, চিত্র, এইচডিআরএস, এফপি) urllib2.HTTPError: HTTP ত্রুটি 403: নিষিদ্ধ

আপনার সাহায্যের জন্য ধন্যবাদ


প্ল্যাটফর্ম হিসাবে আপনি উইন্ডোজ ব্যবহার করছেন?
ডেনিস

উত্তর:


173

আরও কয়েকটি শিরোনাম যুক্ত করে আমি ডেটা পেতে সক্ষম হয়েছি:

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',

আপনার কাছে এই শিরোলেখগুলির মধ্যে কোনটি মনে করছেন যে মূল অনুরোধটি অনুপস্থিত ছিল?

4
ওয়্যারশার্ক দেখিয়েছে যে কেবল ব্যবহারকারী-এজেন্ট প্রেরণ করা হয়েছিল, সাথে সংযোগ: বন্ধ, হোস্ট: www.nseindia.com, স্বীকৃতি-এনকোডিং: পরিচয়
Andrean

4
আপনাকে স্বাগতম, ভাল আমি যা করেছি তা হ'ল আমি আপনার স্ক্রিপ্ট থেকে ইউআরএল একটি ব্রাউজারে যাচাই করেছি এবং এটি সেখানে কাজ করার সাথে সাথে আমি ব্রাউজারটি প্রেরিত সমস্ত অনুরোধ শিরোনামগুলি অনুলিপি করে এখানে রেখেছি, এবং এটিই সমাধান ছিল।
Andrean

4
@ আপনি নীচের উত্তরটি একবার দেখেছেন? এটি অজগর 3 জন্য বিশেষভাবে সম্বোধন করা হয়েছিল, এটি আপনার পক্ষে কাজ করে কিনা তা পরীক্ষা করে দেখুন ...
Andrean

4
অনুরোধে অন্য শিরোনামগুলি (আমার উত্তর থেকে) যুক্ত করার চেষ্টা করুন। এখনও আরও অনেক কারণ রয়েছে যে কেন একটি সার্ভার 403 ফেরত দিতে পারে, সেই সাথে এই বিষয়ে অন্যান্য উত্তরগুলিও পরীক্ষা করে দেখুন। লক্ষ্য হিসাবে, গুগল বিশেষত একটি শক্ত, স্ক্র্যাপ করা খুব কঠিন, তারা স্ক্র্যাপিং প্রতিরোধে অনেকগুলি পদ্ধতি প্রয়োগ করেছে।
Andrean

53

এটি পাইথন 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

4
এটি সত্য যে কিছু সাইট (উইকিপিডিয়া সহ) সাধারণ অ ব্রাউজার ব্যবহারকারী এজেন্টদের স্ট্রিংগুলিতে ব্লক করে, পাইথনের লাইব্রেরি দ্বারা প্রেরিত "পাইথন-urllib / xy" এর মতো। এমনকি একটি সরল "মজিলা" বা "অপেরা" এটিকে বাইপাস করার জন্য যথেষ্ট। এটি অবশ্যই মূল প্রশ্নের ক্ষেত্রে প্রযোজ্য নয়, তবে এটি এখনও দরকারী।
এফোটিনিস

8

এনএসইর ওয়েবসাইট পরিবর্তিত হয়েছে এবং পুরানো স্ক্রিপ্টগুলি বর্তমান ওয়েবসাইটের কাছে আধা-সর্বোত্তম। এই স্নিপেট প্রতিদিনের সুরক্ষার বিশদ বিবরণ সংগ্রহ করতে পারে। বিশদের মধ্যে প্রতীক, সুরক্ষা প্রকার, পূর্বের নিকটবর্তী, ওপেন প্রাইস, উচ্চ মূল্য, কম দাম, গড় মূল্য, ব্যবসায়ের পরিমাণ, টার্নওভার, ব্যবসার সংখ্যা, বিতরণযোগ্য পরিমাণ এবং শতাংশে বিতরিত বনামের অনুপাত অন্তর্ভুক্ত রয়েছে। এগুলি অভিধানের ফর্মের তালিকা হিসাবে সুবিধামত উপস্থাপন করা হয়েছে।

অনুরোধ এবং বিউটিউলসুপ সহ পাইথন 3. এক্স সংস্করণ

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 করেই চলেছি I আমি চেষ্টা করার মতো আরও কিছু আছে কি?
ফ্রান্সেসকো

403 স্থিতিটি বোঝাতে বোঝানো হয় যে আপনার ব্রাউজারটি এই পরিষেবাটি ব্যবহারের জন্য অনুমোদিত নয়। এমনও হতে পারে যে, আপনার ক্ষেত্রে, এটা সত্যি সত্যি বুনিয়াদি প্রমাণীকরণ সঙ্গে প্রমাণীকরণ, OAuth ইত্যাদি প্রয়োজন
Supreet শেঠি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.