очистка страницы для получения цен из Google finance

#python #screen-scraping #urllib #stockquotes #google-finance

#python #очистка экрана #urllib #котировки акций #google-финансы

Вопрос:

Я пытаюсь получить цены на акции, очищая финансовые страницы Google, я делаю это на python, используя пакет urllib, а затем используя regex для получения ценовых данных.

Когда я оставляю свой скрипт на python запущенным, он сначала работает некоторое время (несколько минут), а затем начинает выдавать исключение [Ошибка HTTP 503: служба недоступна]

Я предполагаю, что это происходит потому, что на стороне веб-сервера он обнаруживает частые обновления страницы как робот и через некоторое время выдает это исключение..

есть ли способ обойти это, т. Е. удалить некоторые файлы cookie или создать некоторые файлы cookie и т.д..

или даже лучше, если Google предоставит какой-нибудь api, я хочу сделать это на python, потому что полное приложение на python, но если в python нет ничего доступного для этого, я могу рассмотреть альтернативы. Это мой метод python, который я использую в цикле для получения данных (после нескольких секунд ожидания я вызываю этот метод в цикле)

  def getPriceFromGOOGLE(self, symbol):
    """ 
    gets last traded price from google for given security
    """         
    toReturn = 0.0
    try:
        base_url = 'http://google.com/finance?q='
        req = urllib2.Request(base_url   symbol)
        content = urllib2.urlopen(req).read()
        namestr = 'name:"'   symbol   '",cp:(.*),p:(.*),cid(.*)}'
        m = re.search(namestr, content)
        if m:
            data = str(m.group(2).strip().strip('"'))
            price = data.replace(',','')
            toReturn = float(price)
        else:
            print 'ERROR '   str(symbol)   ' --- '   str(content)      
    except Exception, exc:
        print 'Exc: '   str(exc)       
    finally: 
        return toReturn
  

Комментарии:

1. Прочитайте 5.3 из TOS

2. Согласен … и API — это «интерфейс, предоставляемый Google»

3. Это законно? Я имею в виду удаление веб-страниц в Google и yahoo?

4. Я бы предпочел использовать это: fixer.io

Ответ №1:

Вопрос довольно старый, но выбранный ответ больше не действителен.
API устарел.

Существует проект с открытым исходным кодом для очистки всех компаний из Google Finance и сопоставления их с их текущей ценой наhttp://scrape-google-finance.compunect.com
Проект решил большинство проблем, включает кэширование, управление IP и работает стабильно, не блокируясь.
Он использует API сопоставления внутренних финансовых компаний для очистки компаний и API диаграммы для получения цен. Однако это php-код, а не python. Вы все еще можете узнать, как он решал задачи, и адаптировать его.

Комментарии:

1. Хороший ответ, но код написан для использования с us-proxies.com профессиональный поставщик IP-адресов. По-видимому, скребки используют разные IP-адреса, чтобы избежать закрытия. И этот сайт взимает около 30 долларов в месяц за пять IP-адресов, 145 долларов в месяц за 30 IP-адресов.

2. Вы правы, код с открытым исходным кодом, если у вас есть более дешевое / собственное IP-решение, которое вы не хотите пробовать, просто возьмите нужные вам части. Для Google Finance вам не понадобится много IP-адресов, в зависимости от того, что вы именно хотите сделать.

Ответ №2:

Чтобы обойти большинство ограничений скорости или обнаружения ботов из таких сервисов, как Google, Wikipedia или Yahoo, подделайте свой пользовательский агент.

Это сделает запросы вашего скрипта похожими на запросы последней версии Google Chrome.

 headers = {'User-Agent' : "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.16 Safari/534.24"}
req = urllib2.Request(url,None,headers)
content = urllib2.urlopen(req).read()
  

Комментарии:

1. можете ли вы использовать этот трюк с urlfetch, а также с urllib2?

Ответ №3:

Yahoo Finance также является хорошим местом для получения финансовой информации, которая охватывает больше стран и акций.

Для python 2 вы можете использовать ystockquote. Для python 3 вы можете использовать yfq, который я переписал из предыдущего.

Чтобы получить текущие котировки Google и Intel.

 >>> import yfq
>>> yfq.get_price('GOOG INTL')
{'GOOG': '600.25', 'INTL': '22.25'}
  

Чтобы получить исторические котировки Yahoo с 3 по 5 марта 2012 года.

 >>> yfq.get_historical_prices('YHOO','20120301','20120303')
