urlib补充

import urllib.request # HTTP请求模块

'''

urllib有4个模块:

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:超时设置。

cafile、capath、cadefault:使用参数指定一组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在请求访问服务器的时候,如果发生数据传递,就需要对内容进行编码处理,将str和bytes对象

的两个元素元祖序列转行为百分比编码的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上的特殊符号还原。

上一篇:记一次docker compose的低级错误


下一篇:计算机编码