Python爬虫从入门到进阶(2)之urllib库的使用
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
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=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
(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=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库的使用的更多相关文章
- Python 爬虫从入门到进阶之路(八)
在之前的文章中我们介绍了一下 requests 模块,今天我们再来看一下 Python 爬虫中的正则表达的使用和 re 模块. 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网 ...
- Python 爬虫从入门到进阶之路(十六)
之前的文章我们介绍了几种可以爬取网站信息的模块,并根据这些模块爬取了<糗事百科>的糗百内容,本章我们来看一下用于专门爬取网站信息的框架 Scrapy. Scrapy是用纯Python实现一 ...
- Python 爬虫从入门到进阶之路(十七)
在之前的文章中我们介绍了 scrapy 框架并给予 scrapy 框架写了一个爬虫来爬取<糗事百科>的糗事,本章我们继续说一下 scrapy 框架并对之前的糗百爬虫做一下优化和丰富. 在上 ...
- Python 爬虫从入门到进阶之路(二)
上一篇文章我们对爬虫有了一个初步认识,本篇文章我们开始学习 Python 爬虫实例. 在 Python 中有很多库可以用来抓取网页,其中内置了 urllib 模块,该模块就能实现我们基本的网页爬取. ...
- Python 爬虫从入门到进阶之路(四)
之前的文章我们做了一个简单的例子爬取了百度首页的 html,我们用到的是 urlopen 来打开请求,它是一个特殊的opener(也就是模块帮我们构建好的).但是基本的 urlopen() 方法不支持 ...
- Python爬虫从入门到进阶(1)之Python概述及爬虫入门
一.Python 概述 1.计算机语言概述 (1).语言:交流的工具,沟通的媒介 (2).计算机语言:人跟计算机交流的工具 (3).Python是计算机语言的一种 2.Python编程语言 代码:人类 ...
- Python 爬虫从入门到进阶之路(六)
在之前的文章中我们介绍了一下 opener 应用中的 ProxyHandler 处理器(代理设置),本篇文章我们再来看一下 opener 中的 Cookie 的使用. Cookie 是指某些网站服务器 ...
- Python 爬虫从入门到进阶之路(九)
之前的文章我们介绍了一下 Python 中的正则表达式和与爬虫正则相关的 re 模块,本章我们就利用正则表达式和 re 模块来做一个案例,爬取<糗事百科>的糗事并存储到本地. 我们要爬取的 ...
- Python 爬虫从入门到进阶之路(十二)
之前的文章我们介绍了 re 模块和 lxml 模块来做爬虫,本章我们再来看一个 bs4 模块来做爬虫. 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也 ...
随机推荐
- Activiti开发案例之activiti-app工作流导出图片
前言 自从 Activiti 和 JBPM4 分家以后,Activiti 目前已经发展到了版本7,本着稳定性原则我们最终选择了6,之前还有一个版本5. 问题 在开发使用的过程中发现 Activiti ...
- button样式篇一(ant Design React)
这篇来介绍button中elementUi.iview.ant中样式结构 ant Design react ant-react中button分两个文件less: mixins.less:根据butto ...
- ABP之调试
虽然通常情况下不需要,但是Abp还是提供了能在调试项目中进入Abp源码的方法.. 所有的ABP NuGet包都启用了源码连接.这意味着我们可以在我们的项目中调试ABP源码,要启用它,更改Visual ...
- Graphic
画圆操作 package demo1; import java.awt.Graphics; import javax.swing.*; import javax.swing.JPanel; publi ...
- PHP加密解密函数(带有效期,过了有效期也解不了)
转的,原来应该是discuz中弄的 <?php //加解密函数 //此函数的厉害之处在于可以在指定时间内加密还原字符串,超时无法还原. //这样我们就可以拿此函数来做很多用途了,比如:单点登录的 ...
- MySQL主从复制(一)
whereis...命令的使用:
- Sass 笔记
Sass 笔记 1. 安装,依赖Ruby sass依赖Ruby, 所以Windows要先安装Ruby, Mac自带无需安装 $ gem install sass 2. 两种文件格式 sass scss ...
- Laravel数据库迁移
Laravel的数据迁移功能很好用,并且可以带来一系列好处.通过几条简单的 artisan 命令,就可以顺利上手,没有复杂的地方 注意:该系列命令对数据库非常危险,请准备一个单独的数据库作为配套练习, ...
- 【pytorch】pytorch-backward()的理解
pytorch-backword函数的理解 函数:\(tensor.backward(params)\) 这个params的维度一定要和tensor的一致,因为tensor如果是一个向量y = [y1 ...
- java 11 Java Flight Recorder
Flight Recorder源自飞机的黑盒子 Flight Recorder以前是商业版的特性,在java11当中开源出来,它可以导出事件到文件中,之后可以用Java Mission Control ...