网络爬虫是搜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个互联网内容的镜像备份。爬虫的原理是从起始种子链接开始的,通过发送HTTP请求,得到该链接的内容,然后对内容进行分析获取网页中的有效链接,并将这些连接保存到待访问队列中,等待爬虫线程爬取。
Python提供了众多函数库来实现网页数据的爬取和分析,例如,通过标准库urllib、第三方库requests 爬取网页;通过正则表达式库re、第三方库beautifulsoup4 分析网页。
爬取网页需要程序员了解浏览器和Web服务器的请求响应的工作过程,掌握URL地址的含义等基本知识。
Http协议
用户浏览网页的过程就是客户端和Web服务器请求应答的过程,浏览网页时客户端向服务器端发出请求,访问服务器上的数据,服务器根据请求返回数据。浏览器和客户端之间的通信的基础就是HTTP协议,HTTP协议是一个无状态的协议,同一个客户端的一次请求和上次请求没有对应关系。
Http工作过程
(1) 客户端与服务器建立连接。
(2) 服务器接到请求后,返回响应信息,其格式为一个状态行。
(3) 客户端接收服务器所返回的信息,浏览器解析并显示网页。
如果以上步骤出现错误,产生的错误信息将返回到客户端。这些过程是由HTTP自己完成的,用户只需要等待信息显示即可。
网络爬虫
Web服务器上的信息资源在网上都有唯一地址,该地址称为URL地址。URL地址由三部分组成:
protocol://hostname[:port]/path
网络爬虫就是根据URL来获取网页信息的。网页爬虫应用一般分为两个步骤:连接网络并获取网页内容;队获得的网页内容进行处理。这两步骤分别使用不同的库
该库是python内置的库,该库提供了一函数和方法,它可以使得用户像访问本地文件一样读取网页的内容或者下载网页。
urllib库中包含的模块:
使用urllib.request.urlopen()函数打开一个网页,读取并打印网页信息。格式:
urllib.request.urlopen(URL[,data,proxies])
参数data表示提交到url的数据;参数proxies用于设置代理。函数返回一个Response对象,可以像本地文件一样操作这个Response对象以获取远程数据。Response对象的一些方法:
import urllib.request
fopen = urllib.request.urlopen("http://www.sohu.com")
print("Status:",fopen.status,fopen.reason)
#以下代码等同于 fopen.info()
for k,v in fopen.getheaders():
print("%s:%s"%(k,v))
概念
使用requests库编程的过程更接近正常访问URL的过程,更易于理解和应用。由于是第三方库,故需要安装后才能使用。
requests库有丰富的链接访问功能,例如URL获取、HTTP长链接和链接缓存、自动内容解码、文件分块上传、链接超时处理、流数据下载等。
requests库解析
res = requests.get(url,header = header[,timeout=n])
res对象的主要属性:
res对象的两个方法:
beautifulsoup4库也叫bs4库,用于快速转换被爬取的网页的第三方库。bs4将网页转换为一颗DOM树,并尽可能和原文档内容保持一致。
bs4库提供一些简单 方法和类来查找、定位、修改一个转换后的DOM树,还能自动将送进来的文档转换为unicode编码,而且在输出时转化为UTF-8格式。
DOM树中的每一个节点都是一个Python对象,所有的对象都可以归纳为4种类型:
Tag 对象 :HTML标签加上其中包含的内容就是Tag。找到的时所有内容种以一个符合要求的标签,如果要查询所有的标签,需要使用find_all()方法。可以通过type()函数验证标签对象的类型。
NavigableString对象 : 用于操纵标签内部的文字,标签的string属性返回NavigableString对象。
Beautifulsoup对象 :表示一个文档的全部内容。
Comment对象 : 一个特殊的NavigableString对象,它的内容不包括注释符号。注释是一个Comment对象,所以用户在使用string前需要先做一下判断。
from bs4 import BeautifulSoup
html = ""
soup = BeautifulSoup(html,"html.parser")
soup.p.string #无判断直接输出
if(type(soup.p.string) == soup.Comment):# 先判断标签种是否为注释语句
print(soup.p)
-----未完待续