zoukankan      html  css  js  c++  java
  • urllib的基本使用介绍

    1. urllib中urlopen的基本使用介绍

     1 ### urllib中urlopen的基本使用介绍
     2 
     3 ## urlopen的基本用法(GET请求)
     4 import urllib.request as r
     5 # 访问一个url,返回一个对象
     6 response = r.urlopen("https://www.python.org")
     7 # 查看返回的网页页面内容
     8 print(response.read().decode("utf-8"))
     9 # 查看response类型
    10 print(type(response))
    11 # 查看response对象有什么方法和属性
    12 print(dir(response))
    13 # 获取response对象的相关用法帮助
    14 help(response)
    15 # 页面返回状态
    16 print(response.status)
    17 # 页面的headers元素内容
    18 print(response.getheaders())
    19 # 获取页面headers的Server属性值
    20 print(response.getheader('Server'))
    21 
    22 
    23 ## data参数(POST请求),urlencode可以把字典格式数据转化成字符串
    24 import urllib.request as r
    25 import urllib.parse as p
    26 # 通过字符转换获取可直接post提交的数据data
    27 data = bytes(p.urlencode({'word':'hello'}),encoding = 'utf-8')
    28 data2 = p.urlencode({'word':'hello'})
    29 print(data,data2)
    30 # 通过post提交data数据
    31 response2 = r.urlopen('http://httpbin.org/post',data=data)
    32 response3 = r.urlopen('http://httpbin.org/post',data=bytes(data2,encoding = 'utf-8'))
    33 print(response3.read())
    34 
    35 
    36 # timeout参数
    37 import urllib.request as r
    38 import urllib.error as er
    39 import socket
    40 
    41 # 尝试执行
    42 try:
    43     response4 = r.urlopen('http://httpbin.org/get',timeout=0.1)
    44     print(response4.read())
    45 # 出现错误进行抓取而不中断程序
    46 except er.URLError as e:
    47     # 错误原因
    48     print(e.reason)
    49     print(socket.timeout)
    50     # 判断类型是否相同
    51     if isinstance(e.reason, socket.timeout):
    52         print(isinstance(e.reason, socket.timeout))
    53         print('TIME OUT')
    54     
    55 
    56 # 其他参数:cafile指定CA证书,capath指定CA证书路径,context参数,必须是ssl.SSLContext类型,用来指定SSL设置

    2. urllib中Request的基本使用介绍

     1 ### urllib中Request的基本使用介绍
     2 
     3 
     4 ## Request对象进行传参爬取页面
     5 import urllib.request
     6 
     7 # 生成一个request对象
     8 request = urllib.request.Request('https://python.org')
     9 # 将request对象进行传参
    10 response = urllib.request.urlopen(request)
    11 print(type(request))
    12 print(response.read().decode('utf-8'))
    13 
    14 
    15 ## Request对象的参数:
    16 ## url,用于请求URL,必传参数
    17 ## data,必须传bytes类型的数据
    18 ## headers,请求头,是一个字典,也可以通过请求实例的add_header()方法进行添加
    19 ## origin_req_host指的是请求方的host名称或者IP地址
    20 ## unverifiable布尔类型,表示这个请求是无法验证的,默认是False
    21 ## method是一个字符串,指定请求方法,如get,post
    22 from urllib import request, parse
    23 
    24 url = 'http://httpbin.org/post'
    25 headers = {
    26     'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    27     'Host':'httpbin.org',
    28 }
    29 dict = {
    30     'name':'dmr'
    31 }
    32 # 转换数据类型为bytes
    33 data = bytes(parse.urlencode(dict), encoding='utf-8')
    34 # 生成Request请求对象
    35 req = request.Request(url=url,data=data,headers=headers)
    36 response = request.urlopen(req)
    37 print(response.read().decode('utf-8'))
    38 
    39 
    40 ### 高级用法
    41 
    42 ## web弹窗认证
    43 from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
    44 from urllib.error import URLError
    45 
    46 username = 'username'
    47 password = 'password'
    48 url = 'http://127.0.0.1:6666'
    49 # 生成HTTPPasswordMgrWithDefaultRealm对象
    50 p = HTTPPasswordMgrWithDefaultRealm()
    51 # 为对象添加认证参数信息
    52 p.add_password(None,url=url,username=username,password=password)
    53 # 生成认证对象
    54 auth_handler = HTTPBasicAuthHandler(p)
    55 # 生成opener对象
    56 opener = build_opener(auth_handler)
    57 
    58 try:
    59     result = opener.open(url)
    60     html = result.read().decode('utf-8')
    61     print(html)
    62 except URLError as e:
    63     print(e.reason)
    64 
    65 
    66 ## 代理
    67 from urllib.error import URLError
    68 from urllib.request import ProxyHandler, build_opener
    69 
    70 proxy = {
    71     'http':'http://127.0.0.1:4564',
    72     'https':'http://127.0.0.1:4564'
    73 }
    74 proxy_handler = ProxyHandler(proxy)
    75 opener = build_opener(proxy_handler)
    76 try:
    77     result = opener.open('https://www.baidu.com')
    78     print(result.read().decode('utf-8'))
    79 except URLError as e:
    80     print(e.reason)
    81 
    82 
    83 ## Cookies,提取网页的Cookies;可通过http.cookiejar.Mozilla(LWP)CookieJar(filename)和.save()将cookies保存到文件
    84 import http.cookiejar, urllib.request
    85 
    86 cookie = http.cookiejar.CookieJar()
    87 handler = urllib.request.HTTPCookieProcessor(cookie)
    88 opener = urllib.request.build_opener(handler)
    89 response = opener.open('http://www.baidu.com')
    90 for item in cookie:
    91     print(item.name+'='+item.value)
    View Code

    3. 处理异常

     1 ### 处理异常
     2 
     3 ## URLError
     4 from urllib import request, error
     5 
     6 try:
     7     response = request.urlopen('http:www.dmr666.org')
     8 except error.URLError as e:
     9     print(e.reason)
    10 
    11     
    12 ## HTTPError, URLError的子类
    13 from urllib import request, error
    14 
    15 try:
    16     response = request.urlopen('http://www.dmr66.org')
    17 except error.HTTPError as e:
    18     print(e.reason, e.code, e.headers, seq='
    ')
    19 else:
    20     pass

    4. 解析链接&robots

      1 ### 解析链接
      2 
      3 ## urlparse()    
      4 ## scheme协议,://前面部分
      5 ## netloc域名,第一个/符号前面
      6 ## path路径,域名后面;前面部分
      7 ## params参数,;号后面问号?前面
      8 ## query查询条件,?号后面,用于get类型的url
      9 ## flagment描点,#后面,用于定位页面内部的下拉位置
     10 from urllib.parse import urlparse
     11 
     12 result = urlparse('http://www.baidu.com/index.html;user?id=$#comment')
     13 print(type(result), result)
     14 
     15 
     16 ## urlunparse(),传入可迭代对象,长度必须是6
     17 from urllib.parse import urlunparse
     18 
     19 data = ['http','www.baidu.com','index.html','user','b=6','comment']
     20 print(urlunparse(data))
     21 
     22 
     23 ## urlsplit(),params会合并在path中
     24 from urllib.parse import urlsplit
     25 
     26 result = urlsplit('http://www.baidu.com/index.html;user?id=$#comment')    
     27 print(result)
     28 
     29 ## urlunsplit(),传入可迭代对象,长度必须是5
     30 from urllib.parse import urlunsplit
     31 
     32 data = ['http','www.baidu.com','index.html','a=6','comment']
     33 print(data)
     34 
     35 
     36 ## urljoin(),url拼接,只保留scheme,netloc,path
     37 ## scheme,netloc,path三部分内容新链接中不存在,则补充,新链接中存在,则用新链接的
     38 from urllib.parse import urljoin
     39 
     40 print(urljoin('http://www.baidu.com','index.html'))
     41 print(urljoin('http://www.baidu.com','https://www.baidu.com/index.html'))
     42 print(urljoin('http://www.baidu.com/dmr.html','https://www.baidu.com/index.html'))
     43 print(urljoin('http://www.baidu.com/dmr.html','https://www.baidu.com/index.html?q=2'))
     44 print(urljoin('http://www.baidu.com/dmr.html','q=2#comment'))
     45 print(urljoin('www.baidu.com/dmr.html','q=2#comment'))
     46 print(urljoin('www.baidu.com#coment','q=2'))
     47 
     48 
     49 ## urlencode(),字典序列化,把字典序列化成get请求参数,常用于get请求url的拼接
     50 from urllib.parse import urlencode
     51 
     52 query = {
     53     'name':'dmr',
     54     'age':'25',    
     55 }
     56 base_url = 'http://www.badu.com'
     57 q = urlencode(query)
     58 url = base_url + q
     59 print(url)
     60 
     61 
     62 ## parse_qs(),反序列化,将参数转换成字典格式
     63 from urllib.parse import parse_qs
     64 
     65 query='name=dmr&age=25'
     66 dict = parse_qs(query)
     67 print(type(dict),dict)
     68 
     69 
     70 ## parse_qsl(),反序列化,将参数转换成元组组成的列表
     71 from urllib.parse import parse_qsl
     72 
     73 query = 'name=dmr&age=25'
     74 list = parse_qsl(query)
     75 print(list)
     76 
     77 
     78 ## quote(),将内容转换成url编码格式,url中有中文内容时,常出现乱码
     79 from urllib.parse import quote
     80 
     81 keyword = '杜某人'
     82 url = 'https://www.baidu.com/?wd=' + keyword
     83 print(url)
     84 print(quote(url))
     85 
     86 ## unquote(),解码
     87 from urllib.parse import unquote
     88 
     89 url = 'https%3A//www.baidu.com/%3Fwd%3D%E6%9D%9C%E6%9F%90%E4%BA%BA'
     90 print(unquote(url))
     91 
     92 
     93 
     94 ### Robots协议,即爬虫协议,用来告诉爬虫哪些页面可以爬取,哪些页面不可以爬取
     95 # 当搜索爬虫访问一个站点时,它先检查这个站点根目录下是否存在robots文件,如果存在,则按照其中定义的范围来爬取,否则,皆可爬取
     96 # 其中,robots文件基本包含如下3项内容
     97 # User-agent:* # 爬虫名称,*为所有
     98 # Disallow:/   # 禁止爬取的网站目录
     99 # Allow:/public/  # 仅允许爬取的网站目录,一般不与Disallow共用
    100 ## robotparser(),解析robots文件模块
    101  ## set_url(),用来设置设置robots.txt文件链接
    102  ## read(),读取robots.txt文件并进行分析
    103  ## parse(),用来解析robots.txt文件
    104  ## can_fetch(User-agent,URL),判断url页面是否可以爬取
    105  ## mtime(),返回上次抓取和分析robots.txt的时间
    106  ## modified(),将当前时间设置为上次抓取和分析robots.txt的时间
    107  
    108 from urllib.robotparser import RobotFileParser
    109 
    110 rp = RobotFileParser()
    111 rp.set_url('http://www.baidu.com/robots.txt')
    112 rp.read()
    113 print(rp.can_fetch('*','http://www.baidu.com/p/ldkfjlk'))
    114 print(rp.can_fetch('*','http://www.baidu.com/s?wd=Python'))
  • 相关阅读:
    洛谷 P1022.计算器的改良
    洛谷 P1014.Cantor表
    洛谷 P1464.Function
    洛谷 P1426.小鱼会有危险吗
    洛谷 P2089.烤鸡
    洛谷 P1579.哥德巴赫猜想(升级版)
    洛谷 P1618.三连击(升级版)
    通过ES6写法去对Redux部分源码解读
    闲谈Hybrid
    浅谈React、Vue 部分异步
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/12448948.html
Copyright © 2011-2022 走看看