网络爬虫一般分为两个过程:
下面介绍最重要且最主流的requests和beautifulsoup4函数库。
首先在命令行采用pip或pip3指令安装requests库和beautifulsoup4库:
:\>pip install requests #或pip3 install requests
······
······
:\>pip install beautifulsoup4 #或pip3 install beautifulsoup4
get()是获取网页最常用的方式,在调用requests.get()函数后,返回的网页内容会保存为一个Response对象。其中,get()函数的参数url链接必须采用HTTP或HTTS方式访问,例如:
>>> import requests
>>> r=requests.get("http://www.baidu.com") #使用get方法打开百度链接
>>> type(r)
#返回Response对象
requests.get()代表请求过程,返回的Response对象代表响应。返回内容作为一个对象便于操作,Response对象的属性如下,需要采用.的形式。
>>> r=requests.get('http://www.baidu.com')
>>> r.status_code #返回状态
200
>>> r.text #观察返回的内容,中文字符是否能正常显示
(输出略)
>>> r.encoding #默认的编码方式是ISO-8859-1,所以中文是乱码
'ISO-8859-1'
>>> r.encoding='utf-8' #更改编码方式为utf-8
>>> r.text #更改完成,返回内容中的中文字符可以正常显示了
(输出略)
有时get()函数返回状态不是200,可参考爬虫时requests.get()响应状态码不是[200]怎么办?
json()方法能够在HTTP响应内容中解析存在的JSON数据。
raise_for_status()方法能在非成功响应后产生异常,即只要返回多请求状态status_code不是 200,这个方法会产生一个异常,用于try-except语句。使用异常处理可以避免设置一堆复杂的if语句,只需在收到响应时调用这个方法,就可避免状态字200以外的各种意外情况。
requests会产生几种常用异常:
获取一个网页内容的函数建议采用如下代码的第二行到第9行,第10行和第11行是测试代码。
import requests
def getHTMLText():
try:
r=requests.get(url,timeout=30)
r.raise_for_status() #如果状态不是200,引发异常
r.encoding='utf-8' #无论原来用什么编码,都改成utf-8
return r.text
except:
return ""
url='http://www.baidu.com'
print(getHTMLText(url))
beautifulsoup4库也称Beautiful Soup或bs4库,采用面向对象思想实现,库中最主要的是BeautifulSoup类。采用from-import导入库中的Beautifulsoup类后,使用BeautifulSoup()创建一个BeautifulSoup对象。
>>> import requests
>>> from bs4 import BeautifulSoup
>>> r=requests.get("http://www.baidu.com")
>>> r.encoding="utf-8" #为了简化代码,没有考虑异常情况
>>> soup=BeautifulSoup(r.text) #soup就是一个BeauifulSoup对象
>>> type(soup)
>>> soup
百度一下,你就知道
创建的BeautifulSoup对象是一个树形结构,它包含HTML页面中的每一个Tag(标签)元素,如
、等。具体来说,HTML中的主要结构都变成了Beautiful对象的一个属性,直接用.形式获得,其中的名字采用HTML中标签的名字,下表为BeautifulSoup对象的常用属性。
>>> soup.head #略去