如何用Python和BeautifulSoup库来爬虫你要抓取的网站信息
原文链接:FreeCodeCamp 译文稿源:36Kr
大数据文摘作品,编译 | 元元、康璐
网络上的信息是任何人穷极一生也无法全部了解的。你需要的或许不是简单的获得信息,而是一个可以收集,整理,分析信息,并且具有拓展性的方法。
你需要网页抓取(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 出品的教程。
- 款和条件,然后再刮。请仔细阅读关于合法使用数据的声明。通常,您刮擦的数据不应用于商业目的。
- 不要太过份地使用您的程序(也称为垃圾邮件)从网站请求数据,因为这可能会破坏网站。确保您的程序以合理的方式行事(即像人类一样行事)。每秒一个网页的一个请求是好的做法。
- 网站的布局可能会不时更改,因此请务必重新访问网站,并根据需要重写代码
检查页面
以彭博报价网站的一页为例。
作为跟随股票市场的人,我们想从该页面获取索引名称(S&P 500)及其价格。首先,右键单击并打开浏览器的检查器检查网页。

尝试将光标悬停在价格上,您应该可以看到周围的蓝色框。如果您点击它,相关的HTML将在浏览器控制台中被选中。

从结果中我们可以看出,价格是内HTML标签的几级,这是<div class="basic-quote">→交通<div class="price-container up">→交通<div class="price">。
同样,如果你悬停,然后点击名为“标准普尔500指数”,它是里面<div class="basic-quote">和<h1 class="name">。

现在我们通过class标签的帮助知道我们的数据的独特位置。
跳入代码
现在我们知道数据在哪里,我们可以开始编写我们的网页刮刀。现在打开你的文本编辑器!
首先,我们需要导入我们要使用的所有库。
#导入 库
import urllib2
from bs4 import BeautifulSoup
接下来,为网页的url声明一个变量。
#指定网站url地址
quote_page =' http: //www.bloomberg.com/quote/SPX:IND '
然后,利用Python urllib2获取url声明的HTML页面。
#查询网站并将HTML返回到变量“page”
page= urllib2.urlopen(quote_page)
最后,将页面解析为BeautifulSoup格式,以便我们可以使用BeautifulSoup来处理它。
#使用美丽的肥皂解析html并存储在变量
soup= BeautifulSoup(page,'html.parser')
现在我们有一个变量,soup包含页面的HTML。这里我们可以开始编写提取数据的部分。
记住我们数据的独特层次吗?BeautifulSoup可以帮助我们进入这些层次并提取内容find()。在这种情况下,由于HTML类name在此页面上是唯一的,我们可以简单地查询<div class="name">。
#取出名称的<div>并获取其值
name_box = soup.find('h1',attrs = {'class':'name'})
在我们获得标签后,我们可以通过获取数据来获取数据text。
name = name_box.text.strip()#strip()用于删除开始和结尾的空格
同样,我们也可以得到价格。
#获取索引价格
price_box = soup.find('div',attrs = {'class':'price'})
price = price_box.text
print price
当您运行程序时,您应该可以看到它打印出标准普尔500指数的当前价格。

导出到Excel CSV
现在我们有了数据,现在是保存它的时候了。Excel逗号分隔格式是一个不错的选择。它可以在Excel中打开,以便您可以轻松查看数据并进行处理。
但首先,我们必须导入Python csv模块和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,你应该看到一行数据。

所以如果你每天都运行这个程序,你就可以很容易地获得标准普尔500指数的价格,而不会通过网站进行翻页!
进一步(高级用途)
多指标
所以刮一个指标是不够的,对吧?我们可以尝试同时提取多个索引。
首先,修改quote_page为一个数组的URL。
quote_page = [ ' http://www.bloomberg.com/quote/SPX:IND', ' http://www.bloomberg.com/quote/CCMP:IND' ]
然后我们将数据提取代码更改为一个for循环,这将逐个处理URL,并将所有数据存储data在元组中的变量中。
#for loop
data = []
for pg in quote_page:
#查询网站并将html返回到变量“page”
page= urllib2.urlopen(pg)
#使用美丽的肥皂解析html并存储在变量`
soup= BeautifulSoup(page,'html.parser')
#取出名称的<div>并获取其值
name_box = soup.find('h1',attrs = {'class':'name'})
name = name_box.text.strip()#strip()去除起始和尾随空格
#获取索引价格
price_box = soup.find('div',attrs = {'class':'price'})
price = price_box.text
#保存数据在元组
data.append((名称,价格))
另外,修改保存部分逐行保存数据。
#打开一个附加的csv文件,所以旧的数据不会被作为csv_file擦除:
with open('index.csv','a')
writer = csv.writer(csv_file)#for循环的名称,价格在数据中:
writer.writerow([name,price,datetime.now()])
重新运行程序,您应该可以同时提取两个索引!
高级抓取技术
BeautifulSoup对于小规模的网页抓取来说非常简单,非常棒。但是,如果您有兴趣更大规模地抓取数据,则应考虑使用其他替代方案:
- Scrapy,一个强大的蟒蛇刮框架
- 尝试将您的代码与一些公共API集成。数据检索的效率比刮网页要高得多。例如,看一下Facebook Graph API,它可以帮助您获取未被显示在Facebook网页上的隐藏数据。
- 考虑使用像MySQL这样的数据库后端在数据量太大时存储数据。
采用DRY方法

DRY代表“不要重复自己”,试图像自动化您的日常任务这个人。考虑一些其他有趣的项目可能会跟踪您的Facebook好友的活跃时间(当然他们同意),或者在论坛上抓住主题列表,并尝试自然语言处理(这是人工智能权利的热门话题现在)!
如果您有任何问题,请随时在下面发表评论。
参考文献
http://www.gregreda.com/2013/03/03/web-scraping-101-with-python/
http://www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping -美丽的汤,蟒/
评论
发表评论