python爬虫学习笔记.urllib的使用

这里写目录标题

一,urllib四大模块
1,request:基本的HTTP请求模块,可以用来模拟发送请求。
2,error:异常处理模块。
3,parse:工具模块,提供URL处理方法。
4,robotparse:识别网站的robot.txt文件,判断该网站是否可以爬。

二,发送请求
Ⅰ:urlopen的使用

  1. 作用
    抓取网页源代码。
  2. 使用方法
import urllib.request

response = urllib.request.urlopen('https://www.baidu.com/')

print(response.read().decode('utf-8'))

程序将输出百度首页的源代码。

  1. 返回
    返回一个HTTPResponse类型的对象。

  2. 方法和属性
    该类型包含的方法:
    read():用于输出源代码
    getheader(name):输出特定响应的头信息
    getheaders():输出全部相应的头信息

    该类型包含的属性:
    status:可得到返回结果的状态码

  3. 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爬虫学习笔记,python,爬虫)