ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python3 urllib模块的运用

2021-04-14 13:58:06  阅读:209  来源: 互联网

标签:请求 url request urllib urlopen opener 模块 python3


1.python3 urllib模块的运用

urllib模块

urllib 库 是 [Python]内置的 HTTP 请求库。urllib 模块提供的上层接口,使访问 www 和 ftp 上的数据就像访问本地文件一样。主要有以下四种:urllib.request 请求模块,urllib.error 异常处理模块,urllib.parse url 解析模块,urllib.robotparser robots.txt 解析模块

一.urllib.request模块

urllib.request 模块提供了最基本的构造 HTTP (或其他协议如 FTP)请求的方法,利用它可以模拟[浏览器]的一个请求发起过程。利用不同的协议去获取 URL 信息。它的某些接口能够处理基础认证 ( Basic Authenticaton) 、redirections (HTTP 重定向)、 Cookies (浏览器 Cookies)等情况。而这些接口是由 handlers 和 openers 对象提供的。

官方对于urllib.request的解释:帮助在复杂的世界中打开url(主要支持http,FTP,本地文件和数据的url)的函数和类–基本和摘要身份验证,重定向,cookie等。

urllib.request模块默认定义了以下几个函数:

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

参数说明:url:需要打开的网址 data: Post 提交的数据, 默认为 None ,当 data 不为 None 时, urlopen() 提交方式为 Post timeout:设置网站访问超时时间

这个函数主要用来打开一个url,url可以是一个字符串,也可以是一个请求对象

这个函数总是返回以下方法:

getURL()–返回检索的资源的URL,通常用于确定是否遵循重定向;

info()–返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息;可以通过Quick Reference to Http Headers查看 Http Header 列表。

getcode()–返回响应的HTTP状态代码;

read()–返回页面元素。

import urllib.request

page=urllib.request.urlopen("http://www.zhihu.com/")

print(page.info())

print(page.getURL())

print(page.getcode())

print(page.read())

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

使用request()来包装请求,再通过urlopen()获取页面。单纯使用 urlopen 并不能足以构建一个完整的请求,例如 对拉勾网的请求如果不加上 headers 等信息,就无法正常解析访问网页内容。

使用实例:

import urllib.request
url = "https://www.lagou.com/zhaopin/Python/?labelWords=label"
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
    'Referer': 'https://www.lagou.com/zhaopin/Python/?labelWords=label',
    'Connection': 'keep-alive'
}
req = request.Request(url, headers=headers)
page = request.urlopen(req).read()
page = page.decode('utf-8')
print(page)

headers的参数设置:

User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言。这个数据可以从 网页开发工具上的请求反应信息中获取(浏览器上一般按 F12 打开开发工具)。作用是用于伪装浏览器。

Referer:可以用来防止盗链,有一些网站图片显示来源 https://***.com ,就是检查 Referer 来鉴定的。

Connection:表示连接状态,记录 Session 的状态。

origin_req_host:请求方的 host 名称或者 IP 地址。

unverifiable:指请求无法验证,默认为 False。用户并没有足够的权限来选择接收这个请求结果,例如请求一个 HTML 文档中的图片,但没有自动抓取图像的权限,这时 unverifiable 为 True。

method:指定请求使用的方法,例如 GET、POST、PUT 等。

Openers 和 Handlers

当需要获取一个 URL 时需要使用一个 opener (这是一个不容易理解的对象—-urllib.request.OpenerDirector的实例)。一般情况下通过 urlopen 使用默认的 opener ,但允许自己创建不同的 opener 。Opener 会使用 handlers 。handler 承担”重活”并知道如何以某个特定的协议(如http,ftp等)打开 URL、知道如何处理 URL的某些行为(比如 Http 重定向或是 Cookie等)。

引入 Opener(即 OpenerDirector 类)的目的是为了能够实现更高级的功能,一般情况下使用的 Request 、 urlopen() 相当于类库封装好了的极其常用的请求方法,利用这两个就可以完成基本的请求。但当需要实现更高级的功能时就需要更高级的实例来完成操作。所以,这里就用到了比调用 urlopen() 的对象的更普遍的对象—-Opener 。

