手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulSoup库

2017 年 8 月 3 日 大数据文摘 大数据文摘

大数据文摘作品,转载要求见文末

编译 | 元元、康璐

网络上的信息是任何人穷极一生也无法全部了解的。你需要的或许不是简单的获得信息,而是一个可以收集,整理,分析信息,并且具有拓展性的方法。

你需要网页抓取(Web scraping)技术。

网页抓取可以自动提取网站上的数据信息,并把这些信息用一种容易理解的格式呈现出来。网页抓取应用广泛, 在本教程中我们将重点讲解它在金融市场领域的运用。

如果你是个投资达人,每天查找收盘价一定是个烦心事,更不用提数据来源于多个网站的时候。我们可以用代码写一个网络爬虫 (web scraper) 来帮助我们自动从网站获取股指信息,从而大大简化数据提取过程。



我们开始吧。

我们采用Python进行网页数据抓取,并采用简单强大的BeautifulSoup 库完成分析。

  • 对于Mac用户来说, OS X操作系统已经预先安装好Python。您需要打开终端并输入python --version。您应该可以看到python的版本为2.7.x。

  • 对于Windows用户而言,请由官方网站安装Python。

下一步,我们需要利用pip命令获取BeautifulSoup 库。Pip 是Python中管理库和包的工具。

在终端中输入:

注意:如果您不能运行上面的命令,在每行前面加上sudo 再试试。


基础知识


在学习代码之前,让我们先来了解HTML的基础知识和网页抓取的基本规则。


标签


如果你已经充分理解HTML标签,请跳过这一部分

这就是HTML网页的基本语法。

每一对<tag>标签内包含网页的一段代码:

1. <!DOCTYPE html>: HTML 文件必须以文件类型声明开头

2. HTML文件包含在<html>和<html/>标签之间

3. 元(meta)和脚本(script)声明包含在<head>和</head>标签之间

4. 网站上可见的部分包含在<body>和</body>标签之间

5. <h1>和<h6>标签之间的部分为网站标题

6. <p>标签用于定义段落

其他有用的标签还有:<a>是超链接的标签,<table>是表格的标签,<tr>是表格行的标签,<td>是表格列的标签。

并且,HTML标签常常带有标识码(id) 或类(class)属性,标识码用来唯一的识别某个HTML标签,并且标识码的值在整个HTML文件中是唯一的。类属性可以定义同类HTML标签相同的样式。我们可以利用标识码和类来帮助我们定位想要的数据。

如果您想了解关于HTML标签,标识码和类的更多内容,请参考W3Schools 出品的教程。


网络抓取规则


1. 在您进行网络抓取时,你应该查看网站的条款和条件。请仔细阅读数据合法使用声明。通常情况下,您抓取的数据不能商用。

2. 您的程序不要过于频繁的向网站发出数据请求(也被称为垃圾请求),这种做法可能会使网站崩溃。请确保您的程序行为合理(也就是说和人类的行为相似)。对一个网站每秒进行一次数据请求是比较好的做法。

3. 网站的布局随时间不断变化,所以请您确保时常重新访问网站,如果需要的话,修改抓取代码。


查看页面


让我们以Bloomberg Quote网站的其中一页为例。

作为一个关注股票市场的投资人,我们想要从这一页得到股指名称(标准普尔500指数)和价格。首先,右键点击打开浏览器的检查器(inspector),查看网页。



请尝试把光标放在股指价格上,你应该可以看到价格周围的蓝色方块,如果你点击这个方块,就可以选中浏览器控制台相应的HTML代码。



从结果可以看出,价格信息包含在好几层HTML标签中:<div class="basic-quote"> → <div class="price-container up"> → <div class="price">.

同样的,如果你把光标放在名称“标准普尔指数“上,并点击,可以看到控制台里这个信息包含在标签< iv class="basic-quote">及< h1 class="name">之内。



现在我们知道如何依靠类标签找到我们需要的数据了。


学习代码


现在我们知道所需数据的位置,我们可以开始写代码构建我们的网络爬虫了。现在请打开您的文字编辑工具!

首先我们要导入我们要用的各种库。

# 导入各种库

import urllib2

from bs4 import BeautifulSoup

然后,我们定义一个变量(quote_page)并赋值为网站的网址链接。

# 赋值网站链接

quote_page = ‘http://www.bloomberg.com/quote/SPX:IND'

接着,利用Python的urllib2库获取方才定义的网址quote_page的 HTML网页信息。

# 检索网站并获取html代码,存入变量”page”中 

page = urllib2.urlopen(quote_page)

最后,我们把网页解析为 BeautifulSoup格式,以便我们用BeautifulSoup 库来分析网页。

# 用 beautifulSoup 解析HTML代码并存入变量“soup”中`

soup = BeautifulSoup(page, ‘html.parser’)

现在我们有了包含整个网页的HTML代码的变量soup。我们就从soup开始着手提取信息。

别忘了我们的数据存储在特有的层次中。BeautifulSoup库中的find()函数可以帮助我们进入不同的层次提取内容。我们需要的HTML类“名称”在整个网页中是独一无二的,因此我们可以简单的查找<div class="name">

# 获取“名称”类的<div>代码段落并提取相应值 

name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})

在我们得到标签之后,我们可以用name_box的text属性获取相应值

name = name_box.text.strip() # strip() 函数用于去除前后空格 

print name

