写点什么

如何使用 Python 和 BeautifulSoup 爬取网站

  • 2019-10-21
  • 本文字数:3456 字

    阅读完需:约 11 分钟

如何使用Python和BeautifulSoup爬取网站

本文最初发布于Medium.com,经原作者授权由 InfoQ 中文站翻译并分享。


互联网上的信息如此之多,任何人穷其一生也无法全部消化吸收。你需要的不是访问这些信息,而是一种可伸缩的方式,可以用来收集、组织和分析这些信息。你需要的是 Web 爬取。Web 爬取可以自动提取数据,并以一种让你可以轻松理解的格式显示出来。Web 爬取可以用于许多场景,但本教程将重点介绍它在金融市场中的应用。


互联网上的信息如此之多,任何人穷其一生也无法全部消化吸收。你需要的不是访问这些信息,而是一种可伸缩的方式,可以用来收集、组织和分析这些信息。


你需要的是 Web 爬取。


Web 爬取可以自动提取数据,并以一种让你可以轻松理解的格式显示出来。Web 爬取可以用于许多场景,但本教程将重点介绍它在金融市场中的应用。


如果你是一名狂热的投资者,每天获取收盘价可能是一件比较痛苦的事情,尤其是当你需要的信息需要查看多个网页才能找到的时候。我们将通过构建一个网络爬取器,从互联网上自动检索股票指数,简化数据提取。


准备

我们将使用 Python 作为爬取语言,并使用一个简单而强大的库 BeautifulSoup。


  • 对于 Mac 用户而言,OS X 预装了 Python。打开终端,输入python --version。你应该可以看到 Python 的版本是 2.7.x。

  • 对于 Windows 用户,请通过官方网站安装 Python。


接下来,我们需要使用 pip(一个 Python 包管理工具)获取 BeautifulSoup 库。


在终端输入:


easy_install pip  pip install BeautifulSoup4
复制代码


注意:如果你运行上述命令失败,试下在每一行前面加上 sudo。

基本概念

在一头扎进代码之前,让我们先了解下 HTML 的基本概念和一些爬取规则。


HTML 标签


如果你已经了解了 HTML 标签,大可以跳过这部分。


<!DOCTYPE html><html>    <head>    </head>    <body>        <h1> First Scraping </h1>        <p> Hello World </p>    <body></html>
复制代码


这是 HTML 页面的基本语法。每个<tag>服务于网页里的一个块:


  1. <!DOCTYPE html>:HTML 文档必须以类型声明开始。

  2. HTML 文档包含在<html></html>之间。

  3. HTML 文档的 meta 和 script 声明位于<head></head>之间。

  4. HTML 的可视部分位于<body></body>标签之间。

  5. 标题的定义通过标签<h1><h6>

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


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


此外,HTML 标签有时带有idclass属性。id属性为 HTML 标签指定一个惟一的 id,并且该值在 HTML 文档中必须是惟一的。class属性用于为具有相同 class 的 HTML 标签定义相同的样式。我们可以使用这些idclass帮助定位我们想要的数据。


要了解关于 HTML标签idclass的信息,请查阅 W3Schools教程


爬取规则


  1. 你应该在爬取之前检查网站的条款和限制。请仔细阅读关于合法使用数据的声明。通常,你收集的数据不应用于商业目的。

  2. 用你的程序从网站请求数据时不要过激(也称为滥发),因为这可能会对网站造成破坏。确保你的程序以一种合理的方式运行(即表现得像个人)。每秒请求一个页面是很好的做法。

  3. 网站的布局可能会不时发生变化,所以一定要重新访问网站,并根据需要重写代码。

查看页面

作为例子,让我们看一个来自Bloomberg Quote网站的页面。


作为关注股票市场的人,我们希望从这个页面上获取指数名称(标准普尔 500)及其价格。首先,右键单击并打开浏览器检查器来查看网页。



