웹 스크래핑은 데이터 과학 애호가뿐만 아니라 웹사이트에 대해 더 깊이 파고 싶어하는 학생이나 학습자를 흥분시킵니다. Python은 다음을 포함한 많은 웹스크래핑 라이브러리를 제공합니다.
-
스크랩
-
Urllib
-
아름다운 수프
-
셀레늄
-
파이썬 요청
-
LXML
우리는 C로 작성된 libxml2 XML 구문 분석 라이브러리 위에 구축된 웹 페이지에서 데이터를 긁어내는 python의 lxml 라이브러리에 대해 논의할 것입니다. 이 라이브러리는 Beautiful Soup보다 빠르지만 일부 컴퓨터, 특히 Windows에 설치하기 더 어렵습니다. .
lxml 설치 및 가져오기
lxml은 pip를 사용하여 명령줄에서 설치할 수 있습니다.
pip install lxml
또는
conda install -c anaconda lxml
lxml 설치가 완료되면 lxml에서 HTML을 구문 분석하는 html 모듈을 가져옵니다.
>>> from lxml import html
스크랩하려는 페이지의 소스 코드를 검색합니다. python 요청 라이브러리 또는 urllib를 사용하여 페이지의 전체 HTML을 포함하는 lxml HTML 요소 개체를 만드는 데 사용할 수 있는 두 가지 선택이 있습니다. 페이지의 HTML 콘텐츠를 다운로드하기 위해 요청 라이브러리를 사용할 것입니다.
python 요청을 설치하려면 선택한 터미널에서 이 간단한 명령을 실행하기만 하면 됩니다. -
$ pipenv install requests
야후 파이낸스에서 데이터 스크랩
google.finance 또는 yahoo.finance에서 주식/주식 데이터를 스크랩하려고 한다고 가정해 보겠습니다. 아래는 yahoo Finance의 Microsoft 기업 스크린샷입니다.
따라서 위에서(https://finance.yahoo.com/quote/msft ), 위에서 볼 수 있는 주식의 모든 필드를 추출할 것입니다.
-
이전 종가, 시가, 입찰, 매도, 요일 범위, 52주 범위, 거래량 등
다음은 python lxml 모듈을 사용하여 이를 수행하는 코드입니다 -
lxml_scrape3.py
from lxml import html import requests from time import sleep import json import argparse from collections import OrderedDict from time import sleep def parse(ticker): url = "https://finance.yahoo.com/quote/%s?p=%s"%(ticker,ticker) response = requests.get(url, verify = False) print ("Parsing %s"%(url)) sleep(4) parser = html.fromstring(response.text) summary_table = parser.xpath('//div[contains(@data-test,"summary-table")]//tr') summary_data = OrderedDict() other_details_json_link = "https://query2.finance.yahoo.com/v10/finance/quoteSummary/{0}? formatted=true&lang=en- US®ion=US&modules=summaryProfile%2CfinancialData%2CrecommendationTrend%2 CupgradeDowngradeHistory%2Cearnings%2CdefaultKeyStatistics%2CcalendarEvents& corsDomain=finance.yahoo.com".format(ticker)summary_json_response=requests.get(other_details_json_link) try: json_loaded_summary = json.loads(summary_json_response.text) y_Target_Est = json_loaded_summary["quoteSummary"]["result"][0]["financialData"] ["targetMeanPrice"]['raw'] earnings_list = json_loaded_summary["quoteSummary"]["result"][0]["calendarEvents"]['earnings'] eps = json_loaded_summary["quoteSummary"]["result"][0]["defaultKeyStatistics"]["trailingEps"]['raw'] datelist = [] for i in earnings_list['earningsDate']: datelist.append(i['fmt']) earnings_date = ' to '.join(datelist) for table_data in summary_table: raw_table_key = table_data.xpath('.//td[contains(@class,"C(black)")]//text()') raw_table_value = table_data.xpath('.//td[contains(@class,"Ta(end)")]//text()') table_key = ''.join(raw_table_key).strip() table_value = ''.join(raw_table_value).strip() summary_data.update({table_key:table_value}) summary_data.update({'1y Target Est':y_Target_Est,'EPS (TTM)':eps,'Earnings Date':earnings_date,'ticker':ticker,'url':url}) return summary_data except: print ("Failed to parse json response") return {"error":"Failed to parse json response"} if __name__=="__main__": argparser = argparse.ArgumentParser() argparser.add_argument('ticker',help = '') args = argparser.parse_args() ticker = args.ticker print ("Fetching data for %s"%(ticker)) scraped_data = parse(ticker) print ("Writing data to output file") with open('%s-summary.json'%(ticker),'w') as fp: json.dump(scraped_data,fp,indent = 4)
위의 코드를 실행하려면 명령 터미널에 아래 간단한 입력 -
c:\Python\Python361>python lxml_scrape3.py MSFT
lxml_scrap3.py를 실행하면 yahoo 금융에서 msft(microsoft) 필드를 추출하려고 할 때 "stockName-summary.json"과 같은 이름을 가진 현재 작업 디렉토리에 .json 파일이 생성되는 것을 볼 수 있습니다. 따라서 파일은 "msft-summary.json"이라는 이름으로 생성되었습니다.
아래는 생성된 출력의 스크린샷입니다 -
그래서 우리는 lxml 및 요청을 사용하여 Microsoft의 yahoo.finance에서 필요한 모든 데이터를 성공적으로 스크랩한 다음 나중에 Microsoft 주식의 가격 움직임을 공유하거나 분석하는 데 사용할 수 있는 파일에 데이터를 저장했습니다.