1. urllib 库 -- 内置
1.1 urlopen函数
from urllib import request
resp = request.urlopen('https://www.baidu.com')
print(resp.read(10))
print(resp.readlines())
print(resp.getcode())
1.2 urlretrieve 函数
将网页上的一个文件保存到本地
from urllib import request
# 通过链接下载文件
request.urlretrieve(url, 保存的文件名)
例如:
from urllib import request
# 通过链接下载文件
request.urlretrieve('https://www.sogou.com/', 'sougou.html')
request.urlretrieve('https://pic.baike.soso.com/ugc/baikepic2/6108/20200529140813-1463090803_jpeg_239_300_8762.jpg/0', 'huge.jpg')
1.3 编码和解码函数
1.3.1 urlencode 函数 :编码
将字典数据转换成url编码数据
1.3.2 parse_qs函数 :解码
将经过编码后的url参数进行解码
from urllib import parse
data = {'name': '哈哈', 'age': 18}
# urlencode(dict) 参数是字典
ps = parse.urlencode(data)
print(ps)
print(parse.parse_qs(ps))
1.4 url解析
urlparse 函数 和 urlsplit 函数
都是对url各个组成部分进行解析分割,得到url的各个部分
不同的是: urlparse 里有params属性,而urlsplit里面没有这个params属性
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=S#comment'
result = parse.urlparse(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.params)
print('-'*20)
result1 = parse.urlsplit(url)
print(result1)
print(result1.scheme)
print(result1.netloc)
# print(result1.params)会报错,说明urlsplit没有params这个属性
1.5 request.Request
在请求时增加一些请求头 使用request.Request类来实现
from urllib import request
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'
}
res = request.Request('https://www.baidu.com', headers=header)
# print(res)
resp = request.urlopen(res)
print(resp.read())
2. ProxyHandler处理器(代理设置):解决封IP问题
很多网站会检测某段时间某个IP访问次数(通过流量统计、系统日志等),如果访问过多,网站会禁止这个IP访问。
因此这个时候我们往往需要换个“小号”来继续获取我们所用的数据。这个“小号”就是我么说的,代理。
代理原理:
在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后再转发给我们代码。
http://httpbin.org/ 这个网站能够http请求一些参数。
常用的代理有:
西刺免费代理IP:https://mtop.chinaz.com/site_www.xici.net.co.html
快代理:https://www.kuaidaili.com/
以代理云为例,使用代理:
从代理云种选择一个代理IP
from urllib import request
# 没有使用代理
url = 'http://httpbin.org/ip'
resp = request.urlopen(url)
print(resp.read())
#使用代理
url = 'http://httpbin.org/ip'
# 1.使用ProxyHandler创建一个代理handler
handler = request.ProxyHandler({'http': '140.143.6.16:1080'})
# 2.创建opener
opener = request.build_opener(handler)
# 3.使用opener发送一个请求
resp = opener.open(url)
print(resp.read())
上面为未使用代理的访问IP, 下面的为使用代理后的IP。