Python-网络爬虫之BeautifulSoup(1)

时间:2021-08-23 22:47:31

一、urllib包的使用
Python最著名的作用便是用来爬取网络数据,而python中也有相关的标准库urllib。
需要注意的是在python2.x中其名为urllib2,在python中改为urllib,并被分为urllib.request、urllib.parse和urllib.error,在import库时需要注意

from urllib.request import urlopen
html=urlopen("http://www.pythonscraping.com/pages/page1.html")
print(html.read())

以上是urlopen的使用,可以获得指定链接上的源代码并保存成html对象,值得注意的是需要添加.read()函数,才能输出内容,否则是无法输出的


二、BeautifulSoup的初步使用
虽然读取网页内容很简单,但是如何对其进行处理或者挑选却是麻烦的,因为我们需要面对许多的html标签。为此需要借助第三方类库,而其中最为著名的就是BeautifulSoup,本文示例采用bs4(简称也是)

1.安装
有关类库的安装参考,Python语言学习-安装第三方类库
之后导入包即可from bs4 import BeautifulSoup

2.标签的初步使用
在利用bs4对html进行操作前,需要先利用bs4将其转化成可操作的对象

from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj = BeautifulSoup(html.read())
print(bsObj.h1)

输出结果:<h1>An Interesting Title</h1>
bsObj对象将html内容转化成了如下形式

<html>
<head>
<title>A Useful Page</title>
</head>
<body>
<h1>An Interesting Title</h1>
<div>……
</div>
</body>
</html>

因此我们可以直接调用所需的标签,当然这种方式之后输出第一个对应标签
类似的如bsObj.body.h1都是可以达到同样的目的
有关BeautifulSoup标签更进一步的应用下一节会有更详细的介绍

3.异常处理
网络环境是复杂的,各种标签的存在也使得网络数据爬取更加容易出现异常。如果对于这些异常情况不做处理,代码的适应性会大打折扣,对之后修改bug也大大不利。

html=urlopen("http://www.pythonscraping.com/pages/page1.html")
存在两种可能的异常:
①服务器不存在
②网页不存在或或获取页面错误
此错误类型为HTTPEror

又如print(bsObj.h1)
存在找不到对应标签的错误
此错误类型为AttributeError

在对异常处理时,往往要导入urllib.error包,具体代码如下:

from urllib.error import HTTPError
from urllib.request import urlopen
from bs4 import BeautifulSoup
try:
html=urlopen("http://www.pythonscraping.com/pages/page.1
.html"
)
except HTTPError as e:
print("web_site is not found") #代表网页不存在或服务器无法访问
else: #若不存在上述异常
bsObj = BeautifulSoup(html.read())
try:
print(bsObj.h1)
except AttributeError as e:
print("the title is not found")

为了代码的简洁和复用,这类代码可以封装成类