文章目录

  • 发送请求
  • 异常处理
  • #2.HTTPError
  • 解析连接
  • urlparse
  • 2.urlunparse
  • 3.urlspllit
  • 4.urlunsplit
  • 5.urljoin
  • 6.urlencode
  • 7.parse_qs
  • 8.parse_qsl
  • 9.quote
  • 10.unquote
  • Robots协议


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

  • request: http的请求模块,传入UPL及额外的参数,就模拟发送请求
  • error : 异常处理模块,确保程序不会意外终止
  • parse : 一个工具模块,提供了许多URL处理方法。
  • robotparser : 用来识别robots.txt文件,判断那些网站可以爬

发送请求

###1.urlopen

import urllib.request  

response = urllib.request.urlopen('https://www.python.org')  
print(response.read().decode('utf-8'))

就可以输出网页的源代码,通过源代码就可以找到我们想要的信息

利用最基本的 urlopen 方法,可以完成最基本的简单网页的 GET 请求抓取。

###2.Request

利用 urlopen 方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求。如果请求中需要加入 Headers 等信息,就可以利用更强大的 Request 类来构建。

通过Resquest中添加参数来构造

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

第一个参数 url 用于请求 URL,这是必传参数,其他都是可选参数。

第二个参数 data 如果要传,必须传 bytes(字节流)类型的。如果它是字典,可以先用 urllib.parse 模块里的 urlencode() 编码。

第三个参数 headers 是一个字典,它就是请求头,我们可以在构造请求时通过 headers 参数直接构造,也可以通过调用请求实例的 add_header() 方法添加。添加请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器

第五个参数 unverifiable 表示这个请求是否是无法验证的,默认是 False,意思就是说用户没有足够权限来选择接收这个请求的结果。例如,我们请求一个 HTML 文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True。

第六个参数 method 是一个字符串,用来指示请求使用的方法,比如 GET、POST 和 PUT 等。

from urllib import request, parse  

url = 'http://httpbin.org/post'  
headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',  
    'Host': 'httpbin.org'  
}  
dict = {'name': 'Germey'}  
data = bytes(parse.urlencode(dict), encoding='utf8')  
req = request.Request(url=url, data=data, headers=headers, method='POST')  
response = request.urlopen(req)  
print(response.read().decode('utf-8'))

异常处理

###1.URLError

URLError 类来自 urllib 库的 error 模块,由 request 模块产生的异常都可以通过捕获这个类来处理。它具有一个属性 reason,即返回错误的原因。

#2.HTTPError

它是 URLError 的子类,专门用来处理 HTTP 请求错误,比如认证请求失败等。它有如下 3 个属性。

  • code:返回 HTTP 状态码,比如 404 表示网页不存在,500 表示服务器内部错误等。
  • reason:同父类一样,用于返回错误的原因。
  • headers:返回请求头。

解析连接

urllib 库里还提供了 parse 模块,它定义了处理 URL 的标准接口,例如实现 URL 各部分的抽取、合并以及链接转换。

urlparse

该方法可以实现URL的识别和分段

from urllib.parse import urlparse

result = urlparse('https://www.baidu.com/index.html;user?id=6#comment')
print(type(result),result)

python3 模块urllib下载 python的urllib模块_html

urlparse 方法将其拆分成了 6 个部分。大体观察可以发现,解析时有特定的分隔符。比如:// 前面的就是 scheme,代表协议;第一个 / 符号前面便是 netloc,即域名,后面是 path,即访问路径;分号;后面是 params,代表参数;问号?后面是查询条件 query,一般用作 GET 类型的 URL;井号 #后面是锚点,用于直接定位页面内部的下拉位置。

一个标准的 URL 都会符合这个规则,利用 urlparse 方法可以将它拆分开来。

2.urlunparse

有了 urlparse 方法,相应地就有了它的对立方法 urlunparse。它接受的参数是一个可迭代对象,但是它的长度必须是 6,否则会抛出参数数量不足或者过多的问题。

from urllib.parse import urlunparse  

data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']  
print(urlunparse(data))

输出结果:

http://www.baidu.com/index.html;user?a=6#comment

3.urlspllit

这个方法和 urlparse 方法非常相似,只不过它不再单独解析 params 这一部分,只返回 5 个结果。上面例子中的 params 会合并到 path 中。示例如下:

python3 模块urllib下载 python的urllib模块_html_02

可以发现,返回结果是 SplitResult,它其实也是一个元组类型,既可以用属性获取值,也可以用索引来获取

4.urlunsplit

与 urlunparse 方法类似,它也是将链接各个部分组合成完整链接的方法,传入的参数也是一个可迭代对象,例如列表、元组等,唯一的区别是长度必须为 5

from urllib.parse import urlunsplit  

data = ['http', 'www.baidu.com', 'index.html', 'a=6', 'comment']  
print(urlunsplit(data))

结果如下

http://www.baidu.com/index.html?a=6#comment

5.urljoin

有了 urlunparse 和 urlunsplit 方法,我们可以完成链接的合并,不过前提必须要有特定长度的对象,链接的每一部分都要清晰分开。

此外,生成链接还有另一个方法,那就是 urljoin 方法。我们可以提供一个 base_url(基础链接)作为第一个参数,将新的链接作为第二个参数,该方法会分析 base_url 的 scheme、netloc 和 path 这 3 个内容并对新链接缺失的部分进行补充,最后返回结果。

python3 模块urllib下载 python的urllib模块_搜索_03

6.urlencode

urlencode,它在构造 GET 请求参数的时候非常有用,

这里首先声明了一个字典来将参数表示出来,然后调用 urlencode 方法将其序列化为 GET 请求参数。

from urllib.parse import urlencode  

params = {  
    'name': 'germey',  
    'age': 22  
}  
base_url = 'http://www.baidu.com?'  
url = base_url + urlencode(params)  
print(url)

输出

http://www.baidu.com?name=germey&age=22

7.parse_qs

反序列化,一串 GET 请求参数,利用 parse_qs 方法,就可以将它转回字典

python3 模块urllib下载 python的urllib模块_python3 模块urllib下载_04

8.parse_qsl

还有一个 parse_qsl 方法,它用于将参数转化为元组组成的列表

python3 模块urllib下载 python的urllib模块_python_05

9.quote

该方法可以将内容转化为 URL 编码的格式。URL 中带有中文参数时,有时可能会导致乱码的问题,此时用这个方法可以将中文字符转化为 URL 编码。

python3 模块urllib下载 python的urllib模块_html_06

10.unquote

有了 quote 方法,当然还有 unquote 方法,它可以进行 URL 解码

python3 模块urllib下载 python的urllib模块_搜索_07

Robots协议

Robots 协议也称作爬虫协议、机器人协议,用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个叫作 robots.txt 的文本文件,一般放在网站的根目录下

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

只需要在你要爬取的网址后添加robots.txt就可以判断该网页是否可以爬取

python3 模块urllib下载 python的urllib模块_前端_08


4375.png)]