zoukankan      html  css  js  c++  java
  • 1.爬虫 urlib库讲解 Handler高级用法

    在前面我们总结了urllib库的 urlopen()和Request()方法的使用,在这一小节我们要使用相关的Handler来实现代理、cookies等功能。

    写在前面:

    urlopen()方法不支持代理、cookie等其它的HTTP/GTTPS高级功能,所以要支持这些功能:

    1. 使用相关的Handler处理器来创建特定功能的处理器对象
    2. 然后调用urllib.request.build_opener()方法使用这些处理器对象,创建自己的opener对象
    3. 使用自定义的opener对象,调用open()方法发送请求

    *如果程序里所有的请求都使用自定义的opener,可以使用urllib.request.install_opener()将自定义的opener对象定义为全局的opener,表示如果之后凡是调用urlopen(),都将使用这个opener

    简单介绍下request模块里的相关的Handler类:(我们暂且只会用到3种,需求够了就ok)

    • ProxyHandler:用于设置代理,默认代理为空
    • HTTPCookieProcessor:用于处理Cookies
    • HTTPBasicAuthHandler:用于管理验证,如果一个链接打开时需要认证,那么可以用它来解决认证问题

    0.代理服务器的设置

    import urllib.request
    import urllib.error
    
    proxy_handler = urllib.request.ProxyHandler({
        'http': 'http://127.0.0.1:9743',
        'https': 'https://127.0.0.1:9743'
    })
    opener = urllib.request.build_opener(proxy_handler)
    try:
        response = opener.open('http://httpbin.org/get')
    except URLError as e:
        print(response.read())

    当然,我们可以创建全局默认的opener对象,调用urlopen()来发送请求:

    import urllib.request
    
    proxy_handler = urllib.request.ProxyHandler({
        'http': 'http://127.0.0.1:9743',
        'https': 'https://127.0.0.1:9743'
    })
    opener = urllib.request.build_opener(proxy_handler)
    urllib.request.install_opener(opener) #创建全局默认的opener对象
    response = urllib.request.urlopen('http://httpbin.org/get')
    print(response.read().decode('utf-8'))

    1.cookie

    简单说一说cookie相关的知识:cookies库,该模块(简单来说,一个.py文件就可以称作一个模块)主要的对象有CookJar、FileCookJar、MozillaCookJar、LwPCookJar.

    *其实在大多数的情况下,我们只使用CookJar(),如果需要和本地文件交互,就要用MozillaCookJar()或者LwPCookJar().

    *CookJar:管理HTTP、cookie值,存储HTTP请求生成的Cookie.向传出的Http请求添加cookie对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后Cookies也会丢失。

    (以百度为例,我们将网站的cookies获取下来并以文件格式保存再读取并利用)

    • 将网站的cookie获取下来
    import http.cookiejar, urllib.request
    
    cookie = http.cookiejar.CookieJar()
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    response = opener.open('http://www.baidu.com')
    for item in cookie:
        print(item.name+"="+item.value)

    结果如下:

    BAIDUID=D45F880AC3EE43897AC101C8E9E48006:FG=1
    BIDUPSID=D45F880AC3EE43897AC101C8E9E48006
    H_PS_PSSID=1434_21081_28768_28724_28558_28832_28585_26350_28603_28627_28606
    PSTM=1554791586
    delPer=0
    BDSVRTM=0
    BD_HOME=0
    
    • 获取网站的cookies并以文本格式保存
    import http.cookiejar, urllib.request
    filename
    = "cookie.txt" cookie = http.cookiejar.MozillaCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) response = opener.open('http://www.baidu.com') cookie.save(ignore_discard=True, ignore_expires=True)

    *MozillaCookieJar()是CookieJar的子类,可以用来处理Cookies和文件相关的事件,比如读取和保存cookies,可以将cookies保存成Mozilla型浏览器的Cookies格式

    *LwPCookJar()同样可以读取和保存cookies,它会保存成libwww-per(LWP)格式的Cookies文件

    import http.cookiejar, urllib.request
    filename
    = 'cookie.txt' cookie = http.cookiejar.LWPCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) response = opener.open('http://www.baidu.com') cookie.save(ignore_discard=True, ignore_expires=True)
    • 生成了cookies文件后,从文件中读取并利用(以LWP格式为例)
    import http.cookiejar, urllib.request
    cookie = http.cookiejar.LWPCookieJar()
    cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    response = opener.open('http://www.baidu.com')
    print(response.read().decode('utf-8'))

    2.验证

    验证:有些网站在打开时就会弹出提示框,直接提示你输入用户名和密码,验证成功后才能查看页面。

    from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
    from urllib.error import URLError
    
    username = 'username'
    password = 'password'
    url = 'http://localhost:5000/'
    
    p = HTTPPasswordMgrWithDefaultRealm()
    p.add_password(None,url,username,password)
    auth_handler = HTTPBasicAuthHandler(p)
    opener = build_opener(auth_handler)
    
    try:
        result = opener.open(url)
        html = result.read().decode('utf-8')
        print('html')
    except URLError as e:
        print(e.reason)
  • 相关阅读:
    php项目目录显示
    初识fastadmin
    php环境变量
    tp5数据库——时间查询
    tp5数据库——聚合查询
    tp5数据库——链式操作
    tp5数据库——查询语法
    MongoDB踩坑记录
    RxJS合并操作符:concat、merge、forkJoin、zip、 combineLatest 、concatAll、mergeAll、switchAll
    Git Flow
  • 原文地址:https://www.cnblogs.com/DC0307/p/10676887.html
Copyright © 2011-2022 走看看