在大数据、人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一。而Python则是目前数据科学项目中最常用的编程语言之一。使用Python与BeautifulSoup可以很容易的进行网页爬取,通过网站爬虫获取信息可以帮助企业或个人节省很多的时间和金钱。学习本文之后,我相信大部分新手都能根据自己的需求来开发出相应的网页爬虫。
基础条件
了解简单的Python编程规则(Python3.x)
了解简单的网页Html标签
如果您是完全的新手也不用担心,通过本文您可以很容易地理解。
安装所需包
首先,您需要先安装好Python 3.x,Python安装包可以从python.org下载,然后我们需要安装requests和beautifulsoup4两个包,安装代码如下:
$ pip install requests
$ pip install beautifulsoup4
爬取网页数据
现在我们已经做好了一切准备工作。在本教程中,我们将演示从没被墙的维基百科英文版页面中获取历届美国总统名单。
转到此链接(https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States#Presidents)并右键单击包含有关美国总统的所有信息的表格,然后单击“检查”选项(我用的是Chrome浏览器,其他浏览器右键单击页面后也会具有类似或相同的选项)。
由下图可知,表格的内容位于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())
这会将数据按照我们上面“检查”中看到的代码形式展示出来:
目前获得的是包含我们所需数据的网页源码,我们接下来要将有用的信息提取出来。上面已经知道我们所需的内容在class属性为wikitable的table标签下,因此,接下来我们将使用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)
这将获取所有a标签下的数据:
可以看出,这并不是我们所要的最终结果,其中掺杂着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
...
...
Barack Obama
Donald Trump
将Python代码合并在一起:
import requests
from bs4 import BeautifulSoup
url ="https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States"
page = requests.get(url)
soup = BeautifulSoup(page.content,'html.parser')
tb = soup.find('table', class_='wikitable')
for link in tb.find_all('b'):
name = link.find('a')
print(name.get_text('title'))
仅仅9行代码,我们就实现了网页信息的爬取,我相信您从中已经学到了Python、html的基础知识,并且已经懂得了网页爬虫的基本原理,如果想更深入的学习网页爬虫,你可以尝试对以上代码进行改进,尝试爬取更多的网站,欢迎与我留言交流。
END
本公众号原创作品,未经授权禁止转载,特此声明,谢谢合作!
领取专属 10元无门槛券
私享最新 技术干货