使用 Python 中的 lxml 实现网页抓取?


网页抓取不仅让数据科学爱好者兴奋不已,也让希望深入研究网站的学生或学习者感到兴奋。Python 提供了许多网页抓取库,包括:

  • Scrapy

  • Urllib

  • BeautifulSoup

  • Selenium

  • Python Requests

  • LXML

我们将讨论 Python 的 lxml 库,用于从网页抓取数据。该库建立在用 C 编写的 libxml2 XML 解析库之上,这使其比 BeautifulSoup 更快,但也使其在某些计算机(特别是 Windows)上更难安装。

安装和导入 lxml

可以使用 pip 从命令行安装 lxml:

pip install lxml

或者

conda install -c anaconda lxml

lxml 安装完成后,导入 html 模块,该模块解析来自 lxml 的 HTML。

>>> from lxml import html

检索要抓取的页面源代码 - 我们有两个选择,我们可以使用 python requests 库或 urllib,并使用它来创建一个包含页面整个 HTML 的 lxml HTML 元素对象。我们将使用 requests 库下载页面的 HTML 内容。

要安装 python requests,只需在您选择的终端中运行以下简单命令:

$ pipenv install requests

从雅虎财经抓取数据

假设我们想从 google.finance 或 yahoo.finance 抓取股票/股权数据。以下是雅虎财经中微软公司的屏幕截图:

因此,从上面(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 = "http://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 后,您将看到在当前工作目录中创建了一个 .json 文件,其名称类似于“stockName-summary.json”,因为我尝试从雅虎财经中提取 msft(微软)字段,因此创建了一个名为“msft-summary.json”的文件。

以下是生成的输出的屏幕截图:

因此,我们已成功使用 lxml 和 requests 从雅虎财经的微软页面抓取所有所需数据,然后将数据保存到文件中,稍后可用于共享或分析微软股票的价格走势。

更新于:2019 年 7 月 30 日

523 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.