请求库1 - urllib

urllib

urllib库是Python内置的HTTP请求库,包含4个模块:

  • request:用来模拟发送请求的基本HTTP请求模块
  • error:此模块定义了请求过程中可能出现的异常,高效的爬虫需要捕获并处理这些可能出现的异常以防止程序意外终止
  • parse:处理URL的工具
  • robotparser不常用,识别网站的robots.txt文件,判定网站是否可爬

发送请求

request.urlopen

urllib.request模块可以模拟浏览器发送请求,提供了最基本的HTTP请求方法。

向服务器发送一个请求并获得响应(Response):

1
response = urllib.request.urlopen("https://www.python.org")

取得的响应是一个http.client.HTTPResponse对象,它包含了与请求结果相关的各种属性和方法:

  • 超文本解码response.read().decode('utf-8')
  • 请求状态码response.status,200表示请求成功
  • 头部信息response.getheaders()元组列表形式
  • 某项头部信息response.getheader('Server'),响应头中的Server值。例如如果Server值为”nginx”就代表服务器是由Nginx搭建的

urllib.request.urlopen()的API如下:

1
urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

除了给定基本的URL之外,还可以传递其它数据:

  • data参数:可选,用于构造POST请求。data必须是bytes类型/bytes类型的可迭代对象/文件对象,不能是str类型。下面这种方式可以构造一个有效的data参数值:

    1
    2
    3
    4
    5
    6
    7
    8
    args = {'word': 'hello'} # dict
    args = urllib.parse.urlencode(args) # str: Unicode
    data = bytes(args, encoding='utf-8') # bytes: UTF-8
    response = urllib.request.urlopen('http://httpbin.org/post', data=data)
    # response.getheader('Content-Type') => application/json
    # response.read().decode('utf-8')是一个json字符串
    # 我们构造的data参数存储在"form"字段中
    # 表示我们提交的是表单请求
  • timeout参数:可选,超时时间,单位为。超时未响应的程序会抛出urllib.error.URLError错误(其实叫异常是不是更好~)

  • context参数:可选,用来指定SSL设置,必须是ssl.SSLContext类型
  • cafile参数:可选,CA证书名称,HTTPS请求需要
  • capath参数:可选,CA证书路径,HTTPS请求需要

request.Request

urlopen只能实现最基本的请求发起,参数过于简单,不能加入headers等信息。构建完整的请求可以使用Request类。我们通过各种丰富的参数实例化Request类,然后再调用urlopen进行请求:

1
2
3
request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')

urllib.request.Request对象的构造方法如下:

1
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

  • databytes类型,同urlopen中的data参数相似
  • headersdict类型,请求头;或者通过.add_header()方法添加。常用的请求头为:{"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"}
  • origin_req_host:请求方的host地址(ip地址)
  • unverifiable:是否是无法验证的请求,默认为False,表示用胡可以获取请求的结果
  • method:请求的方法(GET/POST/PUT/…)

一个使用Request对象获取请求的例子:

1
2
3
4
5
6
7
8
9
10
11
url = 'http://httpbin.org/post'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
'Host': 'httpbin.org'
}
data_dict = {'name': 'Germey'}
data = bytes(urllib.parse.urlencode(data_dict), encoding = 'utf-8')

request = urllib.request.Request(url, data = data, headers = headers, method = 'POST')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

request.Handler

urlopen只能进行最基础的请求,Request类实现了在请求中添加请求头,但它们都不能解决Cookies处理和代理设置等更加高级的问题,此时就轮到Handler工具登场了。

基于urllib.request.Handler基类继承实现的高级Handler主要有:

  • HTTPDefaultErrorHandler:处理HTTP响应错误
  • HTTPRedirectHandler:处理重定向
  • HTTPCookieProcessor:处理Cookies
  • ProxyHandler:设置代理
  • HTTPPasswordMgr:管理密码
  • HTTPBasicAuthHandler:管理认证
  • 其它的Handler

request.OpenerDirector

在之前的例子中,urllib通过urlopen函数为我们提供了一个隐藏的OpenerDirector对象(或者叫Opener)。

Opener类相比于urlopen函数和Request类能实现更多的功能,它是更加底层的工具。

Opener对象通过Handler来构建。

opener.addheaders = [('user-Agent', '...)]可设置请求头


[Python3网络爬虫开发实战] 3.1.1-发送请求

异常处理

合理的异常处理使得程序更加稳健。

urllib.request产生的异常urllib.error模块处理。

URLError (base)

urllib.error.URLErrorurllib.error模块中的基类,下面提到的所有异常都是继承自URLError

所有的urllib.request产生的异常都可以通过URLError进行捕获,如果记不住其它更精细的异常类的话用这个准没错。

URLError异常有个很常用的属性叫做reason,帮助我们快速判断出错原因。

reason描述了错误的原因,但它不一定是字符串,也可能是个对象。例如超时请求会返回一个socket.timeout对象,因此使用异常的reason的值时最好进行类型检查。

HTTPError

处理HTTP请求错误,常用的三个属性:

  • code:状态码
  • reason:错误原因
  • headers:请求头

其它


[Python3网络爬虫开发实战] 3.1.2-处理异常

URL处理

urllib.parse模块用来处理URL(部分),支持多种协议。

常用方法如下:

  • urlparse: 将完整的URL字符串拆分为一个六元素元组。
    URL的标准格式为:scheme://netloc/path;parameters?query#fragment
  • urlunparse: 将一个长度为6的可迭代对象(元组、列表等)转化为一个完整的URL字符串
  • urlsplit: 和urlparse()十分相似,只是把params部分合并到了path
  • urlunsplit: 和urlunparse()十分相似,处理对象为5元素的可迭代对象
  • urljoin: 只能填补、合并
  • urlencode:将参数字典序列化为GET请求的参数字符串
  • parse_qs:功能与urlencode相反,将参数字符串转化为字典
  • parse_qsl:功能与urlencode相反,将参数字符串转化为元组列表
  • quote:对字符串进行URL编码,例如中文会被转化为编码
  • unquote:对编码的字符串进行URL解码,例如中文编码被解码回中文
  • 其它

分析Robots协议

Robots协议也称作爬虫协议机器人协议,它的全名叫作网络爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。

它通常是一个叫作robots.txt的文本文件,一般放在网站的根目录下。当搜索爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在robots.txt文件,如果存在,搜索爬虫会根据其中定义的爬取范围来爬取。如果没有找到这个文件,搜索爬虫便会访问所有可直接访问的页面。

>>>>>>>>>>>>> 转载请注明出处 <<<<<<<<<<<<<
0%