122

Pythonを使用して過去の株式データのダウンロードを自動化しようとしています。開こうとしているURLはCSVファイルで応答しますが、urllib2を使用して開くことができません。以前のいくつかの質問で指定されているようにユーザーエージェントを変更しようとしましたが、応答Cookieを受け入れようとしましたが、運がありませんでした。助けてくれませんか。

注:同じ方法がyahooFinanceでも機能します。

コード:

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 Error 403:Forbidden

あなたの援助をありがとう

4

6 に答える 6

188

さらにいくつかのヘッダーを追加することで、データを取得できました。

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

実際には、この1つの追加ヘッダーだけで機能します。

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
于 2012-11-09T07:19:12.010 に答える
66

これはPython3で機能します

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
于 2013-04-24T09:09:18.147 に答える
13

NSE Webサイトが変更され、古いスクリプトは現在のWebサイトに半最適です。このスニペットは、セキュリティの毎日の詳細を収集できます。詳細には、シンボル、セキュリティタイプ、前回の終値、始値、高値、安値、平均価格、取引量、売上高、取引数、成果物の量、および配信されたものと取引されたものの比率が含まれます。これらは辞書形式のリストとして便利に表示されます。

リクエストとBeautifulSoupを含むPython3.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)

これに加えて、これは比較的モジュール式であり、すぐに使用できるスニペットです。

于 2017-09-14T08:00:54.947 に答える
5

このエラーは通常、要求しているサーバーが要求の送信元を認識していない場合に発生します。サーバーは、不要なアクセスを回避するためにこれを実行します。ヘッダーを定義してurllib.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()
于 2021-03-11T23:07:05.223 に答える
1

試してみる価値のあることが1つあります。それは、Pythonのバージョンを更新することだけです。私のクロールスクリプトの1つは、数か月前にWindows10の403で動作を停止しました。user_agentsは役に立たず、私はスクリプトをあきらめようとしていました。今日、Python(3.8.5-64ビット)を使用してUbuntuで同じスクリプトを試しましたが、エラーは発生しませんでした。WindowsのPythonバージョンは3.6.2-32ビットと少し古いものでした。Windows 10のPythonを3.9.5-64ビットにアップグレードした後、403が表示されなくなりました。試してみる場合は、パッケージエントリをエクスポートするために「pipfreeze>requirements.txt」を実行することを忘れないでください。もちろん忘れました。この投稿は、403が将来再び戻ってきたときにも思い出させてくれます。

于 2021-05-13T23:20:18.657 に答える
0
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
于 2020-11-30T11:01:03.347 に答える