웹 스크래핑은 데이터 과학 애호가뿐만 아니라 웹사이트에 대해 더 깊이 파고 싶어하는 학생이나 학습자를 흥분시킵니다. 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 주식의 가격 움직임을 공유하거나 분석하는 데 사용할 수 있는 파일에 데이터를 저장했습니다.