• Python爬虫之urllib库


    请求库 urllib

    urllib主要分为几个部分

    urllib.request 发送请求
    urllib.error 处理请求过程中出现的异常
    urllib.parse 处理url
    urllib.robotparser 解析robots.txt -->规定了该网站的爬虫权限

    urllib.request方法

    data = urllib.request.urlopen(url)  #返回response对象

    data.read() --->取出网页源代码 (bytes类型,可以通过decode()转成utf-8) 注意网页源代码不包括js处理后的数据
    data.info() --->取出响应的头信息
    data.getcode() --->取出返回码
    data.geturl() --->取出请求的url

    用脚本发出的请求,headers中的User-Agent是python-urllib/3.6,有些网站会根据这个来识别请求是不是脚本发出的,进而过滤掉爬虫,那我们怎么来模拟浏览器访问呢?
    用urllib.request.Request()来携带headers头信息

    复制代码
    headers = {
    'User=Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
    }
    request = urllib.request.Request(url,headers=headers) #实例Request()对象,Request对象初始化可以传入headers
    data = urllib.request.urlopen(request) #urlopen不仅可以传入一个url,并且可以传入一个Request对象
    复制代码

    urllib.request是如何区分请求时get还是post呢?
    看看urllib.request的源代码,可以知道,如果如果请求携带data参数,则为post请求,反之则为get请求

    Cookies使用

    固定写法

    复制代码
    import http.cookiejar
    # 创建cookieJar对象
    cookie_jar = http.cookiejar.CookieJar()
    # 使用HTTPCookieProcessor创建cookie处理器,并以它为参数构建opener对象
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_jar))
    # 把opener变成urlopen,安装之后,给urlopen加上了保存cookies功能
    urllib.request.install_opener(opener) #如果不想安装也可以,直接用opener.open(url)打开
    复制代码

    设置代理

    固定写法

    复制代码
    proxy = {'http':'183.232.188.18:80','https':'183.232.188.18:80'} # 代理 ip:port
    # 创建代理处理器
    proxies = urllib.request.ProxyHandler(proxy)
    # 创建opener对象
    opener = urllib.request.build_opener(proxies,urllib.request.HTTPHandler)
    urllib.request.install_opener(opener) # 如果不想安装也可以,直接用opener.open(url)打开,这样opener就有代理而urlopen没有
    复制代码

    urllib.error

    URLError是父类 断网或者服务器不存在 有异常原因,没有code属性
    HTTPError是子类 服务器存在,但是地址不存在,有code和reason属性

    #url = 'http://www.adfdsfdsdsa.com' URLError
    #url = 'https://jianshu.com/p/jkhsdhgjkasdhgjkadfhg' HTTPError

    判断方法

    复制代码
    try:
        data = urllib.request.urlopen(url)
        print(data.read().decode())
    except urllib.error.URLError as e:
        if hasattr(e,'code'):
            print('HTTPError')
        elif hasattr(e,'reason'):
            print('URLError')
    复制代码

    urllib.parse

    复制代码
    import urllib.parse
    
    # urllib.parse.urljoin() # 拼接url 字符串拼接,若都是域名,则以后面覆盖
    # urllib.parse.urlencode() # 把字典转查询字符串
    # urllib.parse.quote() # url采用ascii码编码,出现中文时需要进行url编码
    # urllib.parse.unquote() # url解码 
    #
    urlencode
    
    >>> from urllib import parse
    >>> query = {
    'name': 'walker',
    'age': 99,
    }
    >>> parse.urlencode(query)
    'name=walker&age=99'
    
    quote/quote_plus
    
    >>> from urllib import parse
    >>> parse.quote('a&b/c') #未编码斜线
    'a%26b/c'
    >>> parse.quote_plus('a&b/c') #编码了斜线
    'a%26b%2Fc'
    
    unquote/unquote_plus
    
    from urllib import parse
    >>> parse.unquote('1+2') #不解码加号
    '1+2'
    >>> parse.unquote('1+2') #把加号解码为空格
    '1 2'
    
    url = 'http://www.baidu.com/?wd=书包'
    urllib.request.urlopen(url)  #会报错编码错误
    #如果想正确请求,需要url = 'http://www.baidu.com/?wd={}'.format(urllib.parse.quote('书包')) 先把中文进行url编码,然后再去请求
    复制代码

    urllib3

    复制代码
    requests库底层用的urllib3
    
     import urllib3
     http = urllib3.PoolManager()
    
    r = http.request('GET','https://www.jianshu.com',redirect=False) # 关闭重定向
    print(r.status) 
    复制代码

     具体的urllib3的使用可以参考https://www.cnblogs.com/KGoing/p/6146999.html

  • 相关阅读:
    Linux软件管理
    Linux计划任务与进程管理
    PHP学习 Day_04
    Linux网络管理
    单播组播的实现
    Linux 下的tmpfs文件系统(/dev/shm)
    11.Linux date命令的用法
    Luogu P3783 [SDOI2017]天才黑客
    Luogu P3768 简单的数学题
    Luogu P2336 [SCOI2012]喵星球上的点名
  • 原文地址:https://www.cnblogs.com/6J2B2/p/12074923.html
Copyright © 2020-2023  润新知