尝试把鼠标悬停在价格上,你应该可以看到一个蓝框。单击它,就可以在浏览器控制台中选择相关的 HTML。



从中我们可以看到,价格位于多层 HTML 标签之中,即<div class="basic-quote"><div class="price-container up"><div class="price">


类似地,如果你将鼠标悬停并单击名称“S&P 500 Index”,就会看到它位于<div class="basic-quote"><h1 class="name">中。



现在,我们已经借助 class 标签知道了数据的唯一位置。

进入代码

现在,我们已经知道我们想要的数据在哪,我们可以开始编写 Web 爬取器了。现在,打开编辑器。


首先,我们需要导入我们将要用到的库。


# 导入库import urllib2from bs4 import BeautifulSoup
复制代码


接下来,声明一个保存页面 URL 的变量。


# 指定URLquote_page = ‘http://www.bloomberg.com/quote/SPX:IND'
复制代码


然后,使用 Python urllib2 获取上述 URL 指向的 HTML 页面。


# 查询网站,将HTML返回给变量“page”page = urllib2.urlopen(quote_page)
复制代码


最后,将页面解析成 BeautifulSoup 的格式,这样我们就可以使用 BeautifulSoup 处理它了。


# 使用BeautifulSoup解析HTML页面,并将其保存在变量“soup”中soup = BeautifulSoup(page, ‘html.parser’)
复制代码


现在,我们有一个包含页面 HTML 的变量soup。从这里开始我们可以编写提取数据的代码了。


还记得我们需要的数据所独有的标签层次吗?BeautifulSoup 可以帮助我们进入这些层,并使用find()提取内容。在本例中,由于 HTML class 属性的名称在这个页面上是惟一的,所以我们可以简单地查询<div class="name">


# 取得class为name的<div>并获取它的值name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
复制代码


在找到标签之后,我们就可以通过获取其text属性来获取数据。


name = name_box.text.strip() # strip()用于移除字符串头尾的字符print name
复制代码


类似地,我们也可以获取指数价格。


# 获取指数价格price_box = soup.find(‘div’, attrs={‘class’:’price’})price = price_box.textprint price
复制代码


运行程序,你应该可以看到它给出了标准普尔 500 指数的价格。


导出到 Excel CSV

现在我们要保存获取到的数据了。Excel 逗号分隔格式是一个不错的选择。它可以在 Excel 中打开,这样你就可以看到数据并轻松地处理它。


但是首先,我们必须导入 Python csv 模块和 datetime 模块来获取记录日期。将以下代码插入导入部分。


import csvfrom 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中。


# 用于循环data = []for pg in quote_page:
# 查询网站,将HTML返回给变量“page”page = urllib2.urlopen(pg) # 使用BeautifulSoup解析HTML页面,并将其保存在变量“soup”中soup = BeautifulSoup(page, ‘html.parser’) # 取得class为name的<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((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 非常简单,适合于小规模 Web 爬取。但是,如果你对更大规模的数据爬取感兴趣,就应该考虑下下面这些选项:


  1. Scrapy是一个非常强大的 Python 爬取框架。

  2. 尝试在你的代码中集成一些公共 API。数据检索的效率会远远高于爬取网页。例如,看看Facebook Graph API,它可以帮助你获得 Facebook 网页上没有显示的隐藏数据。

  3. 当数据变大时,考虑使用类似MySQL这样的数据库后端来存储数据。

采用 DRY 方法


DRY 的意思是“不要重复你自己”,试着像这个人一样自动化你的日常任务。还可以考虑其他一些有趣的项目,比如跟踪 Facebook 上朋友的活动时间(当然要征得他们的同意),或者在论坛上列出一些话题,并尝试自然语言处理(这是目前人工智能的热门话题)!如果有任何问题,请在下面留言。


原文链接:


How to scrape websites with Python and BeautifulSoup


2019-10-21 08:002744

评论 1 条评论

