python爬虫学习笔记.urllib的使用
作者:互联网
这里写目录标题
一,urllib四大模块
1,request:基本的HTTP请求模块,可以用来模拟发送请求。
2,error:异常处理模块。
3,parse:工具模块,提供URL处理方法。
4,robotparse:识别网站的robot.txt文件,判断该网站是否可以爬。
二,发送请求
Ⅰ:urlopen的使用
- 作用
抓取网页源代码。 - 使用方法
import urllib.request
response = urllib.request.urlopen('https://www.baidu.com/')
print(response.read().decode('utf-8'))
程序将输出百度首页的源代码。
-
返回
返回一个HTTPResponse类型的对象。 -
方法和属性
该类型包含的方法:
read():用于输出源代码
getheader(name):输出特定响应的头信息
getheaders():输出全部相应的头信息
该类型包含的属性:
status:可得到返回结果的状态码 -
decode和encode:
decode encode
str ---------> str(Unicode) ---------> str
//unicode 为一种编码格式
6,参数
data:
用于模拟表单提交,以POST方式传输数据。
timeout:
设置超时时间,单位为秒。
如果超过设定的时间,将抛出异常。
Ⅱ:Request的使用
urlopen无法构建一个完整的请求,借助Request能使请求更完整。
1,构造
class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
2,参数解析
url:
用于请求URL,必传参数。
data:
headers:
是一个字典,请求头。可以在构造请求时直接对headers赋值,也可用add_headers()方法来添加。
常常通过修改User-Agent来伪装浏览器。
origin_req_host:
unverifiable:
method:
字符串,用来指示请求的方法,如GET、POST和PUT。
3,实例
import urllib.request
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'}
request = urllib.request.Request('https://www.baidu.com/',headers=header,method='GET')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
Ⅲ:Handler
处理器,可用于处理登陆验证,Cookies,代理设置等。
1,Handler类
BaseHandler:是其他Handler的父类。
HTTPDefaultErrorHandler:
HTTPRedirectHandler:
HTTPCookieProcessor:用于处理Cookies。
ProxyHandler:用于设置代理,默认代理为空。
HTTPPasswordMgr:用于管理密码。
HTTPBasicAuthHandler:用于管理认证,若一个链接打开时需要认证,可用其解决认证问题。
2,Opener类
例子:urlopen就是urllib为我们提供的一个Opener。
之前的Request及urlopen()相当于提供了及其常用的请求方法,只可完成基本的请求,为了实现更高级的功能,需进行深入配置,从而引进Opener。
基本方法:
①build_opener():
利用Handler作为参数来构建一个Opener类的实例。
urllib.request.build_opener(handler1,handler2,…)
参数:任意处理器对象和处理器类。
②open():
Opener类的一个方法,返回的类型与urlopen()相同。
3,例一:验证
问题:需输入用户名和密码通过验证
Handler类:HTTPBasicAuthHandler
方法:
add_password():
属于HTTPBasicAuthHandler类
代码:
import urllib.request
username = 'username'
password = 'password'
url = 'http://localhost:5000/'
#借助HTTPPasswordMgrWithDefaultRealm对象来实例化HTTPBasicAuthHandler对象
p = urllib.request.HTTPPasswordMgrWithDefaultRealm()
#使用add_password()方法
p.add_password(None,url,username,password)
auth_handler = urllib.request.HTTPBasicAuthHandler(p)
#使用build_opener来创建Opener对象
opener = urllib.request.build_opener(auth_handler)
#打开url
response = opener.open(url)
print(response.read().decode('utf-8'))
4,例二:代理
问题:添加代理
ProxyHandler:
参数:字典,键名为协议类型(HTTP或HTTPS),键值是代理链接,可添加多个代理
import urllib.request
import urllib.error
url = 'https://www.baidu.com/'
proxy = {
'http':'http://127.0.0.1:9743',
'https':'http://127.0.0.1:9743',
}
handler = urllib.request.ProxyHandler(proxy)
#使用build_opener来创建Opener对象
opener = urllib.request.build_opener(handler)
#打开url
try:
response = opener.open(url)
print(response.read().decode('utf-8'))
except urllib.error.URLError as e:
print(e.reason)
5,例三:Cookie
Cookies:网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据。
*HTTPCookieProcesspr():
参数:CookieJar类
一种处理器
*http.cookiejar.CookieJar:
一个类,用于管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。
代码:
import http.cookiejar,urllib.request
url = 'https://www.baidu.com/'
cookie = http.cookiejar.CookieJar()#创建一个CookieJar类的实例
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)
for item in cookie:
print(item.name+'='+item.value)
*FileCookieJar (filename,delayload=None,policy=None):
从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
*MozillaCookieJar (filename,delayload=None,policy=None):
从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
*LWPCookieJar (filename,delayload=None,policy=None):
从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
*使用MozillaCookieJar类:
import http.cookiejar,urllib.request
url = 'https://www.baidu.com/'
filename = 'cookie2.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)
cookie.save(ignore_discard=True,ignore_expires=True)#将Cookies保存为与Mozilla型浏览器的Cookies格式
*使用LWPCookieJar类:
import http.cookiejar,urllib.request
url = 'https://www.baidu.com/'
filename = 'cookie2.txt'
cookie = http.cookiejar.LWPCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)
cookie.save(ignore_discard=True,ignore_expires=True)
*读取并利用生成的Cookie文件:
load()方法:
读取本地Cookie文件,获取Cookie内容。
import http.cookiejar,urllib.request
url = 'https://www.baidu.com/'
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie2.txt',ignore_expires=True,ignore_discard=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)
print(response.read().decode('utf-8'))
三,处理异常
urllib的error模块定义了request模块产生的异常。若出现问题,request就会抛出error模块中定义的异常。
1,URLError类
属性:
reason:会抛出错误的原因
import urllib.request
import urllib.error
try:
url = 'https://www.baidus.com/'
response = urllib.request.urlopen(url)
print(response.read().decode('utf-8'))
except urllib.error.URLError as e:
print(e.reason)
2,HTTPError类
URLError的子类,用于处理HTTP请求的错误
属性:
code:返回状态码
reason:返回原因,同其父类
headers:返回请求头
import urllib.request
import urllib.error
try:
url = 'https://www.baidus.com/'
response = urllib.request.urlopen(url)
print(response.read().decode('utf-8'))
except urllib.error.HTTPError as e:
print(e.code,e.reason,e.headers)
四,解析链接
parse模块,定义处理URL的标准接口,实现URL各部分的抽取、合并以及链接转换。
1,urlparse()方法
实现URL的识别和分段.
返回得到urllib.parse.urlparse,是一个元组,可用属性名获取或者索引顺序获取。
基本解析方式:
import urllib.parse
result = urllib.parse.urlparse('http://dict.youdao.com/w/eng/2/#keyfrom=dict2.index')
print(type(result))
print(result)
print(result.scheme)
print(result[0])
print(result.netloc)
print(result[1])
标准的链接格式:
scheme://netloc/path;params?query#fragment
shceme:协议
netloc:域名
path:访问路径
params:参数
query:查询条件
fragment:锚点
2,urlunparse()方法
与urlparse()方法对立,传入的参数可以是列表、元组等,其参数长度必须是6。
import urllib.parse
data = [ 'http','www.baidu.com','index.html', 'user','a=5','comment']
url = urllib.parse.urlunparse(data)
print(url)
3,urlsplit()
与urlparse()方法相似,不再单独解析params这部分,只返回5个结果,params将合并到path中。
返回SplitResult,元组类型,可用属性或索引来获取值。
4,urlunsplit()
参数长度必须为5。
5,urljoin()方法
生产链接的三个方法:urlunparse(),urlunsplit(),urljoin()。
参数:
第一个参数:base_url
第二个参数:新的链接
过程:
分析base_url的scheme,netloc和path
若新链接中该三项不存在,则予以补充
若新链接中该三项存在,则使用新链接的
6,urlencode()
用于构造GET请求的参数,是为序列化
代码:
import urllib.parse
#声明一个字典将参数表示出来
params = {
'name':'lucy',
'age':'22'
}
base_url = 'https://www.baidu.com/'
extre_url = urllib.parse.urlencode(params)#urlencode()将param序列化为GET请求参数。
url = base_url + extre_url
print(url)
7,parse_qs()
将一串GET请求参数转回字典,是为反序列化
import urllib.parse
query = 'name=lucy&age=22'
print(urllib.parse.parse_qs(query))
8,parse_qsl()
将一串GET请求参数转为元组
9,quote()
将内容转化为URL编码的格式。
*URL带有中文参数时,可能会导致乱码的问题,故需使用quote()
import urllib.parse
keyword = '爬虫'
url = 'https://www.baidu.com/s?wd=' + urllib.parse.quote(keyword)
print(url)
10,unqoute()
可以对URL编码解码。
import urllib.parse
print(urllib.parse.unquote('https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB'))
标签:python,request,爬虫,urllib,url,opener,print,import 来源: https://blog.csdn.net/qq_51102350/article/details/115876492