urllib是一个用来处理网络请求的python数据库,它包含四个模块
urllib.requests 请求模块,用于发起网络请求
urllib.parse 解析模块,用于解析URL
urllib.error 异常处理模块,用于处理request引起的异常
urllib.robotparse 用于解析robots.txt文件
request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。
利用它可以模拟浏览器的请求发起过程。
a.发起网络请求
b.添加Headers
c.操作cookie
d.使用代理
urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果。
from urllib import request
response = request.urlopen(url='http://httpbin.org/get')
urlopen 默认会发送get请求,当传入data数据时,则会发生POST请求。data参数是字节类型、这类文件对象或可迭代对象。
response = request.urlopen(url='http://httpbin.org/post'),
data=b'uesrname=jay&password=123456'
还可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,
timeout只对,http,https以及ftp连接起作用。以秒为单位,比如可以设置timeout=0.1 超时时间为0.1秒。
response = request.urlopen(url='http://www.baidu.com', timeout=0.1)
利用openurl可以发起最基本的请求,但这几个简单的参数不足以构建一个完整的请求,可以利用更强大的Request对象来构建更加完整的请求。
req == resquest.Request('http://www.baidu.com')
response = request.urlopen(req)
通过urllib发送的请求会有一个默认的Headers: “User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来。
headers = {
'user-Agent':'Mozilla/5.0(Window NT 10.0; Win64;) AppleWebkit/537.36(KHTML, like Gecko)'
}
print(heaeders)
url = 'http://www.baidu.com'
req = request.Request('http://www.baidu.com', headers)
在开发得过程中,对cookie得处理非常重要,urllib得cookie处理如下:
from urllib import request
from http import cookiejar
# 创建一个cookie 对象
cookie = cookiejar.CookieJar()
# 创建一个cookie处理器
coolie = request.HTTPCookieProcessor(cookie)
# 以它为参数,创建Openner对象
opener = request.build_opener(cookies)
# 使用这个openner来发请求
res = opener.opeen('http://www.baidu.com')
print(coolie.cookiejar)
运行爬虫的时候,经常出现被封的情况,这时候我们就需要用ip代理来处理,
urllib的IP处理如下:
from urllib import request
url = 'http://httpbiin.org/ip'
# 代理地址
proxy = {'http':'180.76.111.69:3128'}
# 代理处理器
proxies = request.baidu_opener(proxies)
res = oprner.open(url)
print(res.read().decode())
urllib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果。
a.read() 获取响应的数据,只能用一次
print(response.read())
b.readline 读取一行
while True:
data = response.readlin()
if data:
print(data)
c.info() 获取响应头信息
print(response.info())
d.geturl() 获取访问的url
print(response.geturl())
e,getcode() 返回状态码
print(response.getcode())
parse模块是一个工具模块,提供了需要对url处理的方法,用于解析url。
url中只能包含ascii字符,在实际操作过程中,get请求通过url传递的参数中会有大量的特殊字符,例如汉字,那么就需要进行url编码。
例如https://baike.baidu.com/item/URL编码/3703727?fr=aladdin
我们需要将编码进行url编码
from urllib import parse
url = 'http://httpbin.org/get?aaa={}'
safe_url = url.format(parse.quote('人生苦短,我用Python'))
print(safe_url)
运行结果 ✳也可以用parse.unquote()反编码回来
http://httpbin.org/get?aaa=%E4%BA%BA%E7%94%9F%E8%8B%A6%E7%9F%AD%EF%BC%8C%E6%88%91%E7%94%A8Python
在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的。
params = {'wd':'测试','code':1,'height':'100'}
res = parse.urlencode(params)
print(res)
'''
运行结果
wd=%E6%B5%8B%E8%AF%95&code=1&height=100
'''
也可以通过parse.parse_qs()方法将它转回字典
print(parse.parse_qs('wd=%E6%B5%8B%E8%AF%95&code=1&height=100'))
'''
运行结果
{'wd': ['测试'], 'code': ['1'], 'height': ['100']}
'''
error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理
主要包含URLError和HTTPError。
a.URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理
b.HTTPError:是URLError的子类,主要包含三个属性:
(1) code:请求的状态码
(2) reason:错误原因
(3) headers:响应的报头
robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的Notepad,就可以创建和编辑它 [1] 。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。