urlib补充

import urllib.request # HTTP请求模块

'''

urllib4个模块:

request :他是最基本的HTTP请求模块,可以用来模拟发送请求。

error:异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止。

parse:一个工具,提供了许多URl处理方法,比如拆分、解析、合并等。

robotparser:主要是用来识别网站的robots.txt文件。然后判断哪些网站可以爬,哪些不可以爬,这个模块其实用得比较少。

'''

url = 'http://www.baidu.com'

response = urllib.request.urlopen(url) # 发送请求

'''

语法格式:urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, cafile=None, capath=None, cadefault=False, context=None)

urlopen有以下参数:

url:需要访问网址。

data:默认值为None,不写参数的话默认为get请求,反之为post,发送post请求,

    参数data以字典形式储存数据,并将参数data由字典类型转换成字节型才能完成post请求。

timeout:超时设置。

cafilecapathcadefault:使用参数指定一组HTTPS请求的可信CA证书。

context:描述各种SSL选项的实例。

'''

# read函数返回网页内容,read返回的是bytes类型的数据,需要用到decode()转换成str类型,转行的编码格式是根据网页的编码方式的,否则会乱码。

print(response.read().decode('utf-8'))

# 返回状态码,还有getcode()方法也算是可以返回状态码

print(response.status)

# 返回响应头信息

print(response.getheaders())

print('*****************************************************************')

# 设置请求头

import urllib.request

url = 'https://www.baidu.com'

# 定义请求头

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}

# 设置request的请求头

req = urllib.request.Request(url, headers=headers)

# 使用urlopen打开req

# # read函数返回网页内容,read返回的是bytes类型的数据,需要用到decode()转换成str类型,转行的编码格式是根据网页的编码方式的,否则会乱码。

html = urllib.request.urlopen(req).read().decode('utf-8')

print(html)

print('*****************************************************************')

# 设置代理IP

# 代理IP的原理:以本机先访问代理IP,再通过代理IP访问互联网,这样网站接受到的访问IP就是代理IP的地址。

import urllib.request

url = 'https://www.baidu.com'

# 设置代理IP

proxy_handler = urllib.request.ProxyHandler({

    'http': '218.56.132.157:8000',

    'https': '218.56.132.157:8000'

})

# 必须使用build_opener()函数来创建带有代理IP功能的opener对象

opener = urllib.request.build_opener(proxy_handler)

response = opener.open(url)

html = response.read().decode('utf-8')

print(html)

'''

这里要注意的是:

由于使用了代理IP,因此连接IP的时候有可能出现超时而导致报错,

遇到这种情况只要更换其他代理IP或者再次访问即可。

'''

print('*****************************************************************')

# 使用cookies

'''

cookies主要用于获取用户登录信息,比如:通过提交数据实现用户登录之后,会生成带有登录状态的cookies

这样可以将cookies保存在本地文件中,下次程序运行的时候,直接读取cookies来登录,

对于特别复杂的登录,如验证码、手机短信验证登录这类的网站,使用cookies能简单解决重复登录的问题。

-

urllib提供了HTTPCooieProcessor()cookies操作,但cookies的读写是有MozillaCookieJar()完成的。

'''

print('*****************************************************************')

# 证书验证

import urllib.request

import ssl

url = 'https://www.baidu.com'

# 关闭证书验证

ssl._create_default_https_context = ssl._create_unverified_context

response = urllib.request.urlopen(url)

print(response.getcode())

print('*****************************************************************')

# 数据处理和post请求

import urllib.request

import urllib.parse

# 数据处理

url = 'https://www.baidu.com'

'''

urllib在请求访问服务器的时候,如果发生数据传递,就需要对内容进行编码处理,strbytes对象

的两个元素元祖序列转行为百分比编码的ASCII文本字符串。

如果字符串要用作POST,那么它应该被编码为字节,否则会导致TypeError错误。

'''

# 发送post请求,需要使用urllib.parse对参数内容进行处理。

data = {

    'value': 'true',

}

# 数据处理

data = urllib.parse.urlencode(data).encode('utf-8')

# 使用urlencode方法转换成字节的数据类型,encode设置字节编码,注意:字节编码是根据网站的编码格式来定的。

# urlencode的作用只是对请求参数做数据格式转换处理。

req = urllib.request.urlopen(url, data=data)

print(req)

# urllib还有两个编码处理的方法,quote()unquote()

url = '%2523%25E7%25BC%2596%25E7%25A8%258B%2523'

# 第一次解码

first = urllib.parse.unquote(url)

print(first)  # 输出:%23%E7%BC%96%E7%A8%8B%23

# 第二次解码

second = urllib.parse.unquote(first)

print(second)  # 输出:#编程#

# 上面的例子是将url中的特殊字符进行还原处理。

url = '编程'

a = urllib.parse.quote(url)

print(a)  # 输出:%E7%BC%96%E7%A8%8B

s = urllib.parse.quote(a)

print(s)  # 输出:%25E7%25BC%2596%25E7%25A8%258B

# 上面的例子是将url中的中文字符进行还原处理。

print('*****************************************************************')

'''

urllib的常用语法:

- urllib.request.ualopen:访问url,请求url

- urllib.request.Request:模拟headers请求头

- urllib.request.HTTPCookieProcessor:设置cookies对象

- urllib.parse.urlencode(data).encode('utf-8'):请求数据格式转换

- urllib.parse.quote(url)url编码处理,主要对url上的中文等特殊符号编码处理。

- urllib.parse.unquote(url)url解码处理,将url上的特殊符号还原。

urllib是Python标准库的一部分,包含urllib.request,urllib.error,urllib.parse,urllib.robotparser四个子模块,这里主要介绍urllib.request的一些简单用法:
首先是urlopen函数,用于打开一个URL:
#获取并打印google首页的html
import urllib.request
response urllib.request.urlopen( ;http://www.google.com ;)
html response.read()
print(html)
urlopen返回一个类文件对象,可以像文件一样操作,同时支持一下三个方法:
info()返回一个对象表示远程服务器返回的头信息。 getcode()返回Http状态码如果是http请求返回请求的url地址。 有时候我们需要设置代理,这时我们可以这样做:
#设置全局代理
import urllib.request
handler urllib.request.ProxyHandler({ http://someproxy.com:8080 ;})
opener urllib.request.build_opener(handler)
urllib.request.install_opener(opener)#安装opener作为urlopen()使用的全局URL opener即以后调用urlopen()时都会使用安装的opener对象。
response urllib.request.urlopen( ;http://www.google.com ;)
print(response.read())

如果要细致的设置代理,可以用opener的open方法打开URL:
import urllib.request
handler urllib.request.ProxyHandler({ http://someproxy.com:8080 ;})
opener urllib.request.build_opener(handler)
response opener.open( ;http://www.google.com ;)
print(response.read())
打开url后,我们可以将内容写入一个本地文件来达到保存网页的目的,但是这里有一个更方便的方法,那就是调用urlretrieve():
#使用urllib.request.urlretrieve()将网页保存到本地
import urllib.request
url ;http://www.baidu.com/ ;
local_path ;P:\download.html ;
urllib.request.urlretrieve(url, local_path)

原文地址:https://www.cnblogs.com/Centwei/p/15381344.html