发布
用户头像
小心被抓
2019-10-21 21:49
回复
没有更多了
发现更多内容

集简云开放平台是什么?

集简云开放平台

ChatGPT无需API开发连接第三方系统,让舆情自动监控

集简云开放平台

数据集成 数据集成平台 Chat

Solr和Elasticsearch,搜索框架怎么选?

会踢球的程序源

Java

DLRover:云上自动扩缩容 DeepRec 分布式训练作业案例分享

AI Infra

程序员 AI 互联网 DLRover

知你懂你,聪明得简直不像一台车,问界M5智驾版重磅升级鸿蒙3

Geek_2d6073

站群SEO是什么意思?站群SEO怎么做效果才好?

海拥(haiyong.site)

三周年连更

行云管家堡垒机有免费的吗?谁能告诉一下!

行云管家

高新企业 堡垒机 行云管家

什么是企业数智化的创新加速器?

用友BIP

技术大会 用友iuap 用友BIP 用友技术大会

企业全面数智化转型,国产替代成为安全保障

用友BIP

技术大会 用友iuap 数智化转型 用友BIP 用友技术大会

chrome调试技巧(一)

知心宝贝

前端 后端 调试 三周年连更

「云原生」Elasticsearch + Kibana on k8s 讲解与实战操作

会踢球的程序源

Java elasticsearch Kibana

听说谛听闹退休?感知网络接班啦!

脑极体

感知网络

前端沙箱利用这些特性实现代码的隔离与限制

没有用户名丶

最佳云转码,腾讯云MPS夺得MSU编码器大赛21项第一

科技热闻

Java中线程的6种状态详解(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)

共饮一杯无

Java 线程 线程状态 三周年连更

GitHub上线重量级分布式架构原理设计笔记,开源的东西看着就是爽

Java你猿哥

架构 分布式 分布式架构

女朋友要我讲解@Controller注解的原理,真是难为我了

Java你猿哥

Java spring Spring 配置解析

【堡垒机小知识】堡垒机能记录操作时间、操作数据等等吗?

行云管家

网络安全 堡垒机

硬核!万字神文精解高并发高可用系统实战,分布式系统一致性文档

做梦都在改BUG

Java 高可用 高并发 分布式一致性

阿里大神整理的Java核心知识点和面试官常问到的知识点,压压惊

会踢球的程序源

Java 面试 求职 java面试 Java构架

用友iuap平台一站式服务,助力央国企推进数智化转型

用友BIP

挑战 30 天学完 Python:Day9 条件语句

MegaQi

Python 挑战30天学完Python 三周年连更

热榜!Alibaba最新发布「10亿级并发系统设计文档」Git狂揽9000星

Java你猿哥

数据库 架构 分布式 架构设计 并发系统

GitHub和 Gitee联合编写最新版20w字Java全栈面试手册,简直无敌!

Java你猿哥

Java java面试 SSM框架 Java面经

浪潮海岳低代码平台inBuilder开源社区版正式发布

科技热闻

Linux:管道命令与文本处理三剑客(grep、sed、awk)

会踢球的程序源

Java Linux

Zabbix5.0配置企业微信告警

A-刘晨阳

Linux zabbix 三周年连更

阅读完synchronized和ReentrantLock的源码后,竟发现其完全相似

Java你猿哥

并发编程 并发 synchronized SSM框架 ReentrantLock

BT!GitHub开源阿里Java性能调优百宝书仅3小时,标星竟超过30k

Java你猿哥

Java JVM 性能调优 SSM框架 Java工程师

简单的视频格式转换器:MacX Video Converter Pro中文版

真大的脸盆

Mac Mac 软件 视频格式转换 格式转换器

Python本地SQL文件对比工具

YUKI0506

Python 文件对比 对比工具 difflib

如何使用Python和BeautifulSoup爬取网站_语言 & 开发_Justin Yek_InfoQ精选文章