第二节 urllib库的使用

一、urllib库的介绍

urllib库:最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求并可以保存服务器返回的参数。(用于操作URL,并对网页内容进行抓取)

urllib包含以下几个模块:

 1. urllib.request  :打开和读取URL
 2. urllib.error  : 包含URL抛出的异常
 3. urllib.parse  :解析URL
 4. urrlib.rebotparser :解析rebots.text文件

在这里插入图片描述

urllib.request模块

urllib库中,所有和网络请求相关的的方法,都被集中到urllib.request模块中。
urllib.request定义了一些打开URL的函数和类,包含授权验证、重定向、浏览器cookies等

1. urlopen函数:用于打开URL

urlopen 方法来打开一个 URL,语法格式如下:

request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

 url:url 地址。
 data:发送到服务器的其他数据对象,默认为 None。 
 timeout:设置访问超时时间。
 cafile 和capath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。      
 cadefault:已经被弃用。 context:ssl.SSLContext类型,用来指定 SSL 设置
from urllib import request#模块导入
url = "httP://www.baidu.com/"
resp = request.urlopen(url)
print(resp.read())#获取网页全部代码
## print(resp.read(300))#指定读取的长度
readline() : 读取一行代码
readlins() : 读取多行代码
getcode() : 读取状态码

2. urlretrieve函数:将网页上的一个文件保存到本地

#创建一个HTML,可用浏览器打开
from urllib import request

request.urlretrieve("http://www.baidu.com/","baidu.html")

另一种保存方法

#如果要将从网页抓取到的内容保存到本地
from urllib import request

resp = request.urlopen("http://www.baidu.com/")

f = open("text.html", "wb")#创建html文件
con = resp.read()#读取网页内容
f.write(con)#写入
f.close()#关闭

3.request.Request类

在请求时增加一些请求头(网站有反爬机制,获取假的页面)对 headers(网页头信息)进行模拟,这时候需要使用request.Request 类:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

url:url 地址。
data:发送到服务器的其他数据对象,默认为 None。
headers:HTTP 请求的头部信息,字典格式。
origin_req_host:请求的主机地址,IP 或域名。
unverifiable:很少用整个参数,用于设置网页是否需要验证,默认是False。。
method:请求方法, 如 GET、POST、DELETE、PUT等。
#以豆瓣为例,获取网页代码
from urllib import request

url = "https://movie.douban.com/"
#模拟头部发送请求
headers = {
"User-Agent": "输入所显示的即可"
}

req = request.Request(url,headers=headers)
resp = request.urlopen(req)
print(resp.read().decode("utf-8"))#decode.("utf-8")用于解码

4.ProxyHandler处理器:代理设置

免费代理地址
快代理:https://www.kuaidaili.com/
云代理:http://www.ip3366.net/

# 使用ProxyHandler代理IP设置
from urllib import request
#未使用代理
url = "https://httpbin.org/ip" # 一个检测IP地址的网页         
resp = request.urlopen(url)
print(resp.read())
from urllib import request
# 使用代理
url  = "http://httpbin.org/ip"  # 一个检测IP地址的网页
# 1.使用ProxyHandler 传入代理构建一个handler
proxy = {"HTTP": "200.124.72.241:999"}#设置IP
handler = request.ProxyHandler(proxy)
# 2.使用已创建的handler构建一个opener
opener = request.build_opener(handler)
# 3.使用opener发送一个请求
resp = opener.open(url)
print(resp.read())

urllib.parse模块

parse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接

1. urlencode函数(编码): 可以把字典数据转换成URL编码数据

2. parse_qs(解码): 将经过编码后的url参数解码

# 编码和解码
from urllib import parse
resp = {"name":"爬虫基础", "say":"人生苦短我学python"}
#编码
bm = parse.urlencode(resp)
print(bm)
#解码
jm =parse.parse_qs(bm)
print(jm)

3.urlparse

