爬虫基础教程

一、简介

网络爬虫一般分为两个过程:

  1. 通过网络连接获取网页内容,即以HTML语言写成的网页源代码,具有此功能的函数库有urllib、urllib2、urllib3、wget、scrapy、requests等。
  2. 对获得的网页内容进行处理,可通过re(正则表达式)、beautifulsoup4等函数库来处理。

下面介绍最重要且最主流的requests和beautifulsoup4函数库。

首先在命令行采用pip或pip3指令安装requests库和beautifulsoup4库:

:\>pip install requests #或pip3 install requests
······
······
:\>pip install beautifulsoup4 #或pip3 install beautifulsoup4

二、requests库的使用

 

爬虫基础教程_第1张图片 requests库中的网页请求函数(6个)

 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对象的属性如下,需要采用.的形式。

爬虫基础教程_第2张图片 Response对象的属性(4个)
>>> 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]怎么办?

 

 

爬虫基础教程_第3张图片 Response对象的方法(2个)

json()方法能够在HTTP响应内容中解析存在的JSON数据。

raise_for_status()方法能在非成功响应后产生异常,即只要返回多请求状态status_code不是 200,这个方法会产生一个异常,用于try-except语句。使用异常处理可以避免设置一堆复杂的if语句,只需在收到响应时调用这个方法,就可避免状态字200以外的各种意外情况。

requests会产生几种常用异常:

  1. 当遇到网络问题时,如DNS查询失败、拒绝连接等,requests会抛出ConnectionError异常;
  2. 遇到无效HTTP响应时,requests会抛出HTTPError异常;
  3. 若请求url超时,抛出Timeout异常;
  4. 若请求超过了设定的最大重定向次数,则会抛出TooManyRedirects异常。

获取一个网页内容的函数建议采用如下代码的第二行到第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库的使用

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

 百度一下,你就知道  

关于百度 About Baidu

©2017 Baidu 使用百度前必读  意见反馈 京ICP证030173号 

创建的BeautifulSoup对象是一个树形结构,它包含HTML页面中的每一个Tag(标签)元素,如、等。具体来说,HTML中的主要结构都变成了Beautiful对象的一个属性,直接用.形式获得,其中的名字采用HTML中标签的名字,下表为BeautifulSoup对象的常用属性。

爬虫基础教程_第4张图片 BeautifulSoup对象的常用属性(6个)

 

>>> soup.head #略去