python2中常用的包是
urllib2
,而在python3中常用的是urllib.request
,两者在常用的功能是等价的,这里以python3为例
1 网页原理介绍
1.1 什么是爬虫
爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来。想抓取什么?这个由你来控制它咯。
比如它在抓取一个网页,在这个网中他发现了一条道路,其实就是指向网页的超链接,那么它就可以爬到另一张网上来获取数据。这样,整个连在一起的大网对这之蜘蛛来说触手可及,分分钟爬下来不是事儿。
1.2 浏览网页的过程
在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如http://image.baidu.com/,我们会看到几张的图片以及百度搜索框,这个过程其实就是用户输入网址之后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器 HTML、JS、CSS 等文件,浏览器解析出来,用户便可以看到形形色色的图片了。
因此,用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容,通过分析和过滤这些 HTML 代码,实现对图片、文字等资源的获取。
1.3 URL的含义
URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。
爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据,准确理解它的含义对爬虫学习有很大帮助。
1.4 HTTP请求流程
1.4.1 建立连接
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
1.4.2 请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用报头:
1. Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。
eg :Accept:image/gif,表明客户端希望接受GIF图象格式的资源;
Accept:text/html,表明客户端希望接受html文本。
2. Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。
eg :Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
3. Accept-Encoding
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。
eg :Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
4. Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。
eg :Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。Authorization
5. Host
Host请求报头域主要用于指定被请求资源的Internet主机和端口号。
eg :http://www.guet.edu.cn/index.html
Host:www.guet.edu.cn 此处使用缺省端口号80
6. User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的。
相应报头:
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
1. Location
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
2.Server
Server响应报头域包含了服务器用来处理请求的软件信息。
3.WWW-Authenticate
WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg :WWW-Authenticate:Basic realm=Basic Auth Test! //可以看出服务器对请求资源采用的是基本验证机制。
2 爬虫
2.1 简单的例子
import urllib.request
url= "http://www.baidu.com"
data = urllib.request.urlopen(url).read()
data = data.decode('utf-8')#data是bytes格式,需要转化成unicode格式
print(data)
接下来我们来分解整个过程,首先上面的获取过程分为两步:
1、发送GET请求
req = urllib.request.Request(url)
# 模拟浏览器
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1')
2、获取返回的数据,同时也可以POST数据
data=urllib.request.urlopen(req).read()
# 这个过程也可以POST登陆信息
login_data=urllib.parse.urlencode({'username':email,'password':password,'entry':'mweibo'})
urllib.request.urlopen(req,data=login_data.encode('utf-8'))