文章目录
- 发送请求
- 异常处理
- #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)
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 中。示例如下:
可以发现,返回结果是 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 个内容并对新链接缺失的部分进行补充,最后返回结果。
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 方法,就可以将它转回字典
8.parse_qsl
还有一个 parse_qsl 方法,它用于将参数转化为元组组成的列表
9.quote
该方法可以将内容转化为 URL 编码的格式。URL 中带有中文参数时,有时可能会导致乱码的问题,此时用这个方法可以将中文字符转化为 URL 编码。
10.unquote
有了 quote 方法,当然还有 unquote 方法,它可以进行 URL 解码
Robots协议
Robots 协议也称作爬虫协议、机器人协议,用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个叫作 robots.txt 的文本文件,一般放在网站的根目录下
当搜索爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在 robots.txt 文件,如果存在,搜索爬虫会根据其中定义的爬取范围来爬取。如果没有找到这个文件,搜索爬虫便会访问所有可直接访问的页面。
只需要在你要爬取的网址后添加robots.txt就可以判断该网页是否可以爬取
4375.png)]