urllib2.HTTPError: HTTP Hatası 403: Yasak


104

Python kullanarak tarihi hisse senedi verilerinin indirilmesini otomatikleştirmeye çalışıyorum. Açmaya çalıştığım URL bir CSV dosyasıyla yanıt veriyor, ancak urllib2 kullanarak açamıyorum. Daha önce birkaç soruda belirtildiği gibi kullanıcı aracısını değiştirmeyi denedim, şanssız olarak yanıt çerezlerini bile kabul etmeye çalıştım. Lütfen yardım edebilir misin.

Not: Aynı yöntem yahoo Finance için de geçerlidir.

Kod:

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)

Hata

"C: \ Python27 \ lib \ urllib2.py" dosyası, satır 527, http_error_default HTTPError (req.get_full_url (), kod, msg, hdrs, fp) urllib2.HTTPError: HTTP Hatası 403: Yasaklandı

Yardımınız için teşekkürler


Pencereleri platform olarak mı kullanıyorsunuz?
Denis

Yanıtlar:


171

Birkaç başlık daha ekleyerek verileri alabildim:

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

Aslında, yalnızca bu ek başlıkla çalışır:

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

Orijinal talepte bu başlıklardan hangisinin eksik olduğunu düşünüyorsunuz?

1
kimlik: www.nseindia.com Accept-Encoding: kapanışında, Host: wireshark sadece User-Agent Bağlantı birlikte gönderildiği gösterdi
Andrean

1
Rica ederim, gerçekten yaptığım şey, betiğinizin url'sini bir tarayıcıda kontrol ettim ve orada çalışırken, tarayıcının gönderdiği tüm istek başlıklarını kopyalayıp buraya ekledim ve çözüm buydu.
andrean

1
@Mee aşağıdaki cevaba bir göz attın mı? özellikle python 3 için ele alındı, sizin için işe
yarayıp yaramadığını

1
diğer başlıkları (cevabımdan) yanı sıra isteğe eklemeyi deneyin. Yine de bir sunucunun 403 döndürmesinin başka birçok nedeni vardır, konuyla ilgili diğer yanıtları da kontrol edin. Hedefe gelince, google özellikle zor, kazınması biraz zor, kazınmayı önlemek için birçok yöntem uyguladılar.
andrean

52

Bu Python 3'te çalışacak

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
Bazı sitelerin (Wikipedia dahil) Python kütüphaneleri tarafından gönderilen "Python-urllib / xy" gibi yaygın tarayıcı olmayan kullanıcı aracıları dizelerini engellediği doğrudur. Düz bir "Mozilla" veya "Opera" bile genellikle bunu atlamak için yeterlidir. Elbette bu orijinal soru için geçerli değildir, ancak yine de bilmek yararlıdır.
efotinis

8

NSE web sitesi değişti ve eski komut dosyaları mevcut web sitesi için yarı optimum. Bu pasaj, günlük güvenlik ayrıntılarını toplayabilir. Ayrıntılar arasında sembol, güvenlik türü, önceki kapanış, açılış fiyatı, yüksek fiyat, düşük fiyat, ortalama fiyat, işlem gören miktar, ciro, işlem sayısı, teslim edilebilir miktarlar ve teslim edilen ve işlem görenlerin oranı yüzde olarak bulunur. Bunlar uygun bir şekilde sözlük formu listesi olarak sunulur.

İstek ve BeautifulSoup içeren Python 3.X sürümü

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)

Ayrıca bu nispeten modülerdir ve pasajı kullanıma hazırdır.


Teşekkürler dostum! @andrean'ın yukarıdaki cevabı yerine bu benim için çalıştı
Nitish Kumar Pal

Merhaba, artık kafamı nereye vuracağımı gerçekten bilmiyorum, bu çözümü ve daha fazlasını denedim ama sürekli 403 hatası alıyorum. Deneyebileceğim başka bir şey var mı?
Francesco

403 durumu, tarayıcınızın bu hizmeti kullanmak için kimliğinin doğrulanmadığını bildirmek içindir. Sizin durumunuzda, gerçekten temel kimlik doğrulama, oauth vb. İle kimlik doğrulaması gerektiriyor olabilir.
Supreet Sethi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.