在大数据、人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一。而Python则是目前数据科学项目中最常用的编程语言之一。使用Python与BeautifulSoup可以很容易的进行网页爬取,通过网站爬虫获取信息可以帮助企业或个人节省很多的时间和金钱。学习本文之后,我相信大部分新手都能根据自己的需求来开发出相应的网页爬虫。

基础条件

了解简单的Python编程规则(Python 3.x)了解简单的网页Html标签

如果您是完全的新手也不用担心,通过本文您可以很容易地理解。

安装所需包

首先,您需要先安装好Python 3.x,Python安装包可以从python.org下载,然后我们需要安装requests和beautifulsoup4两个包,安装代码如下:

$ pip install requests

$ pip install beautifulsoup4

  

爬取网页数据

现在我们已经做好了一切准备工作。在本教程中,我们将演示从没被墙的维基百科英文版页面中获取历届美国总统名单。

由下图可知,表格的内容位于class属性为wikitable的table标签下,我们需要了解这些标签信息来获取我们所需内容。

了解网页信息之后,我们就可以编写代码了。首先,我们要导入我们安装的包:

import requests
from bs4 import BeautifulSoup

为了获取网页数据我们要使用requests的get()方法:

url = "https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States"
page = requests.get(url)

检查http响应状态,来确保我们能正常获取网页,如果输出状态代码为200则为正常:

print(page.status_code)

现在我们已经获取了网页数据,让我们看看我们得到了什么:

print(page.content)

上面的代码会显示http相应的全部内容,包括html代码和我们需要的文本数据信息。通过使用beautifulsoup的prettify()方法可以将其更美观的展示出来:

soup = BeautifulSoup(page.content, 'html.parser')
print(soup.prettify())

这会将数据按照我们上面“检查”中看到的代码形式展示出来:

接下来我们将使用bs4对象的find方法提取table标签中的数据,此方法返回bs4对象:

tb = soup.find('table', class_='wikitable')

table标签下有很多嵌套标签,通过网页检查中的代码可以发现,我们最终是需要获得title元素中的文本数据,而title元素位于a标签下,a标签位于b标签下,b标签位于table标签下。为了获取所有我们所需的数据,我们需要提取table标签下的所有b标签,然后找到b标签下的所有a标签,为此,我们使用find_all方法来迭代获取所有b标签下的a标签:

for link in tb.find_all('b'):
name = link.find('a')
print(name)

可以看出,这并不是我们所要的最终结果,其中掺杂着html代码,不用担心,我们只需为上面的代码添加get_text()方法,即可提取出所有a标签下title元素的文本信息,代码改动如下:

for link in tb.find_all('b'):
    name = link.find('a')
    print(name.get_text('title'))

最终获得所有总统的名单如下:

George Washington
John Adams
Thomas Jefferson
James Monroe
。。。

最新文章

  1. Not a git repository (or any of the parent directories): .git
  2. Ubuntu 14.04下搭建 Android 开发环境(1) -JDK安装
  3. Struts2总结
  4. Junit使用
  5. Spring.Net 配置文件
  6. duilib进阶教程 -- Container控件的bug (14)
  7. 【字符串排序】n个数连接得到最小或最大的多位整数
  8. Mysql 学习
  9. jbpm4.4+ssh配置(有些使用经验很好)
  10. pthread_mutex_t
  11. HDU1064 第一道JAVA
  12. 设定PCB电路板形状和物理边界
  13. android keytool 不是内部命令或外部命令在 (win7下不能用的解决方法)
  14. javascript操作JSON字符
  15. Android EditText 无法换行
  16. C/C++基础知识总结——继承与派生
  17. ios开发实践之UIDatePicker(已对之前无法解决的问题做了解答)
  18. android两种方式获取AsyncTask返回值
  19. JavaWeb之多语言国际化
  20. JAVA 并发(待补全!)

热门文章

  1. (day29) 进程互斥锁 + 线程
  2. 计算机基础之编程 + 基本组成 + 组成补充 + 操作系统(day01整理)
  3. OptimalSolution(5)--数组和矩阵问题(1)简单
  4. Java基础(八)对象包装器与自动装箱
  5. 简单的Dos Unity操作(debug)
  6. day2编程语言发展史
  7. krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦
  8. Android自定义控件:图形报表的实现(折线图、曲线图、动态曲线图)(View与SurfaceView分别实现图表控件)
  9. IDEA复制多行及对多行代码上下左右移动
  10. 如何在Vue项目中使用Typescript