采用相似的方法,我们可以得到股指价格数据。

# 获取股指价格数据

price_box = soup.find(‘div’, attrs={‘class’:’price’})

price = price_box.text

print price

当你运行程序时,应该可以看到程序输出当前的标普500指数的价格。


导出Excel CSV格式数据


我们已经学会如何获取数据,现在来学习如何存储数据了。Excel逗号隔开的数据格式(CSV)不失为一个好选择。这样我们就可以在Excel中打开数据文件进行查看和进一步处理。

在此之前,我们需要导入Python的csv模块和datetime模块。Datetime模块用于获取数据记录时间。请将下面几行代码插入您的导入代码部分。

import csv

from datetime import datetime

在您代码的最下方,加上把数据写入CSV文件的代码。

# 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖 

with open(‘index.csv’, ‘a’) as csv_file:

 writer = csv.writer(csv_file)

 writer.writerow([name, price, datetime.now()])

现在如果运行程序,您应该可以导出一个index.csv文件。您可以在Excel中打开文件,看到里面有如图所示的一行数据。

所以如果您每天都运行这个程序,您就可以很简单的获取标准普尔指数价格,不需要像之前一样在网站上翻找。


更进一步(高级用法)


多个股指

抓取一个股指信息对您来说不够,对吗?我们可以试试同时提取多个股指信息。首先,我们需要修改quote_page,把它定义为网址的数组。

quote_page = [‘http://www.bloomberg.com/quote/SPX:IND', ‘http://www.bloomberg.com/quote/CCMP:IND']

然后我们把数据提取部分代码改成一个for循环。这个循环可以一一处理网址,并以元组(tuple)类型把所有数据存入变量data.

# for 循环

data = []

for pg in quote_page:

 # 检索网站并返回HTML代码,存入变量‘page’ 

 page = urllib2.urlopen(pg)

# 用 beautifulSoup 解析HTML代码并存入变量 `soup`

 soup = BeautifulSoup(page, ‘html.parser’)

# 获取“名称”类的<div>代码段落并提取相应值

 name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})

 name = name_box.text.strip() # strip() is used to remove starting and trailing

# 获取股指价格数据

 price_box = soup.find(‘div’, attrs={‘class’:’price’})

 price = price_box.text

# 用元组类型存储数据

 data.append((name, price))

并且,修改保存部分以便一行行保存数据

# 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖 

with open(‘index.csv’, ‘a’) as csv_file:

 writer = csv.writer(csv_file)

 # for 循环

 for name, price in data:

 writer.writerow([name, price, datetime.now()])

重新运行程序,您应该可以同时提取两个股指价格信息了!


高级抓取技术


BeautifulSoup 库使用简单,能很好的完成小量的网站抓取。但是如果您对大量的抓取信息感兴趣,您可以考虑其他方法:

1. 强大的Python数据抓取框架Scrapy。

2. 您可以试试把一些公共应用程序接口(Application programming interface, API)  整合入您的代码。这个获取数据的方法远比网页抓取高效。举个例子来说,您可以试试Facebook Graph API,这个应用程序接口可以帮助您获取脸书网站上不显示的隐藏信息。

3. 如果数据量过大,您可以考虑使用类似MySQL的数据库后端来存储数据。


采取“别重复”方法


DRY是“别重复你做过的事”的英文简写。您可以尝试像链接中的这个人一样把日常的工作自动化。同时您还可以考虑其他有趣的项目,比如说掌握您的脸书好友的上线时间(当然在征得他们同意的情况下),或者获取某个论坛的讲座主题列表来尝试自然语言处理(这是目前人工智能的热门话题)!

原文链接:https://medium.freecodecamp.org/how-to-scrape-websites-with-python-and-beautifulsoup-5946935d93fe

20177《顶级数据团队建设全景报告》下载

            
              
              
               
                 
                 

关于转载

如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘 | bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:zz@bigdatadigest.cn。

志愿者介绍

回复“志愿者”加入我们


往期精彩文章

点击图片阅读

《卷积?神经?网络?教你从读懂词语开始了解计算机视觉识别最火模型 | CNN入门手册(上)》


登录查看更多
0

相关内容

超文本标记语言(英文:HyperText Markup Language,HTML)是为“网页创建和其它可在网页浏览器中看到的信息”设计的一种标记语言。
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
179+阅读 · 2020年1月1日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
22+阅读 · 2019年11月7日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
手把手教你用Python做一个哄女友神器,小白可上手
网易智能菌
5+阅读 · 2019年6月15日
GitHub 热门:各大网站的 Python 爬虫登录汇总
机器学习算法与Python学习
9+阅读 · 2019年3月20日
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
Python NLP入门教程
七月在线实验室
7+阅读 · 2018年6月5日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
Arxiv
38+阅读 · 2020年3月10日
Object Detection in 20 Years: A Survey
Arxiv
48+阅读 · 2019年5月13日
Arxiv
3+阅读 · 2018年4月5日
VIP会员
相关VIP内容
相关资讯
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
手把手教你用Python做一个哄女友神器,小白可上手
网易智能菌
5+阅读 · 2019年6月15日
GitHub 热门:各大网站的 Python 爬虫登录汇总
机器学习算法与Python学习
9+阅读 · 2019年3月20日
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
Python NLP入门教程
七月在线实验室
7+阅读 · 2018年6月5日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
Top
微信扫码咨询专知VIP会员