urllib模块
urllib模块的组成
• urllib主要分为四个模块:
– urllib.request:请求模块。
– urllib.error:异常处理模块。
– urllib.parse:url解析模块。
– urllib.robotparser:robots.txt解析模块
urllib.request
• urllib.request 模块提供了基本URL(主要是HTTP,还包括ftp等协议)请求的方法,利用它可以模拟浏览器向目标主机发送请求的过程。
• 模块中封装了
– basic and digest authentication(basic认证和digest认证);
– redirections(HTTP重定向);
– cookies(浏览器cookies)等处理方法
请求方法 - urlopen
• urlopen方法用于模拟浏览器向目标主机发送请求:
• 但是urlopen并不能做到完全模拟浏览器。
urlopen
• urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None, capath=None, cadefault=False, context=None):发送一个简单的请求。返回值为响应对象。
– url:访问的地址。
– data:请求参数(不为None时,发送post请求)。
– timeout:设置网站的访问超时时间。
response = urllib.request.urlopen(“httsp://www.huawei .com”,timeout = 5)
响应对象
• 响应对象(response)中包含了数据、状态码等相应信息:
– read():读取响应的对象的内容。
– info():返回HTTPMessage对象,表示远程服务器返回的头信息。
– getcode():返回Http状态码。
response.read():获取请求内容(数据、网页html代码等信息,不同网站的编码格式不同,在打印时可能会出现乱码)
response.getcode():请求状态信息,(200-成功,300-重定向,400-客户端错误,500-服务器错误)
请求方法 - Request
• 在使用浏览器访问目标主机时,浏览器会自动带有一些信息如
headers字段信息,这些信息是urlopen无法添加的,为了更好的
伪装成浏览器,需要使用到Request方法。
– host:目标主机(请求服务器地址)。
– cookies:身份信息。
– Refer:跳转链接。
– User-Agent:用户代理(浏览器信息,
不添加则为Python版本信息)。
Request
• urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None):构造一个请求类,用于向服务器发送。
– url:访问的地址。
– headers:http相应headers字段信息。
– origin_req_host :指的是请求方的host名称或者IP地址。
– method :用来指示请求使用的方法,比如 GET,POST 等。
urllib.error (1)
• 在使用爬虫程序获取数据时,经常会遇到一些错误:请求异常、网络中断等,这些错误产生时,urllib也提供了对应的处理措施,这些方法被封装在urllib.error模块中。
• urllib.error中的异常类有两个:
– URLError:继承自OSError,是error异常模块的基类,由request模块产生的异常都可以通过它来处理。
– HTTPError: URLError的子类,用于处理HTTP请求错误。
• Code:返回HTTP状态码。
• Reason:返回错误的原因。
urllib.error (2)
• 区别:
– URLError封装的错误信息一般是由网络引起的,包括url错误。
– HTTPError封装的错误信息一般是服务器返回了错误状态码。
• 关系:
– URLError是OSERROR的子类,HTTPError是URLError的子类。
error模块的使用
• 捕获异常
from urllib import request
from urllib import error
try:
response = request.Request('http://xxxx.xxx')
except error.HTTPError as e_http:
print(e_http.reason)
except error.URLError as e_url:
print(e_url)
except Exception as e:
print('others')
urllib.parse
• 在urllib中提供了一个用于url操作的字模块 - parse模块,其中封装
了url的解析、合并、编码和解码等操作。
• 在发送请求时URL中通常包含了一些信息:
协议
域名
查询字符串(get)
URL解析 (1)
• parse模块中提供了用于解析URL的方法 - urlparse:
– urllib.parse.urlparse(url,scheme ='',allow_fragments = True )
• url:待解析的url。
• scheme:假如解析的url没有协议,可以设置默认的协议。
• allow_fragments=True:是否忽略锚点。
url = "https://www.baidu.com/s?ie=UTF-8&wd=Python"
urllib.parse.urlparse(url=url)
URL解析 (2)
• 解析结果:
– scheme:协议。
– netloc:域名。
– path:路径。
– params:参数。
– query:查询字符串。
– fragment:锚点。
ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='ie=UTF-8&wd=Python', fragment='')
URL拼接
• parse模块下提供了join方法用于将一个不完整的链接拼接为一个完整的链接(在提供基础链接的前提下)。
– urllib.parse.urljoin(base,url,allow_fragments = True)
• base:基础链接。
• url:不完整链接。
base_url = 'https://www.baidu.com/s?ie=UTF-8&wd=Python'
sub_url = '/info'
full_url = parse.urljoin(base_url,sub_url)
print(full_url)
# https://www.baidu.com/info
URL字符编码
• urllib.parse.urlencode():将字典形式的数据,转化为URL编码后的字符串。
• urllib.parse.quote():对中文进行URL编码(unquote方法可以解码)。
parmas = {
'wd':'中文',
'ky':'python123'}
parmas_str = urllib.parse.urlencode(parmas)
print(parmas_str)
# wd=%E4%B8%AD%E6%96%87&ky=python123
urllib. parse.quote("汉语")
# '%E6%B1%89%E8%AF%AD'
urllib使用代理IP (1)
• urllib中使用代理IP有两种方式:
– 第一种:设置代理地址,创建Proxyhandler,创建Opener,安装Opener,使用请求方法访问。
– 第二种:设置代理地址,创建Proxyhandler,创建Opener,直接使用
opener发送请求。
urllib使用代理IP (2)
• 构建代理IP(可以使用多个代理IP创建代理IP池):
• 创建代理IP对象:
• 创建opener对象:
proxies = {'http': '115.216.40.204:9999',}
opener = urllib.request.build_opener(proxy)
proxy=urllib.request.ProxyHandler(peoxies)
urllib使用代理IP (3)
• 使用IP:
– 第一种方式:
– 第二种方式
urllib.request.install_opener(opener)
urllib.request.urlopen('www.huawei.com')
opener.open('www.huawei.com')
import urllib3
def loadPage(url,filename):
"""
根据url发送请求获取html数据
:param url:url
:param filename:文件名
:return:xxx
"""
# http = urllib3.PoolManager(retries=urllib3.Retry(total=5, backoff_factor=0.5),
# timeout=urllib3.Timeout(connect=5.0, read=10.0))
# 添加 User-Agent 头部
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
"range": "bytes=1621094-2193607"
}
# 代理管理
proxy = "http://proxysg.xxx.com:8080"
timeout = urllib3.Timeout(connect=2.0, read=4.0) # 超时设置
retries = urllib3.Retry(total=3, backoff_factor=0.5) # 重试机制
proxy = urllib3.ProxyManager(proxy,timeout=timeout,retries=retries)
# 请求网址
response = proxy.request("GET", url, headers=headers)
# 检查状态码
if response.status == 200:
html = response.data.decode("utf-8") # 解码为字符串
print(html)
else:
print(f"请求失败,状态码: {response.status}")
if __name__ == '__main__':
url = "sss"
loadPage(url,"123")
- 点赞
- 收藏
- 关注作者
评论(0)