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上的特殊符号还原。
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)