urllib模块

举报
developer_Li 发表于 2025/03/25 10:15:15 2025/03/25
【摘要】 urllib模块的组成• urllib主要分为四个模块:– urllib.request:请求模块。– urllib.error:异常处理模块。– urllib.parse:url解析模块。– urllib.robotparser:robots.txt解析模块urllib.request• urllib.request 模块提供了基本URL(主要是HTTP,还包括ftp等协议)请求的方法,利...

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")
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。