处理网络请求urllib
urllib中包括了四个模块,包括
urllib.request ,urllib.error,urllib.parse,urllib.robotparser
- urllib.request:可以用来发送request和获取request的结果
- urllib.error:包含了urllib.request产生的异常
- urllib.parse:用来解析和处理URL
- urllib.robotparse:用来解析页面的robots.txt文件 使用urllib.request发送请求
Urillib.request.urlopen()的基本使用
利用urllib.request可以模拟浏览器的一个请求发起过程
response = urllib.request.urlopen(“https://www.baidu.com”)
response是一个 HTTPResposne 类型的对象,它主要包含的方法有 read() 、 readinto() 、getheader(name) 、getheaders() 、 fileno() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。
可以用 response 调用这些方法和属性,得到返回结果的一系列信息。
例如 response.read() 就可以得到返回的网页内容, response.status 就可以得到返回结果的状态码,如200代表请求成功等。
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False, context=None)
除了第一个参数可以传递URL之外,还可以传递其它的内容,比如 data (附加参数), timeout (超时时间)等等。
Data参数
data 参数是可选的,如果要添加 data ,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 。
# coding=utf-8
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({ ‘word’: ‘hello’}), encoding= ‘utf8’)
response = urllib.request.urlopen( ‘http://httpbin.org/post’, data=data)
print(response.read())
timeout参数
timeout 参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它支持 HTTP 、 HTTPS 、 FTP 请求。
response = urllib.request.urlopen( “http://httpbin.org/get”,timeout=1)
可以用它判断,超过多少秒,就跳过他(用try…except
…)
其他参数
context 它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。
cafile 和 capath 两个参数是指定CA证书和它的路径,这个在请求 HTTPS 链接时会有用。
cadefault 参数现在已经弃用了,默认为 False 。
urllib.request.Request的使用
利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。
request =urllib.request.Request(“https://www.baidu.com”)
response = urllib.request.urlopen(request)
print(response.read().decode( “utf-8”))
我们依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个URL,而是一个 Request ,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。
urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False, method=None)
第一个参数是请求链接,这个是必传参数,其他的都是可选参数。
data参数如果要传必须传bytes(字节流)类型,如果是字典,可以用 urllib.parse.urlencode() 编码,再转换成bytes(字节流)类型
headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,也可以通过调用 Request 对象的 add_header() 方法来添加请求头。
请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib ,你可以通过修改它来伪装浏览器,比如要伪装火狐浏览器,你可以把它设置为 Mozilla/5.0 (X11; U; Linux i686)Gecko/20071127 Firefox/2.0.0.11
origin_req_host 指的是请求方的 host 名称或者 IP 地址。
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”))
在这里我们通过四个参数构造了一个Request,url即请求链接,在headers中指定了User-Agent和Host,传递的参数data用了urlencode()和bytes()方法来转成字节流,另外指定了请求方式为 POST。
另外 headers 也可以用 add_header() 方法来添加。
req = request.Request(url=url, data=data, method=‘POST’)
req.add_header(‘User-Agent’, ‘Mozilla/4.0 (compatible; MSIE 5.5;Windows NT)’)
如此一来,我们就可以更加方便地构造一个 Request ,实现请求的发送。