什么是Urllib: 一个python内置的HTTP请求库
主要包含四个模块:
urllib.request 请求模块: 用这个模块模拟发送页面请求
urllib.error 异常处理模块: 保证程序不会由于运行出错而意外终止
urllib.parse url解析模块: 作为页面处理的工具模块使用
urllib.robotparser robots.txt解析模块,用于解析网站的robots文件
urlopen
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
主要运用前三个参数,url,data(设置post请求的一些数据),timeout
Request
在发送一些较为复杂的request请求的时候,比方说在request里面加上设置了的headers的时候,可以使用Request方法。
#注意:我们用这个方法设置的是Request请求,应配合urlopen方法使用Request方法设置好的request,返回的即response
例如:
# request 的设置
from urllib import request, parse
url = 'http://httpbin.org/post'
headers = {
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
"Host":"httpbin.org"
}
dict = {'name':"自定义"}
data = bytes(parse.urlencode(dict),encoding='utf-8')
req = request.Request(url=url,headers=headers,method='POST',data=data)
response = request.urlopen(req)
print(response.read().decode("utf-8"))
Handler
在python的官方文档中,关于Handler的介绍有很多种,这里作为我入门的第一个学习的handler,主要是代理Handler(proxy-handler)
使用代理,可以更换我们请求资源使用的IP,这样在违规操作的时候万一被ban了,也可以通过更换IP继续运行,不过最好不要这样干,将心比心,经营网站的人也不容易(→_→)
使用代理的方法比较简单,记下这个套路:
import urllib.request
url = "http://www.baidu.com"
proxy_handler = urllib.request.ProxyHandler({
"http":'http://127.45.97.1:9743',
"https":'http://127.45.97.1:9743'}) #注意这个方法传入的是字典格式
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url)
print(response.read())
cookie(存储在用户本地终端上的数据)
Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息
在页面中,最常见的cookies就是登录信息,我们在制作爬虫的时候可以利用cookies来保持登录信息,以避免某些网站要求的登录验证等。同理,如果自行删除掉cookies,我们的登录状态就会自动被退出。
下面用一段小代码做个示范
# about cookies
import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie) #this is also a handler
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")
for item in cookie:
print(item.name + " = " + item.value)
我们也可以把cookies保存为txt文件,不过使用的方法不同:
上述代码中,cookies应该这样声明:
cookie = http.cookiejar.MozillaCookieJar(filename)
在最后应该调用cookie.save方法保存此文件。
同样的,cookie也存在其他的格式,比方说最常见的LWP format,示例代码如下:
# cookie can also save in a 'LWP' format
import http.cookiejar,urllib.request
#保存cookies到本地
filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")
cookie.save(ignore_discard=True,ignore_expires=True)
#加载cookies
cookie.load("cookies.txt",ignore_discard=True,ignore_expires=True)
print(response.read().decode('utf-8'))
这样,在访问某些只能登录才能访问的页面时,就没有问题了
异常处理
打开python3 的官方文档,我们查询urllib.error的相关文档,可以发现由urllib.request产生的error一共有三类:
URLError 、 HTTPError 和 ContentTooShortError,使用异常的方法属于python基础内容,不过多介绍。
from urllib import request,error
url = '######'
try:
response = request.urlopen(url)
except error.HTTPError as e:
print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:
print(e.reason)
else:
print("request successfully!")
url解析
urlparse
urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)
url解析,顾名思义就是把url分解,分析为不同的几个片段。输入的urlstring没有协议类型的时候,我们可以在函数中指定默认的协议scheme。
allow_fragments=True 这个参数如果改为False,那么urlstring中属于fragment的部分就不会单独分出来,会I懂得拼接给path,query等前面的部分。
urlunparse
相当于urlparse的反函数,输入一个包含url各组成部分为内容的list,可以把他们组成一个完整的urlstring
urlencode
把一个字典对象转换成一个get请求参数。get请求参数都是 “url?” + “参数1” & “参数2”……,我们可以用一个url 和一个包含参数的字典做拼接,最后得到一个完整的get请求
示例:
from urllib.parse import urlencode
params = {
'name' : 'vincent',
'age' : '19',
'occupation' : 'student'
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)
运行结果:
http://www.baidu.com?name=vincent&age=19&occupation=student