1.什么是Urllib(官网地址:https://docs.python.org/3/library/urllib.html#module-urllib)

Urllib是python内置的HTTP请求库

包括以下模块:

  urllib.request 请求模块

  urllib.error 异常处理模块

  urllib.parse url解析模块

  urllib.robotparser robots.txt解析模块

2.urllib.request

  (1)urllib.request.urlopen(urldata=None, [timeout, ]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

1 参数简介:
url:是字符串类型或者 Request 对象
data:必须是指定要发送到服务器的额外数据的对象,如果不需要这样的数据,则为None。
timeout:可选,为阻塞操作指定以秒为单位的超时时间。不指定,将使用全局默认超时设置,实际上只适用于HTTP、HTTPS和FTP连接。
context:如果指定了 context,它必须是 ssl.SSLContext 的实例
cafile,capath:可选参数为HTTPS请求指定一组受信任的CA证书
2.返回值:对于HTTP和HTTPS url,该函数返回 http.client.HTTPResponse对象
 # 1.urlopen中 url 参数的使用以及 Response 的使用
def get():
request_url = 'http://www.python.org/'
# 创建请求对象
request = Request(request_url)
response = urlopen(request, context=ssl._create_unverified_context()) # 响应体:Response相关的使用
print(type(response)) # <class 'http.client.HTTPResponse'>
print(response.status) #
print(response.getheaders())
print(response.getheader('Server')) # nginx # response.read()读取网页的全部内容
data = response.read()
# response.readline() 读取网页的一行内容
data_line = response.readline()
print(data)
print(data_line) # 2.带参数的 get 方法
def get_params():
request_url = 'http://httpbin.org/get?name={}'
# 拼接参数
# keyword = 'nalanrongruo'
keyword = '纳兰容若'
final_url = request_url.format(quote(keyword))
# quote(keyword) 将包含汉字的网址进行转译,要不然会报错: UnicodeEncodeError: 'ascii' codec can't encode characters in position
# 10-11: ordinal not in range(128) python是解释性语言;解析器只支持ascii(0-127)
print(final_url)
request = Request(final_url)
response = urlopen(request) data = response.read().decode('utf-8') print(data) # 3.get的字典参数
def get_dict_params():
base_url = 'http://httpbin.org/get?'
params = {
'wd': '纳兰容若',
'name': '纳兰容若',
'age': ''
}
# 将字典或者元祖转换成URL可识别
str_params = urlencode(params)
print(str_params)
request_url = base_url + str_params # 如果你的url已经是计算机可以识别的状态,那么不转换
end_url = quote(request_url, safe=string.printable)
print(end_url) # 返回的响应对象
response = urlopen(end_url) print(response.read().decode('utf-8'))

  (2)urllib.request.build_opener([handler...])

 参数:BaseHandler的实例或者子类:ProxyHandler(如果检测到代理设置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、
FTPHandler、FileHandler、HTTPErrorProcessor。  

  (3)class urllib.request.Request(urldata=Noneheaders={}origin_req_host=Noneunverifiable=Falsemethod=None)

  Request :这个类是URL请求的抽象。

  url:是包含可用 URL 的字符串类型

  data:必须是指定要发送到服务器的额外数据的对象,如果不需要这样的数据,则为None。对于 HTTP POST 请求data 必须是标准application/x-www-form-urlencoded格式化

  headers:是一个字典,并将被视为使用每个键和值作为参数调用add_header()。这通常用于“欺骗”用户代理头值,浏览器使用该头值来标识自身——一些HTTP服务器只允许来自普通浏览器的请求,而不允许来自脚本。如果参数不为空,则应包含Content-Type头。如果没提供 header,且 data 不是 None,则应该添加默认的Content-Type: application/x-www-form-urlencoded

  method:是一个字符串,该字符串指示将使用的HTTP请求方法。如果提供,它的值存储在方法属性中,并由get_method()使用。如果data为空,默认为“GET”,否则为“POST”。
子类可以通过在类本身中设置方法属性来指示不同的默认方法。

 # post请求
def post():
request_url = 'http://httpbin.org/post'
data = {
'wd': '纳兰容若',
'name': '纳兰容若',
'age': ''
}
# 返回的响应对象
response = urlopen(request_url, data=data)
print(response.read().decode('utf-8')) # 4.添加请求头,模拟真实浏览器器发送请求
def request_header():
request_url = 'http://httpbin.org/get'
# 创建请求对象
# 1) 添加 header
# headers = {
# 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
# 'Chrome/70.0.3538.102 Safari/537.36'
# }
# request = Request(request_url, headers=headers) # 2).动态的添加header的信息
request = Request(request_url)
request.add_header('User-Agent',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/70.0.3538.102 Safari/537.36') response = urlopen(request)
print(response.read().decode('utf-8')) # 5.随机添加User-Agent,避免被屏蔽
def random_request_header():
# 百度一下:https://blog.csdn.net/rookie_is_me/article/details/81634048
user_agent_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET '
'CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)'] # 每次请求的浏览器都是不一样
random_user_agent = random.choice(user_agent_list)
print(random_user_agent)
request_url = 'http://www.python.org/'
request = Request(request_url)
# 增加对应请求头的信息
request.add_header("User-Agent", random_user_agent)
response = urlopen(request, context=ssl._create_unverified_context()) print(response) # 打印请求头信息
print(request.get_header("User-agent"))

  (4)各种高级用法handler

 # 6.高级用法各种handler
def http_handler_opener():
# 系统的方法_have_ssl CA证书安全 套阶层
# 系统的urlopen这个方法没有实现加ip的方法
url = "http://www.baidu.com/" # 创建自己的处理器
handler = HTTPHandler()
# 创建自己的opener
opener = build_opener(handler)
# 用自己创建的opener来发送请求
response = opener.open(url) data = response.read().decode("utf-8")
print(data) def proxy_handler():
url = "http://www.baidu.com/" # 添加代理
# 免费ip
proxy = {
"http": "http://112.87.71.146:9999"
} # 代理ip处理器
ip_handler = ProxyHandler(proxy)
# 创建自己的opener
opener = build_opener(ip_handler)
# 拿着代理ip发送网络请求
response = opener.open(url, timeout=10)
data = response.read().decode("utf-8")
print(data) def random_proxy_handler():
proxy_list = [
{"http": "http://119.101.116.204:9999"},
{"http": "hhttp://119.101.119.33:9999"},
{"http": "http://117.85.49.123:9999"},
{"http": "http://112.85.167.223:9999"},
{"http": "http://119.101.112.145:9999"}
]
for proxy in proxy_list:
# print(proxy)
# 利用对应遍历出来的ip地址创建处理器
ip_handler = ProxyHandler(proxy)
# 利用处理器创建opener
opener = build_opener(ip_handler)
try:
response = opener.open("http://www.baidu.com", timeout=10)
data = response.read()
print(data)
except Exception as e:
print(e) def auth_user():
# 1.定义账号和密码
user = "admin"
pwd = ""
nei_url = "http://www.baidu.com" # 创建密码管理器
pwd_manager = HTTPPasswordMgrWithDefaultRealm() pwd_manager.add_password(None, nei_url, user, pwd) # 创建认证处理器
auth_handler = HTTPBasicAuthHandler() opener = build_opener(auth_handler) response = opener.open(nei_url, timeout=10)
print(response.read())

3.urllib.error

是urllib.request引发的异常定义异常类。基本异常类是URLError

urllib.error.URLError

urllib.error.HTTPError

 def error():
url = "https://blog.csdn.net/weidan0302/article/details/110" try:
urlopen(url, context=ssl._create_unverified_context())
except urllib.error.HTTPError as error:
print(error.code) except urllib.request.URLError as error:
print(error)

点击下载代码

Python爬虫从入门到进阶(2)之urllib库的使用的更多相关文章

  1. Python 爬虫从入门到进阶之路(八)

    在之前的文章中我们介绍了一下 requests 模块,今天我们再来看一下 Python 爬虫中的正则表达的使用和 re 模块. 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网 ...

  2. Python 爬虫从入门到进阶之路(十六)

    之前的文章我们介绍了几种可以爬取网站信息的模块,并根据这些模块爬取了<糗事百科>的糗百内容,本章我们来看一下用于专门爬取网站信息的框架 Scrapy. Scrapy是用纯Python实现一 ...

  3. Python 爬虫从入门到进阶之路(十七)

    在之前的文章中我们介绍了 scrapy 框架并给予 scrapy 框架写了一个爬虫来爬取<糗事百科>的糗事,本章我们继续说一下 scrapy 框架并对之前的糗百爬虫做一下优化和丰富. 在上 ...

  4. Python 爬虫从入门到进阶之路(二)

    上一篇文章我们对爬虫有了一个初步认识,本篇文章我们开始学习 Python 爬虫实例. 在 Python 中有很多库可以用来抓取网页,其中内置了 urllib 模块,该模块就能实现我们基本的网页爬取. ...

  5. Python 爬虫从入门到进阶之路(四)

    之前的文章我们做了一个简单的例子爬取了百度首页的 html,我们用到的是 urlopen 来打开请求,它是一个特殊的opener(也就是模块帮我们构建好的).但是基本的 urlopen() 方法不支持 ...

  6. Python爬虫从入门到进阶(1)之Python概述及爬虫入门

    一.Python 概述 1.计算机语言概述 (1).语言:交流的工具,沟通的媒介 (2).计算机语言:人跟计算机交流的工具 (3).Python是计算机语言的一种 2.Python编程语言 代码:人类 ...

  7. Python 爬虫从入门到进阶之路(六)

    在之前的文章中我们介绍了一下 opener 应用中的 ProxyHandler 处理器(代理设置),本篇文章我们再来看一下 opener 中的 Cookie 的使用. Cookie 是指某些网站服务器 ...

  8. Python 爬虫从入门到进阶之路(九)

    之前的文章我们介绍了一下 Python 中的正则表达式和与爬虫正则相关的 re 模块,本章我们就利用正则表达式和 re 模块来做一个案例,爬取<糗事百科>的糗事并存储到本地. 我们要爬取的 ...

  9. Python 爬虫从入门到进阶之路(十二)

    之前的文章我们介绍了 re 模块和 lxml 模块来做爬虫,本章我们再来看一个 bs4 模块来做爬虫. 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也 ...

随机推荐

  1. SpringBoot通过RedisTemplate执行Lua脚本

    如果你对Redis和Lua的关系不太清楚,请先阅读:Redis进阶之使用Lua脚本开发 1.RedisScript 首先你得引入spring-boot-starter-data-redis依赖,其次把 ...

  2. 10 Django RESTful api 实现匿名访问

    # views_send_code.py from rest_framework.permissions import AllowAny class MsgCodeViewSet(CreateMode ...

  3. visual studio 配置属性中增加自定义宏和宏值

    visual studio中有一些预先定义的宏,用于配置项目属性,如SolutionDir.我们也可以自定义类似的宏,从而在配置包含目录(include)或添加依赖项时简化配置项. 如何创建自己的宏呢 ...

  4. Jmeter单个长连接发送多个Sample

    Mark自:https://blog.csdn.net/lykangjia/article/details/16337505 1. 线程组,在我们测试方案里面,每个线程模拟一个用户,执行用户的登录.等 ...

  5. Tomcat配置实例

    转自:https://www.cnblogs.com/kismetv/p/7228274.html 目录 一.一个server.xml配置实例 二.server.xml文档的元素分类和整体结构 1.整 ...

  6. 写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架

    #!/usr/bin/env python # -*- coding: utf- -*- import socket import select class MyRequest: "&quo ...

  7. python-装饰器初解

    # 装饰器的作用# 不想修改函数的调用方式( func() 还是这样调用),但是还想再原来函数前后添加功能# timer() 就是一个装饰器函数,只对一个函数,有一些装饰作用 import time ...

  8. 【BZOJ4007】[JLOI2015]战争调度(动态规划)

    [BZOJ4007][JLOI2015]战争调度(动态规划) 题面 BZOJ 洛谷 题解 神仙题,我是做不来. 一个想法是设\(f[i][j]\)表示当前考虑到\(i\)节点,其子树内有\(j\)个人 ...

  9. Equipment UVA - 1508(子集补集)

    The Korea Defense and Science Institute, shortly KDSI, has been putting constant effort into newequi ...

  10. PHP7 中 ?? 与? :的区别

    ??是PHP7版本的新特性,它与?:的区别在哪里呢 ?? $b = $a?? $c ;相当于$b= isset($a)?$a:$c; ?: $b = $a?$a: $c 则是 $b = !empty( ...