社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

大数据文摘 • 7 年前 • 598 次点击  

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

编译 | 元元、康璐

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

你需要网页抓取(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网页的基本语法。

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

1. : HTML 文件必须以文件类型声明开头

2. HTML文件包含在和标签之间

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

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

5.

标签之间的部分为网站标题

6.

标签用于定义段落

其他有用的标签还有:是超链接的标签,

是表格的标签,是表格行的标签,
是表格列的标签。

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

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


网络抓取规则


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

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

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


查看页面


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

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

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

关于转载

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

志愿者介绍

回复“志愿者”加入我们


往期精彩文章

点击图片阅读

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



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/CGABIuMPqn
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2895
 
598 次点击