urllib是Python中用来处理URL的工具包,本文利用该工具包进行爬虫开发讲解,毕竟爬虫应用开发在Web互联网数据采集中十分重要。文章目录urllibrequest模块访问URLRequest类其他类parse模块解析URL转义URLrobots.txt文件
也可以通过GitHub下载最新代码:
git clone git://github.com/shazow/urllib3.git
python setup.py install
urllib3
参考文档:https://urllib3.readthedocs.io/en/latest/
request模块
urllib.request
模块定义了身份认证、重定向、COOKIEs等应用中打开url的函数和类。
再简单介绍下request
包,该包用于高级的非底层的HTTP客户端接口,容错能力比request
模块强大。request
使用的是urllib3,它继承了urllib2的特性,支持HTTP连接保持和连接池,支持使用COOKIE保持会话、文件上传、自动解压缩、Unicode响应、HTTP(S)代理等。更多具体可参考文档http://requests.readthedocs.io。
下面将介绍urllib.request
模块常用函数和类。
访问URL
一、urlopen()
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=false,cOntext=None)
该函数用于抓取URL数据,十分重要。带有如上所示的参数,除了URL参数外(字符串或Request
对象)其余参数都有默认值。
①URL参数
from urllib import requestwith request.urlopen("http://www.baidu.com") as f:
print(f.status)
print(f.getheaders())#运行结果如下200[('Bdpagetype', '1'), ('Bdqid', '0x8583c98f0000787e'), ('Cache-Control', 'private'), ('Content-Type', 'text/html;charset=utf-8'), ('Date', 'Fri, 19 Mar 2021 08:26:03 GMT'), ('Expires', 'Fri, 19 Mar 2021 08:25:27 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Server', 'BWS/1.1'), ('Set-COOKIE', 'BAIDUID=B050D0981EE3A706D726852655C9FA21:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-COOKIE', 'BIDUPSID=B050D0981EE3A706D726852655C9FA21; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-COOKIE', 'PSTM=1616142363; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-COOKIE', 'BAIDUID=B050D0981EE3A706FA20DF440C89F27F:FG=1; max-age=31536000; expires=Sat, 19-Mar-22 08:26:03 GMT; domain=.baidu.com; path=/; version=1; comment=bd'), ('Set-COOKIE', 'BDSVRTM=0; path=/'), ('Set-COOKIE', 'BD_HOME=1; path=/'), ('Set-COOKIE', 'H_PS_PSSID=33272_33710_33690_33594_33600_33624_33714_33265; path=/; domain=.baidu.com'), ('Traceid', '161614236308368819309620754845011048574'), ('Vary', 'Accept-Encoding'), ('Vary', 'Accept-Encoding'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close'), ('Transfer-Encoding', 'chunked')]
②data参数
如果向服务器发送数据,那么data参数必须是一个有数据的byes
对象,否则为None。在Python3.2之后可以是一个iterable对象。若是,则headers
中必须带有Content-Length参数。HTTP请求使用POST
方法时,data必须有数据;使用GET
方法时,data写None即可。
from urllib import parsefrom urllib import request
data = bytes(parse.urlencode({"pro":"value"}),encoding="utf8")respOnse= request.urlopen("http://httpbin.org/post",data=data)print(response.read())#运行结果如下b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "pro": "value"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n "Content-Length": "9", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.9", \n "X-Amzn-Trace-Id": "Root=1-60545f5e-7428b29435ce744004d98afa"\n }, \n "json": null, \n "origin": "112.48.80.243", \n "url": "http://httpbin.org/post"\n}\n'
对数据进行POST
请求,需要转码bytes
类型或者iterable
类型。这里通过bytes()
进行字节转换,考虑到第一个参数为字符串,所以需要利用parse模块(下面会讲)的urlencode()
方法对上传的数据进行字符串转换,同时指定编码格式为utf8。测试网址httpbin.org可以提供HTTP测试,从返回的内容可以看出提交以表单form作为属性、以字典作为属性值。
③timeout参数
该参数是可选的,以秒为单位指定一个超时时间,若超过该时间则任何操作都会被阻止,如果没有指定,那么默认会取sock.GLOBAL_DEFAULT_TIMEOUT
对应的值。该参数仅对http、https、ftp连接有效。
超时后会抛出urllib.error.URLError:异常,可以用try…except来处理异常。
from urllib import request
respOnse= request.urlopen("http://httpbin.org/get",timeout=1)print(response.read())#运行结果如下b'{\n "args": {}, \n "headers": {\n "Accept-Encoding": "identity", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.9", \n "X-Amzn-Trace-Id": "Root=1-605469dd-76a6d963171127c213d9a9ab"\n }, \n "origin": "112.48.80.243", \n "url": "http://httpbin.org/get"\n}\n'
④返回对象的常用方法和属性
除了前三个urlopen()
常用参数外,该函数返回用作context manager(上下文管理器)的类文件对象,并包含如下方法:
- geturl():返回请求的URL,通常重定向后的URL照样能获取到
- info():返回httplib.HTTPMessage对象,表示远程服务器返回的头信息
- getcode():返回响应后的HTTP状态码
- status属性:返回响应后的HTTP状态码
- msg属性:请求结果
from urllib import request
respOnse= request.urlopen("http://httpbin.org/get")print(response.geturl())print("===========")print(response.info())print("===========")print(response.getcode())print("===========")print(response.status)print("===========")print(response.msg)
运行结果:
前面介绍的urlopen()
方法可以满足一般基本URL请求,如果需要添加headers信息,就要考虑更为强大的Request
类了。Request
类是URL请求的抽象,包含了许多参数,并定义了一系列属性和方法。
一、定义
class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
- 参数url是有效网址的字符串,同
urlopen()
方法中一样,data参数也是。 - headers是一个字典,可以通过
add_header()
以键值进行调用。通常用于爬虫爬取数据时或者Web请求时更改User-Agent标头值参数来进行请求。 - origin_req_host是原始请求主机,比如请求的是针对HTML文档中的图像的,则该请求主机是包含图像页面所在的主机。
- Unverifiable指示请求是否是无法验证的。
- method指示使用的是HTTP请求方法。常用的有GET、POST、PUT、DELETE等,
代码示例:
from urllib import requestfrom urllib import parse
data = parse.urlencode({"name":"baidu"}).encode('utf-8')headers = {'User-Agent':'wzlodq'}req = request.Request(url="http://httpbin.org/post",data=data,headers=headers,method="POST")respOnse= request.urlopen(req)print(response.read())#运行结果如下b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "name": "baidu"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n "Content-Length": "10", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "wzlodq", \n "X-Amzn-Trace-Id": "Root=1-605491a4-1fcf3df01a8b3c3e22b5edce"\n }, \n "json": null, \n "origin": "112.48.80.34", \n "url": "http://httpbin.org/post"\n}\n'
注意data参数和前面一样需是字节流类型的,不同的是调用Request
类进行请求。
二、属性方法
①Request.full_url
full_url属性包含setter、getter和deleter。如果原始请求URL片段存在,那么得到的full_url将返回原始请求的URL片段,通过添加修饰器@property
将原始URL传递给构造函数。
(插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/
⑥Request.add_header(key,val):向请求中添加标头。
from urllib import requestfrom urllib import parse
data = bytes(parse.urlencode({'name':'baidu'}),encoding='utf-8')req = request.Request('http://httpbin.org/post',data,method='POST')req.add_header('User-agent','test')respOnse= request.urlopen(req)print(response.read().decode('utf-8'))
大量免费学习推荐,敬请访问python教程(视频)
以上就是详解Python之urllib爬虫、request模块和parse模块的详细内容,更多请关注其它相关文章!