Opener 通过 Handler 构建,可以使用 open() 方法,返回的类型和 urlopen() 相同。

OpenerDirector操作类是一个管理很多处理类(Handler)的类。这些 Handler 类都对应处理相应的协议,或者特殊功能。

主要有以下处理类:

BaseHandler、HTTPErrorProcessor、HTTPDefaultErrorHandler、HTTPRedirectHandler、ProxyHandler、AbstractBasicAuthHandler、HTTPBasicAuthHandler、ProxyBasicAuthHandler、AbstractDigestAuthHandler、
ProxyDigestAuthHandler、AbstractHTTPHandler、HTTPHandler、HTTPCookieProcessor、UnknownHandler、
FileHandler、FTPHandler、CacheFTPHandler

其中,urllib.request.BaseHandler 是所有其他 Handler 的基类,其提供了最基本的Handler方法。例如:default_open()、protocol_request() 等。

常见的 BaseHandler 子类有:
* HTTPDefaultErrorHandler :用于处理HTTP响应错误,错误都会抛出 HTTPError 类型的异常。
* HTTPRedirectHandler :用于处理重定向。
* HTTPCookieProcessor: 用于处理 Cookie 。
* ProxyHandler :用于设置代理,默认代理为空
* HTTPPasswordMgr : 用于管理密码,它维护了用户名密码的表。
* HTTPBasicAuthHandler : 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。

3.urllib.request. install_opener ( opener )和urllib.request.build_opener([handler, …])

这两个函数主要用于设置代理,在做爬虫的时候多少都会用到代理IP的,防止被服务器ban掉,步骤多为:

(1)、准备代理IP或者请求头;

(2)、利用urllib.request.build_opener()封装代理IP或请求头;

(3)、利用urllib.request.instanll_opener()安装成全局;

(4)、用urlopen()访问网页.

4.urllib.request.getproxies()

这个帮助函数讲一个scheme的字典返回给代理服务器URL映射。

5.urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

这个是从python2中移植的函数,有可能会过时,这个函数在做爬虫时,尤其是爬网页时用的是很多的,作用是讲一个URL访问的网络对象复制到本地,第二个参数用于制定本地文件位置

def getImage(html):

    reg=r'src="(.+?\.jpg)"'# 正则表达式

    imgre=re.compile(reg)# 将正则表达式编译成一个正则表达式对象

    html = html.decode('utf-8')# python3中使用

    # imglist=reg.findall(imgre,html)

    imglist=re.findall(imgre,html)

    x=0

    for imgurl in imglist:

        urllib.request.urlretrieve(imgurl,'H:\picture\%s.jpg' %x)

        x += 1

6.urllib.request.urlcleanup()

这个函数用于清理之前调用urlretrieve()函数留下的临时文件。

7.使用代理伪造ip
在这里插入图片描述

import urllib.request
url = 'http://www.baidu.com'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'
}
proxy_support = urllib.request.ProxyHandler({
    'http':'172.12.24.45:8080',
})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
request=urllib.request.Request(url=url,headers=headers)
response=urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

2.Requests模块

虽然urllib模块提供了大部分功能,但确实太麻烦了,一个很简单的功能就需要一大堆代码,requests就会简单很多

import  requests
r= requests.get('https://www.baidu.com/s')
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)

上面那段代码就是最简单的用法

requests库的七个主要方法:

方法解释
requests.request()构造一个请求,支持以下各种方法
requests.get()获取html的主要方法
requests.head()获取html头部信息的主要方法
requests.post()向html网页提交post请求的方法
requests.put()向html网页提交put请求的方法
requests.patch()向html提交局部修改的请求
requests.delete()向html提交删除请求

后续的内容请见下篇文章

标签:请求,url,request,urllib,urlopen,opener,模块,python3
来源: https://blog.csdn.net/qq_51191947/article/details/115696582

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有