zoukankan      html  css  js  c++  java
  • Python爬虫从入门到进阶(2)之urllib库的使用

    1.什么是Urllib(官网地址:https://docs.python.org/3/library/urllib.html#module-urllib)

    Urllib是python内置的HTTP请求库

    包括以下模块:

      urllib.request 请求模块

      urllib.error 异常处理模块

      urllib.parse url解析模块

      urllib.robotparser robots.txt解析模块

    2.urllib.request

      (1)urllib.request.urlopen(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

    1 参数简介:
    url:是字符串类型或者 Request 对象
    data:必须是指定要发送到服务器的额外数据的对象,如果不需要这样的数据,则为None。
    timeout:可选,为阻塞操作指定以秒为单位的超时时间。不指定,将使用全局默认超时设置,实际上只适用于HTTP、HTTPS和FTP连接。
    context:如果指定了 context,它必须是 ssl.SSLContext 的实例
    cafile,capath:可选参数为HTTPS请求指定一组受信任的CA证书
    2.返回值:对于HTTP和HTTPS url,该函数返回 http.client.HTTPResponse对象
    9 # 1.urlopen中 url 参数的使用以及 Response 的使用
    10 def get():
    11     request_url = 'http://www.python.org/'
    12     # 创建请求对象
    13     request = Request(request_url)
    14     response = urlopen(request, context=ssl._create_unverified_context())
    15 
    16     # 响应体:Response相关的使用
    17     print(type(response))  # <class 'http.client.HTTPResponse'>
    18     print(response.status)  # 200
    19     print(response.getheaders())
    20     print(response.getheader('Server'))  # nginx
    21 
    22     # response.read()读取网页的全部内容
    23     data = response.read()
    24     # response.readline() 读取网页的一行内容
    25     data_line = response.readline()
    26     print(data)
    27     print(data_line)
    28 
    29 
    30 # 2.带参数的 get 方法
    31 def get_params():
    32     request_url = 'http://httpbin.org/get?name={}'
    33     # 拼接参数
    34     # keyword = 'nalanrongruo'
    35     keyword = '纳兰容若'
    36     final_url = request_url.format(quote(keyword))
    37     # quote(keyword) 将包含汉字的网址进行转译,要不然会报错: UnicodeEncodeError: 'ascii' codec can't encode characters in position
    38     # 10-11: ordinal not in range(128) python是解释性语言;解析器只支持ascii(0-127)
    39     print(final_url)
    40     request = Request(final_url)
    41     response = urlopen(request)
    42 
    43     data = response.read().decode('utf-8')
    44 
    45     print(data)
    46 
    47 
    48 # 3.get的字典参数
    49 def get_dict_params():
    50     base_url = 'http://httpbin.org/get?'
    51     params = {
    52         'wd': '纳兰容若',
    53         'name': '纳兰容若',
    54         'age': '21'
    55     }
    56     # 将字典或者元祖转换成URL可识别
    57     str_params = urlencode(params)
    58     print(str_params)
    59     request_url = base_url + str_params
    60 
    61     # 如果你的url已经是计算机可以识别的状态,那么不转换
    62     end_url = quote(request_url, safe=string.printable)
    63     print(end_url)
    64 
    65     # 返回的响应对象
    66     response = urlopen(end_url)
    67 
    68     print(response.read().decode('utf-8'))
    69 

      (2)urllib.request.build_opener([handler...])

    1 参数:BaseHandler的实例或者子类:ProxyHandler(如果检测到代理设置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、
    FTPHandler、FileHandler、HTTPErrorProcessor。  

      (3)class urllib.request.Request(urldata=Noneheaders={}origin_req_host=Noneunverifiable=Falsemethod=None)

       Request :这个类是URL请求的抽象。

      url:是包含可用 URL 的字符串类型

      data:必须是指定要发送到服务器的额外数据的对象,如果不需要这样的数据,则为None。对于 HTTP POST 请求data 必须是标准application/x-www-form-urlencoded格式化

      headers:是一个字典,并将被视为使用每个键和值作为参数调用add_header()。这通常用于“欺骗”用户代理头值,浏览器使用该头值来标识自身——一些HTTP服务器只允许来自普通浏览器的请求,而不允许来自脚本。如果参数不为空,则应包含Content-Type头。如果没提供 header,且 data 不是 None,则应该添加默认的Content-Type: application/x-www-form-urlencoded

      method:是一个字符串,该字符串指示将使用的HTTP请求方法。如果提供,它的值存储在方法属性中,并由get_method()使用。如果data为空,默认为“GET”,否则为“POST”。
    子类可以通过在类本身中设置方法属性来指示不同的默认方法。

     1 # post请求
     2 def post():
     3     request_url = 'http://httpbin.org/post'
     4     data = {
     5         'wd': '纳兰容若',
     6         'name': '纳兰容若',
     7         'age': '21'
     8     }
     9     # 返回的响应对象
    10     response = urlopen(request_url, data=data)
    11     print(response.read().decode('utf-8'))
    12 
    13 
    14 # 4.添加请求头,模拟真实浏览器器发送请求
    15 def request_header():
    16     request_url = 'http://httpbin.org/get'
    17     # 创建请求对象
    18     # 1) 添加 header
    19     # headers = {
    20     #     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
    21     #     'Chrome/70.0.3538.102 Safari/537.36'
    22     # }
    23     # request = Request(request_url, headers=headers)
    24 
    25     # 2).动态的添加header的信息
    26     request = Request(request_url)
    27     request.add_header('User-Agent',
    28                        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
    29                        'Chrome/70.0.3538.102 Safari/537.36')
    30 
    31     response = urlopen(request)
    32     print(response.read().decode('utf-8'))
    33 
    34 
    35 # 5.随机添加User-Agent,避免被屏蔽
    36 def random_request_header():
    37     # 百度一下:https://blog.csdn.net/rookie_is_me/article/details/81634048
    38     user_agent_list = [
    39         'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
    40         'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
    41         'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
    42         'Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50',
    43         'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET '
    44         'CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)']
    45 
    46     # 每次请求的浏览器都是不一样
    47     random_user_agent = random.choice(user_agent_list)
    48     print(random_user_agent)
    49     request_url = 'http://www.python.org/'
    50     request = Request(request_url)
    51     # 增加对应请求头的信息
    52     request.add_header("User-Agent", random_user_agent)
    53     response = urlopen(request, context=ssl._create_unverified_context())
    54 
    55     print(response)
    56 
    57     # 打印请求头信息
    58     print(request.get_header("User-agent"))

      (4)各种高级用法handler

     1 # 6.高级用法各种handler
     2 def http_handler_opener():
     3     # 系统的方法_have_ssl CA证书安全 套阶层
     4     # 系统的urlopen这个方法没有实现加ip的方法
     5     url = "http://www.baidu.com/"
     6 
     7     # 创建自己的处理器
     8     handler = HTTPHandler()
     9     # 创建自己的opener
    10     opener = build_opener(handler)
    11     # 用自己创建的opener来发送请求
    12     response = opener.open(url)
    13 
    14     data = response.read().decode("utf-8")
    15     print(data)
    16 
    17 
    18 def proxy_handler():
    19     url = "http://www.baidu.com/"
    20 
    21     # 添加代理
    22     # 免费ip
    23     proxy = {
    24         "http": "http://112.87.71.146:9999"
    25     }
    26 
    27     # 代理ip处理器
    28     ip_handler = ProxyHandler(proxy)
    29     # 创建自己的opener
    30     opener = build_opener(ip_handler)
    31     # 拿着代理ip发送网络请求
    32     response = opener.open(url, timeout=10)
    33     data = response.read().decode("utf-8")
    34     print(data)
    35 
    36 
    37 def random_proxy_handler():
    38     proxy_list = [
    39         {"http": "http://119.101.116.204:9999"},
    40         {"http": "hhttp://119.101.119.33:9999"},
    41         {"http": "http://117.85.49.123:9999"},
    42         {"http": "http://112.85.167.223:9999"},
    43         {"http": "http://119.101.112.145:9999"}
    44     ]
    45     for proxy in proxy_list:
    46         # print(proxy)
    47         # 利用对应遍历出来的ip地址创建处理器
    48         ip_handler = ProxyHandler(proxy)
    49         # 利用处理器创建opener
    50         opener = build_opener(ip_handler)
    51         try:
    52             response = opener.open("http://www.baidu.com", timeout=10)
    53             data = response.read()
    54             print(data)
    55         except Exception as e:
    56             print(e)
    57 
    58 
    59 def auth_user():
    60     # 1.定义账号和密码
    61     user = "admin"
    62     pwd = "123456"
    63     nei_url = "http://www.baidu.com"
    64 
    65     # 创建密码管理器
    66     pwd_manager = HTTPPasswordMgrWithDefaultRealm()
    67 
    68     pwd_manager.add_password(None, nei_url, user, pwd)
    69 
    70     # 创建认证处理器
    71     auth_handler = HTTPBasicAuthHandler()
    72 
    73     opener = build_opener(auth_handler)
    74 
    75     response = opener.open(nei_url, timeout=10)
    76     print(response.read())

    3.urllib.error

    是urllib.request引发的异常定义异常类。基本异常类是URLError

    urllib.error.URLError

    urllib.error.HTTPError

     1 def error():
     2     url = "https://blog.csdn.net/weidan0302/article/details/110"
     3 
     4     try:
     5         urlopen(url, context=ssl._create_unverified_context())
     6     except urllib.error.HTTPError as error:
     7         print(error.code)
     8 
     9     except urllib.request.URLError as error:
    10         print(error)

    点击下载代码

     

  • 相关阅读:
    ListView的CheckBox实现全部选中/不选中
    JTA 深度历险
    缓存更新的套路是怎样的?
    对ThreadLocal实现原理的一点思考
    透彻理解Spring事务设计思想之手写实现
    JAVA 线程池架构浅析
    ThreadPoolExecutor 线程池浅析
    MySql实现sequence功能的代码
    MySql事务select for update及数据的一致性处理讲解
    MySQL四种事务隔离级别详解
  • 原文地址:https://www.cnblogs.com/zimengfang/p/10153491.html
Copyright © 2011-2022 走看看