如何全面掌握Python爬虫模块urllib库的详细用法和技巧?

2026-04-10 11:361阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2206个文字,预计阅读时间需要9分钟。

如何全面掌握Python爬虫模块urllib库的详细用法和技巧?

目录

1.urllib模块简介

2.发送请求:urlopen()方法

3.发送GET请求

4.发送POST请求

5.设置网络超时

6.复杂网络请求:urllib.request.Request()

7.设置请求头

如何全面掌握Python爬虫模块urllib库的详细用法和技巧?

7.1 GET请求示例 7.2 POST请求示例

8.获取Cookies

目录
  • 1.urllib模块简介
  • 2.发送请求:urlopen()方法
  • 3. 发送GET请求
  • 4.发送post请求
  • 5. 设置网络超时
  • 6. 复杂网络请求_urllib.request.Request()
  • 7.设置请求头
    • 7.1get请求示例
    • 7.2post请求示例
  • 8. Cookies的获取与设置
    • 9.设置代理IP
      • 10.异常处理
        • 10.1 URLError
        • 10.2HTTPError
        • 10.3URLError&HTTPError双重异常捕捉
      • 11.解析URL
        • 11.1 拆分URL
        • 11.2 组合URL
        • 11.3 连接URL
        • 11.4 URL的编码与解码
        • 11.5URL参数的转换

      1.urllib模块简介

      python2有urllib和urllib2两种模块,都用来实现网络请求的发送。python3将urllib和urllib2模块整合并命名为urllib模块。urllib模块有多个子模块,各有不同的功能:

      • ①urllib.request模块:用于实现基本的www.python.org/' response = urllib.request.urlopen(url=url) # 发送网络请求 print('响应数据类型为:', type(response)) print('响应状态码为:', response.status) print('响应状态码为:', response.getcode()) print('响应头所有信息为:', response.getheaders()) print('响应头指定信息为:', response.getheader('Accept-Ranges')) # 读取HTML代码并进行utf-8解码 print('Python官网HTML代码如下:\n', response.read().decode('utf-8'))

        输出结果如下(部分):

        • response是一个<class ‘www.google.com.hk/ HTTP/1.1
        • 报文主体
        • (POST/GET)参数

      当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头Body

      Body就是返回给你的主体,比如说请求网站返回的html 响应头讯息里包含了服务器的响应讯息,如fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' # 构建请求对象 req = urllib.request.Request(url, data=data, headers=headers) # 发请求,获取响应对象 res = urllib.request.urlopen(req) # print(res.getcode()) # 得到响应码,200表示请求成功 html = res.read().decode('utf-8') # print(type(html)) # <class 'str'>,得到的是json数据 # json数据转字典 dic = json.loads(html) result = dic["translateResult"] # [[{'src': '你好', 'tgt': 'hello'}]] print(result[0][0]['tgt'])

      另一个简单的示例:

      import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.python.org/' response = urllib.request.urlopen(url=url, timeout=0.1) # 设置超时时间为0.1秒 print(response.read().decode('utf-8'))

      因为0.1秒设置的过快,结果因超时而产生异常,报错。

      通常根据网络环境不同,设置一个合理的时间,如2秒,3秒。

      对该网络超时异常进行捕捉并处理:

      import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 import socket # 导入socket模块 url = 'www.python.org/' # 请求地址 try: # 发送网络请求,设置超时时间为0.1秒 response = urllib.request.urlopen(url=url, timeout=0.1) print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码 except urllib.error.URLError as error: # 处理异常 if isinstance(error.reason, socket.timeout): # 判断异常是否为超时异常 print('当前任务已超时,即将执行下一任务!')

      6. 复杂网络请求_urllib.request.Request()

      urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

      参数说明:

      • url:访问网站的完整url地址
      • data:默认为None,表示请求方式为get请求;如果需要实现post请求,需要字典形式的数据作为参数。
      • headers:设置请求头部信息,字典类型。
      • origin_req_host:用于设置请求方的host名称或者IP。
      • unverifiable:用于设置网页是否需要验证,默认值为False。
      • method:用于设置请求方式,如GET,POST。

      7.设置请求头

      7.1get请求示例

      url = 'www.baidu.com' # 定义请求头信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'} # 创建Request对象 r = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(r) # 发送网络请求 print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码

      7.2post请求示例

      import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.csdn.net/" opener = urllib.request.build_opener() # 获取opener对象 resp = opener.open(url) print(resp.read().decode())

      因为urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高级功能,所以这里不用urlopen()发送请求,而需要创建一个opener对象(这本来是urllib2中的方法)。示例如下。学习过程中这里作为了解即可,建议重点研究/使用requests库。

      import urllib.request # 导入urllib.request模块 import www.python.org/1111111111.html') except urllib.error.URLError as error: # 捕获异常信息 print(error.reason) # 打印异常原因

      程序运行结果:

      10.2HTTPError

      HTTPError类是URLError的子类,主要用于处理HTTP请求所出现的一次。此类有以下三个属性。

      • code :返回HTTP状态码
      • reason 返回错误原因
      • headers 返回请求头

      import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: # 向不存在的网络地址发送请求 response = urllib.request.urlopen('www.python.org/1111111111.html') print(response.status) except urllib.error.HTTPError as error: # 捕获异常信息 print('状态码为:',error.code) # 打印状态码 print('异常信息为:',error.reason) # 打印异常原因 print('请求头信息如下:\n',error.headers) # 打印请求头

      结果如下(部分):

      10.3URLError&HTTPError双重异常捕捉

      因为URLError是HTTPError的父类,所以在捕获异常的时候可以先找子类是否异常,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常。 URLError产生的原因主要是

      • 网络没有连接,

      • 服务器连接失

      • 找不到指定的服务器。

      当使用urlopen或 opener.open 不能处理的,服务器上都对应一个响应对象,其中包含一个数字(状态码),如果urlopen不能处理,urlopen会产生一个相应的HTTPError对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态码。

      import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: response = urllib.request.urlopen('www.python.org/',timeout=0.1) except urllib.error.HTTPError as error: # HTTPError捕获异常信息 print('状态码为:',error.code) # 打印状态码 print('HTTPError异常信息为:',error.reason) # 打印异常原因 print('请求头信息如下:\n',error.headers) # 打印请求头 except urllib.error.URLError as error: # URLError捕获异常信息 print('URLError异常信息为:',error.reason)

      这里访问了一个真实存在的URL,输出结果为:

      11.解析URL

      urllin模块提供了parse子模块用来解析URL。

      11.1 拆分URL

      urlparse()方法

      parse子模块提供了urlparse()方法,实现将URL分解成不同部分,语法格式如下:

      urllib.parse.urlparse(urlstring,scheme=’’,allow_fragment=True)

      • urlstring:需要拆分的URL,必选参数。
      • scheme:可选参数,需要设置的默认协议,默认为空字符串,如果要拆分的URL中没有协议,可通过该参数设置一个默认协议。
      • allow_fragment:可选参数,如果该参数设置为False,则表示忽略fragment这部分内容,默认为True。

      示例:

      import urllib.parse #导入urllib.parse模块 parse_result = urllib.parse.urlparse('docs.python.org/3/library/urllib.parse.html') print(type(parse_result)) # 打印类型 print(parse_result) # 打印拆分后的结果

      程序运行结果:

      用此方法,除了返回ParseResult对象以外,还可以直接获取ParseResult对象中的每个属性值:

      print('scheme值为:', parse_result.scheme) print('netloc值为:', parse_result.netloc) print('path值为:', parse_result.path) print('params值为:', parse_result.params) print('query值为:', parse_result.query) print('fragment值为:', parse_result.fragment)

      urlsplit()方法

      urlsplit()方法与urlparse()方法类似,都可以实现URL的拆分。只是urlsplit()方法不再单独拆分params这部分内容,而是将params合并到path中,所以返回结果只有5部分内容。且返回的数据类型为SplitResult。

      import urllib.parse #导入urllib.parse模块 # 需要拆分的URL url = 'docs.python.org/3/library/urllib.parse.html' print(urllib.parse.urlsplit(url)) # 使用urlsplit()方法拆分URL print(urllib.parse.urlparse(url)) # 使用urlparse()方法拆分URL

      程序运行结果:

      11.2 组合URL

      urlunparse()方法

      urlunparse()方法实现URL的组合 语法:urlunparse(parts) parts表示用于组合url的可迭代对象

      import urllib.parse #导入urllib.parse模块 list_url = ['docs.python.org' # 定义基础链接 # 第二参数不完整时 print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html')) # 第二参数完整时,直接返回第二参数的链接 print(urllib.parse.urljoin(base_url,'docs.python.org/3/library/urllib.parse.html#url-parsing'))

      程序运行结果:

      11.4 URL的编码与解码

      使用urlencode()方法编码请求参数,该方法接收的参数值为字典

      示例

      import urllib.parse # 导入urllib.parse模块 base_url = 'www.558idc.com/lg.html 复制请保留原URL】

      本文共计2206个文字,预计阅读时间需要9分钟。

      如何全面掌握Python爬虫模块urllib库的详细用法和技巧?

      目录

      1.urllib模块简介

      2.发送请求:urlopen()方法

      3.发送GET请求

      4.发送POST请求

      5.设置网络超时

      6.复杂网络请求:urllib.request.Request()

      7.设置请求头

      如何全面掌握Python爬虫模块urllib库的详细用法和技巧?

      7.1 GET请求示例 7.2 POST请求示例

      8.获取Cookies

      目录
      • 1.urllib模块简介
      • 2.发送请求:urlopen()方法
      • 3. 发送GET请求
      • 4.发送post请求
      • 5. 设置网络超时
      • 6. 复杂网络请求_urllib.request.Request()
      • 7.设置请求头
        • 7.1get请求示例
        • 7.2post请求示例
      • 8. Cookies的获取与设置
        • 9.设置代理IP
          • 10.异常处理
            • 10.1 URLError
            • 10.2HTTPError
            • 10.3URLError&HTTPError双重异常捕捉
          • 11.解析URL
            • 11.1 拆分URL
            • 11.2 组合URL
            • 11.3 连接URL
            • 11.4 URL的编码与解码
            • 11.5URL参数的转换

          1.urllib模块简介

          python2有urllib和urllib2两种模块,都用来实现网络请求的发送。python3将urllib和urllib2模块整合并命名为urllib模块。urllib模块有多个子模块,各有不同的功能:

          • ①urllib.request模块:用于实现基本的www.python.org/' response = urllib.request.urlopen(url=url) # 发送网络请求 print('响应数据类型为:', type(response)) print('响应状态码为:', response.status) print('响应状态码为:', response.getcode()) print('响应头所有信息为:', response.getheaders()) print('响应头指定信息为:', response.getheader('Accept-Ranges')) # 读取HTML代码并进行utf-8解码 print('Python官网HTML代码如下:\n', response.read().decode('utf-8'))

            输出结果如下(部分):

            • response是一个<class ‘www.google.com.hk/ HTTP/1.1
            • 报文主体
            • (POST/GET)参数

          当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头Body

          Body就是返回给你的主体,比如说请求网站返回的html 响应头讯息里包含了服务器的响应讯息,如fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' # 构建请求对象 req = urllib.request.Request(url, data=data, headers=headers) # 发请求,获取响应对象 res = urllib.request.urlopen(req) # print(res.getcode()) # 得到响应码,200表示请求成功 html = res.read().decode('utf-8') # print(type(html)) # <class 'str'>,得到的是json数据 # json数据转字典 dic = json.loads(html) result = dic["translateResult"] # [[{'src': '你好', 'tgt': 'hello'}]] print(result[0][0]['tgt'])

          另一个简单的示例:

          import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.python.org/' response = urllib.request.urlopen(url=url, timeout=0.1) # 设置超时时间为0.1秒 print(response.read().decode('utf-8'))

          因为0.1秒设置的过快,结果因超时而产生异常,报错。

          通常根据网络环境不同,设置一个合理的时间,如2秒,3秒。

          对该网络超时异常进行捕捉并处理:

          import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 import socket # 导入socket模块 url = 'www.python.org/' # 请求地址 try: # 发送网络请求,设置超时时间为0.1秒 response = urllib.request.urlopen(url=url, timeout=0.1) print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码 except urllib.error.URLError as error: # 处理异常 if isinstance(error.reason, socket.timeout): # 判断异常是否为超时异常 print('当前任务已超时,即将执行下一任务!')

          6. 复杂网络请求_urllib.request.Request()

          urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

          参数说明:

          • url:访问网站的完整url地址
          • data:默认为None,表示请求方式为get请求;如果需要实现post请求,需要字典形式的数据作为参数。
          • headers:设置请求头部信息,字典类型。
          • origin_req_host:用于设置请求方的host名称或者IP。
          • unverifiable:用于设置网页是否需要验证,默认值为False。
          • method:用于设置请求方式,如GET,POST。

          7.设置请求头

          7.1get请求示例

          url = 'www.baidu.com' # 定义请求头信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'} # 创建Request对象 r = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(r) # 发送网络请求 print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码

          7.2post请求示例

          import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.csdn.net/" opener = urllib.request.build_opener() # 获取opener对象 resp = opener.open(url) print(resp.read().decode())

          因为urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高级功能,所以这里不用urlopen()发送请求,而需要创建一个opener对象(这本来是urllib2中的方法)。示例如下。学习过程中这里作为了解即可,建议重点研究/使用requests库。

          import urllib.request # 导入urllib.request模块 import www.python.org/1111111111.html') except urllib.error.URLError as error: # 捕获异常信息 print(error.reason) # 打印异常原因

          程序运行结果:

          10.2HTTPError

          HTTPError类是URLError的子类,主要用于处理HTTP请求所出现的一次。此类有以下三个属性。

          • code :返回HTTP状态码
          • reason 返回错误原因
          • headers 返回请求头

          import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: # 向不存在的网络地址发送请求 response = urllib.request.urlopen('www.python.org/1111111111.html') print(response.status) except urllib.error.HTTPError as error: # 捕获异常信息 print('状态码为:',error.code) # 打印状态码 print('异常信息为:',error.reason) # 打印异常原因 print('请求头信息如下:\n',error.headers) # 打印请求头

          结果如下(部分):

          10.3URLError&HTTPError双重异常捕捉

          因为URLError是HTTPError的父类,所以在捕获异常的时候可以先找子类是否异常,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常。 URLError产生的原因主要是

          • 网络没有连接,

          • 服务器连接失

          • 找不到指定的服务器。

          当使用urlopen或 opener.open 不能处理的,服务器上都对应一个响应对象,其中包含一个数字(状态码),如果urlopen不能处理,urlopen会产生一个相应的HTTPError对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态码。

          import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: response = urllib.request.urlopen('www.python.org/',timeout=0.1) except urllib.error.HTTPError as error: # HTTPError捕获异常信息 print('状态码为:',error.code) # 打印状态码 print('HTTPError异常信息为:',error.reason) # 打印异常原因 print('请求头信息如下:\n',error.headers) # 打印请求头 except urllib.error.URLError as error: # URLError捕获异常信息 print('URLError异常信息为:',error.reason)

          这里访问了一个真实存在的URL,输出结果为:

          11.解析URL

          urllin模块提供了parse子模块用来解析URL。

          11.1 拆分URL

          urlparse()方法

          parse子模块提供了urlparse()方法,实现将URL分解成不同部分,语法格式如下:

          urllib.parse.urlparse(urlstring,scheme=’’,allow_fragment=True)

          • urlstring:需要拆分的URL,必选参数。
          • scheme:可选参数,需要设置的默认协议,默认为空字符串,如果要拆分的URL中没有协议,可通过该参数设置一个默认协议。
          • allow_fragment:可选参数,如果该参数设置为False,则表示忽略fragment这部分内容,默认为True。

          示例:

          import urllib.parse #导入urllib.parse模块 parse_result = urllib.parse.urlparse('docs.python.org/3/library/urllib.parse.html') print(type(parse_result)) # 打印类型 print(parse_result) # 打印拆分后的结果

          程序运行结果:

          用此方法,除了返回ParseResult对象以外,还可以直接获取ParseResult对象中的每个属性值:

          print('scheme值为:', parse_result.scheme) print('netloc值为:', parse_result.netloc) print('path值为:', parse_result.path) print('params值为:', parse_result.params) print('query值为:', parse_result.query) print('fragment值为:', parse_result.fragment)

          urlsplit()方法

          urlsplit()方法与urlparse()方法类似,都可以实现URL的拆分。只是urlsplit()方法不再单独拆分params这部分内容,而是将params合并到path中,所以返回结果只有5部分内容。且返回的数据类型为SplitResult。

          import urllib.parse #导入urllib.parse模块 # 需要拆分的URL url = 'docs.python.org/3/library/urllib.parse.html' print(urllib.parse.urlsplit(url)) # 使用urlsplit()方法拆分URL print(urllib.parse.urlparse(url)) # 使用urlparse()方法拆分URL

          程序运行结果:

          11.2 组合URL

          urlunparse()方法

          urlunparse()方法实现URL的组合 语法:urlunparse(parts) parts表示用于组合url的可迭代对象

          import urllib.parse #导入urllib.parse模块 list_url = ['docs.python.org' # 定义基础链接 # 第二参数不完整时 print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html')) # 第二参数完整时,直接返回第二参数的链接 print(urllib.parse.urljoin(base_url,'docs.python.org/3/library/urllib.parse.html#url-parsing'))

          程序运行结果:

          11.4 URL的编码与解码

          使用urlencode()方法编码请求参数,该方法接收的参数值为字典

          示例

          import urllib.parse # 导入urllib.parse模块 base_url = 'www.558idc.com/lg.html 复制请保留原URL】