• Python urllib库的基本使用


    1.基本介绍

    Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。

    urllib 库主要包含以下几个模块:

    • urllib.request # 打开和读取url
    • urllib.error #包含了该库抛出的异常
    • urllib.parse #解析url
    • urllib.robotparser #解析 robots.txt 文件

    robots.txt 文件:当蜘蛛访问网站时,首先会去访问网站根目录下的robots.txt文件,会按照这个文件中指定的robots协议不去抓取网站中的部分内容。简单概括的话,robots文件就是控制搜索引擎的蜘蛛抓取网站内容的协议。

    2.简单使用

    urllib.request 可以模拟浏览器的一个请求发起的过程。

    urllib.request.urlopen方法来开发一个URL,语法格式如下:

    def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                *, cafile=None, capath=None, cadefault=False, context=None):
    
    • url:url 地址。
    • data:发送到服务器的其他数据对象,默认为 None。
    • timeout:设置访问超时时间。
    • cafilecapath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。
    • cadefault:已经被弃用。
    • context:ssl.SSLContext类型,用来指定 SSL 设置。

    http://www.httpbin.org 是一个可以检测请求的一个网站工具

    发起一个简单get请求

    import urllib.request
    
    url = "http://www.httpbin.org/get"
    result = urllib.request.urlopen(url)
    print(result.read().decode('utf-8')) #对获取到的网页进行utf-8解码
    print(result.getcode()) # 200,返回状态码
    print(result.getheaders()) # 获取所有responseHeader
    print(result.getheader("Server")) # 获取responseHeader中的Server参数
    

    发一个简单的post请求,当存在data值的时候,就是post请求

    import urllib.parse
    
    url = "http://www.httpbin.org/post"
    params = {"hello": "world"}
    data = urllib.parse.urlencode(params).encode("utf-8") # 对json参数进行编码
    result = urllib.request.urlopen(url=url, data=data)
    print(result.read().decode())
    

    超时 timeout

    try:
        url = "http://www.httpbin.org/get"
        result = urllib.request.urlopen(url, timeout=0.01) # 单位:秒
        print(result.read().decode())
    except urllib.error.URLError as e:
        print("Time out! ==> {0}".format(e))
    

    发送复杂请求

    url = "http://www.httpbin.org/post"
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36",
        "X-Amzn-Trace-Id": "Root=1-60d6a949-50a80ada4a3a35b9521a5e6d"}
    req = urllib.request.Request(url=url, headers=headers, method="POST")
    result = urllib.request.urlopen(req)
    print(result.read().decode('utf-8'))
    
    class Request:
        def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None):
    

    构建Request对象,然后把该对象放入urllib.request.urlopen(req);

    • url:请求路径
    • headers:请求头
    • method:请求方式,GET,POST,PUT...

    注意:

    • 当发送请求的时候,如果返回的错误码是418,这表示你请求的网站知道你是从urllib发送的请求,不允许你请求,所以我们需要添加headers请求头,伪装自己是浏览器发起的请求,如上的header的请求头。
    • 当出现如下异常时,是因为Python 2.7.9 之后版本引入了一个新特性:当你urllib.urlopen一个 https 的时候会验证一次 SSL 证书 ,当目标使用的是自签名的证书时就会爆出该错误消息。
    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)>
    

    解决办法:

    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
  • 相关阅读:
    BZOJ 3670: [Noi2014]动物园 [KMP]
    BZOJ 3569: DZY Loves Chinese II [高斯消元XOR 神题]
    BZOJ 2419: 电阻 [高斯消元 物理]
    BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
    BZOJ 4269: 再见Xor [高斯消元 线性基]
    BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]
    HDU 3949 XOR [高斯消元XOR 线性基]
    BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]
    BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]
    BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]
  • 原文地址:https://www.cnblogs.com/sun2020/p/14939431.html
Copyright © 2020-2023  润新知