urlib2HTTP 오류: HTTP 오류 403: 금지됨
python을 이용하여 역사적인 스톡 데이터의 다운로드를 자동화하려고 합니다.열려고 하는 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 raiseHTPError(req.get_full_url()), 코드, msg, hdrs, fp) urlib2.HTTP 오류: HTTP 오류 403: 금지됨
당신의 도움에 감사드립니다.
헤더를 몇 개 더 추가함으로써 데이터를 얻을 수 있었습니다.
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',
이것은 파이썬 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
NSE 웹사이트가 변경되었고 이전 스크립트는 현재 웹사이트에 반최적입니다.이 토막글은 보안에 대한 일별 세부 정보를 수집할 수 있습니다.세부 정보에는 기호, 보안 유형, 이전 종가, 공개 가격, 고가, 저가, 평균 가격, 거래 수량, 거래 횟수, 인도 가능 수량 및 거래 비율이 포함됩니다.이것들은 편리하게 사전 양식의 목록으로 제시됩니다.
요청 및 BeautifulSoup이 포함된 Python 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)
이 외에도 비교적 모듈식이며 스니펫을 사용할 준비가 되어 있습니다.
이 오류는 일반적으로 요청하는 서버가 요청이 어디서 오는지 모를 때 발생하며, 서버는 원하지 않는 방문을 방지하기 위해 이 오류를 수행합니다.머리글을 정의하고 urlib.request를 통해 전달하면 이 오류를 무시할 수 있습니다.
여기 코드:
#defining header
header= {'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'}
#the URL where you are requesting at
req = urllib.request.Request(url=your_url, headers=header)
page = urllib.request.urlopen(req).read()
시도해 볼만한 한 가지가 있는데 파이썬 버전을 업데이트하는 것입니다.몇 달 전에 윈도우 10에서 내 크롤링 스크립트 중 하나가 403으로 작동을 멈췄습니다.user_agents가 도움이 되지 않아 스크립트를 포기하려고 했습니다.오늘 파이썬(3.8.5 - 64비트)으로 우분투에서 동일한 스크립트를 시도해 보았는데 오류없이 작동했습니다.python 버전의 Windows는 3.6.2 - 32비트로 약간 오래되었습니다.윈도우 10에서 파이썬을 3.9.5 - 64bit로 업그레이드하고 나면 403이 더 이상 보이지 않습니다.시도해 보면 'pip freeze > requirements.txt'를 실행하여 패키지 항목을 내보내는 것도 잊지 마십시오.저는 당연히 잊어버렸습니다.이 게시물은 앞으로 403이 다시 돌아올 때 나에게도 상기시켜주는 글입니다.
import urllib.request
bank_pdf_list = ["https://www.hdfcbank.com/content/bbp/repositories/723fb80a-2dde-42a3-9793-7ae1be57c87f/?path=/Personal/Home/content/rates.pdf",
"https://www.yesbank.in/pdf/forexcardratesenglish_pdf",
"https://www.sbi.co.in/documents/16012/1400784/FOREX_CARD_RATES.pdf"]
def get_pdf(url):
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 = "https://www.yesbank.in/pdf/forexcardratesenglish_pdf"
headers={'User-Agent':user_agent,}
request=urllib.request.Request(url,None,headers) #The assembled request
response = urllib.request.urlopen(request)
#print(response.text)
data = response.read()
# print(type(data))
name = url.split("www.")[-1].split("//")[-1].split(".")[0]+"_FOREX_CARD_RATES.pdf"
f = open(name, 'wb')
f.write(data)
f.close()
for bank_url in bank_pdf_list:
try:
get_pdf(bank_url)
except:
pass
언급URL : https://stackoverflow.com/questions/13303449/urllib2-httperror-http-error-403-forbidden
'IT' 카테고리의 다른 글
Oracle에서 각 그룹의 최대값을 얻는 방법은 무엇입니까? (0) | 2023.09.15 |
---|---|
ADO.NET을 사용하여 오라클 패키지 내 프로시저의 저장 프로시저 메타데이터 가져오기 (0) | 2023.09.15 |
everyauth vs passport.js? (0) | 2023.09.15 |
LXD 공유 /var/lib/mysql을 호스트에서 컨테이너로 공유하고 사용자/그룹을 매핑합니다. (0) | 2023.09.15 |
오류 ""DataFrame' 개체에 '첨부' 속성이 없습니다." (0) | 2023.09.15 |