python3 urllib模块的运用

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
python3 urllib模块的运用

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提交删除请求

后续的内容请见下篇文章

上一篇:python爬虫学习笔记.urllib的使用


下一篇:python爬虫获取以及使用cookie