将url分为6个部分,返回一个包含6个字符串项目的元组:协议、位置、路径、参数、查询、片段.

from urllib import parse

url = " http://www.baidu.com/s?wd=python&username=abc#"
result = parse.urlparse(url)
#获取全部
print(result)
#获取指定的部分
print('path:',result.path)

运算结果:
ParseResult(scheme=‘’, netloc=‘’, path=’ http://www.baidu.com/s’, params=‘’, query=‘wd=python&username=abc’, fragment=‘’)
其中scheme 是协议 netloc 是域名服务器 path 相对路径 params是参数,query是查询的条件

4.urlsplit

将url分为5部分,返回一个包含5个字符串项目的元组:协议、位置、路径、查询、片段。

from urllib import parse

url = " http://www.baidu.com/s?wd=python&username=abc#"
result = parse.urlsplit(url)
#获取全部
print(result)
#获取指定的部分
print('path:',result.path)

运算结果:
SplitResult(scheme=‘’, netloc=‘’, path=’ http://www.baidu.com/s’, query=‘wd=python&username=abc’, fragment=‘’)
其中 scheme 是协议 netloc 是域名服务器 path 相对路径 query是查询的条件

5.urljoin

将相对的地址组合成一个url,对于输入没有限制,开头必须是http://,否则将不组合前面。

from urllib import parse
new_url = parse.urljoin("http://www.baidu.com/","88888")
print(new_url)
#运行结果:-
#http://www.baidu.com/88888

urllib.error模块

urllib.error模块是 urllib.request 所引发的异常定义了异常类,基础异常类是 URLError
urllib.error 包含了两个方法,URLError 和 HTTPError。

URLError 是 OSError 的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性 reason 为引发异常的原因。

HTTPError 是 URLError 的一个子类,用于处理特殊 HTTP 错误例如作为认证请求的时候,包含的属性 code 为 HTTP 的状态码, reason 为引发异常的原因,headers 为导致 HTTPError 的特定 HTTP 请求的 HTTP 响应头。

对不存在的网页抓取并处理异常:

from urllib import request
from urllib import error
url1 = request.urlopen("http://www.baidu.com/")
print(url1.getcode())# 200
try:
    url2 = request.urlopen("http://wwww.baidu.com/htm")
except error.HTTPError as e:
    if e.code == 404:
        print(404)#404

urllib.robotparser模块:用于解析 robots.txt 文件

robots.txt(统一小写)是一种存放于网站根目录下的 robots 协议,它通常用于告诉搜索引擎对网站的抓取规则

在这里插入图片描述

  • set_url(url) :设置 robots.txt 文件的 URL。

  • read() :读取 robots.txt URL 并将其输入解析器。

  • parse(lines) :解析行参数。

  • can_fetch(useragent, url) :如果允许 useragent 按照被解析 robots.txt 文件中的规则来获取 url 则返回 True。

  • mtime() :返回最近一次获取 robots.txt 文件的时间。 这适用于需要定期检查 robots.txt 文件更新情况的长时间运行的网页爬虫。

  • modified() : 将最近一次获取 robots.txt 文件的时间设置为当前时间。

  • crawl_delay(useragent) :为指定的 useragent 从 robots.txt 返回 Crawl-delay 形参。 如果此形参不存在或不适用于指定的 useragent 或者此形参的 robots.txt 条目存在语法错误,则返回 None。

  • request_rate(useragent) :以 named tuple RequestRate(requests, seconds) 的形式从 robots.txt 返回 Request-rate 形参的内容。 如果此形参不存在或不适用于指定的 useragent 或者此形参的 robots.txt 条目存在语法错误,则返回 None。

  • site_maps() : 以 list() 的形式从 robots.txt 返回 Sitemap 形参的内容。 如果此形参不存在或者此形参的 robots.txt 条目存在语法错误,则返回 None。

结语

遵守规则,就不会出错!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值