文章目录
一、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。
结语
遵守规则,就不会出错!