[['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'], ['2012-03-02', '14.89', '14.92', '14.66', '14.72', '9164900', '14.72'], ['2012-03-01', '14.89', '14.96', '14.79', '14.93', '12283300', '14.93']]
  

Комментарии:

1. yfq -> 404, ` ystockquote` -> сайт недоступен. Для этого существует yfinance пакет, который активно поддерживается.

Ответ №4:

Существует Google Finance API:

http://code.google.com/apis/finance/docs/2.0/developers_guide_protocol.html

И для этого есть клиентская библиотека Python:

http://code.google.com/p/gdata-python-client/

Комментарии:

1. API Google Finance официально устарел с 26 мая 2011 года и будет закрыт 20 октября 2012 года. 🙁 developers.google.com/finance

Ответ №5:

Вы также можете извлекать данные из Google Fiance непосредственно в Google Sheets с помощью GOOGLEFINANCE() функции как текущих, так и исторических данных:

 GOOGLEFINANCE("NASDAQ:GOOGL", "price", DATE(2014,1,1), DATE(2014,12,31), "DAILY")
  

Другой способ — использовать Yahoo finance вместо этого через yfinance пакет или с таким запросом, который вернет JSON:

 https://query1.finance.yahoo.com/v8/finance/chart/MSFT
  

Говоря о Google Finance, убедитесь, что вы используете user-agent , поскольку он используется как «реальный» пользователь, поэтому веб-сайты предполагают, что запрос сделан пользователем, а не ботом или скриптом. Кроме того, веб-сайты могут блокировать запрос, если user-agent это что-то вроде python-requests , которое используется по умолчанию user-agent в requests библиотеке.

Проверьте, какая у вас версия user-agent , и убедитесь, что вы используете новую версию, поскольку использование старой user-agent также может привести к блокировке запроса.


Код и пример в онлайн-среде разработки:

 from bs4 import BeautifulSoup
import requests, lxml, json
from itertools import zip_longest


def scrape_google_finance(ticker: str):
    # https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
    params = {
        "hl": "en"
        }

    # https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
    # https://www.whatismybrowser.com/detect/what-is-my-user-agent
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36",
        }

    html = requests.get(f"https://www.google.com/finance/quote/{ticker}", params=params, headers=headers, timeout=30)
    soup = BeautifulSoup(html.text, "lxml")
    
    ticker_data = {
        "ticker_data": {},
        "about_panel": {}
    }
    
    ticker_data["ticker_data"]["current_price"] = soup.select_one(".AHmHk .fxKbKc").text
    ticker_data["ticker_data"]["quote"] = soup.select_one(".PdOqHc").text.replace(" • ",":")
    ticker_data["ticker_data"]["title"] = soup.select_one(".zzDege").text
    
    right_panel_keys = soup.select(".gyFHrc .mfs7Fc")
    right_panel_values = soup.select(".gyFHrc .P6K39c")
    
    for key, value in zip_longest(right_panel_keys, right_panel_values):
        key_value = key.text.lower().replace(" ", "_")

        ticker_data["about_panel"][key_value] = value.text
    
    return ticker_data
    

data = scrape_google_finance(ticker="GOOGL:NASDAQ")

print(json.dumps(data, indent=2))
print(data["ticker_data"].get("current_price"))
  

Вывод в формате JSON:

 {
  "ticker_data": {
    "current_price": "$2,534.60",
    "quote": "GOOGL:NASDAQ",
    "title": "Alphabet Inc Class A"
  },
  "about_panel": {
    "previous_close": "$2,597.88",
    "day_range": "$2,532.02 - $2,609.59",
    "year_range": "$2,193.62 - $3,030.93",
    "market_cap": "1.68T USD",
    "volume": "1.56M",
    "p/e_ratio": "22.59",
    "dividend_yield": "-",
    "primary_exchange": "NASDAQ",
    "ceo": "Sundar Pichai",
    "founded": "Oct 2, 2015",
    "headquarters": "Mountain View, CaliforniaUnited States",
    "website": "abc.xyz",
    "employees": "156,500"
  }
}
  

data["ticker_data"].get("current_price") :

 $2,534.60
  

Если есть необходимость проанализировать всю страницу с тикером Google Finance целиком, я построчно очистил данные о котировках Google Finance Ticker в блоге Python об этом в SerpApi. Оставляем эту ссылку здесь, поскольку это выходит за рамки вашего вопроса.