查看页面
让我们以Bloomberg Quote网站的其中一页为例。
作为一个关注股票市场的投资人,我们想要从这一页得到股指名称(标准普尔500指数)和价格。首先,右键点击打开浏览器的检查器(inspector),查看网页。
请尝试把光标放在股指价格上,你应该可以看到价格周围的蓝色方块,如果你点击这个方块,就可以选中浏览器控制台相应的html代码。
从结果可以看出,价格信息包含在好几层HTML标签中:
同样的,如果你把光标放在名称“标准普尔指数“上,并点击,可以看到控制台里这个信息包含在标签< 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类“名称”在整个网页中是独一无二的,因此我们可以简单的查找
# 获取“名称”类的
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’)
# 获取“名称”类的
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是“别重复你做过的事”的英文简写。您可以尝试像链接中的这个人一样把日常的工作自动化。同时您还可以考虑其他有趣的项目,比如说掌握您的脸书好友的上线时间(当然在征得他们同意的情况下),或者获取某个论坛的讲座主题列表来尝试自然语言处理(这是目前人工智能的热门话题)!
来源: http://www.92to.com/bangong/2017/08-03/26268839.html