Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 lxml을 사용하여 웹 스크래핑을 구현하시겠습니까?

<시간/>

웹 스크래핑은 데이터 과학 애호가뿐만 아니라 웹사이트에 대해 더 깊이 파고 싶어하는 학생이나 학습자를 흥분시킵니다. 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 기업 스크린샷입니다.

Python에서 lxml을 사용하여 웹 스크래핑을 구현하시겠습니까?

따라서 위에서(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&region=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"이라는 이름으로 생성되었습니다.

아래는 생성된 출력의 스크린샷입니다 -

Python에서 lxml을 사용하여 웹 스크래핑을 구현하시겠습니까?

그래서 우리는 lxml 및 요청을 사용하여 Microsoft의 yahoo.finance에서 필요한 모든 데이터를 성공적으로 스크랩한 다음 나중에 Microsoft 주식의 가격 움직임을 공유하거나 분석하는 데 사용할 수 있는 파일에 데이터를 저장했습니다.