网络爬虫 Handler处理器和自定义Opener,URLError和HTTPError

  • 一、Handler处理器和自定义Opener
    • 1 opener是 urllib.request.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构建好的)。
      • urllib.request.urlopen()函数不支持验证、cookie或者其它HTTP高级功能。要支持这些功能,必须使用build_opener()函数创建自定义Opener对象:
      • build_opener ()返回的对象具有open()方法与urlopen()函数的功能相同。
      • 1)使用相关的 Handler处理器 来创建特定功能的处理器对象;
      • 2)然后通过 urllib.request.build_opener()方法使用这些处理器对象,创建自定义opener对象;
      • 3)使用自定义的opener对象,调用open()方法发送请求。
      • build_opener(handler)  参数handler是Handler实例,常用的有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler等。
    • 2.简单的自定义opener()
      • from urllib.request import HTTPHandler,Request,build_opener
      • # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求
      • http_handler = HTTPHandler()
      • opener = build_opener(http_handler)
      • # 构建 Request请求
      • request = Request("http://baidu.com/")
      • # 调用自定义opener对象的open()方法,发送request请求
      • response = opener.open(request)
      • # 获取服务器响应内容
      • print(response.read().decode("utf-8"))
      • 如果在 HTTPHandler()增加 debuglevel=1参数,还会将 Debug Log 打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试
      • https和http使用不同的Handler  https使用HTTPSHandler
    • 3.代理设置
      • 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的。很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。
      • 所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
      • from urllib.request import ProxyHandler,build_opener,Request
      • # 构建了两个代理Handler,一个有代理IP,一个没有代理IP
      • httpproxy_handler = ProxyHandler({"http" : "119.28.152.208:80"})
      • nullproxy_handler = ProxyHandler({})
      • proxySwitch = True #定义一个代理开关
      • # 通过 urllib.build_opener()方法使用这些代理Handler对象,创建自定义opener对象# 根据代理开关是否打开,使用不同的代理模式
      • if proxySwitch:
        • opener = build_opener(httpproxy_handler)
      • else:
        • opener = build_opener(nullproxy_handler)
      • request = Request("http://www.baidu.com/")
      • response = opener.open(request)
      • print(response.read().decode("utf-8"))
      • 随机代理ip   免费代理ip 可以在代理网站上获取
      • # 随机选择一个代理
        • proxy_list = [
          • {"http" : "122.72.18.35:80"},
          • {"http" : "122.72.18.34:80"},
          • {"http" : "203.174.112.13:3128"},
        • ]
        • proxy = random.choice(proxy_list)
        • httpproxy_handler = ProxyHandler(proxy)
      • 私密代理(付费的)
        • proxy = {'http': '用户名:密码@ip:端口'}
    • 4.ProxyBasicAuthHandler()  验证代理服务器授权的用户名和密码
      • from urllib.request import Request,build_opener,HTTPPasswordMgrWithDefaultRealm,ProxyBasicAuthHandler
      • passwdmgr = HTTPPasswordMgrWithDefaultRealm()
      • passwdmgr.add_password(None, ip:端口, 用户名, 密码)
      • proxyauth_handler = ProxyBasicAuthHandler(passwdmgr)
      • .....
    • 5.Cookie
      • Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息。
      • 目前有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除
      • 1.在浏览器中登录京东后,复制浏览器的请求头信息
      • 2.通过代码Request 添加请求头信息(除去"Accept-Encoding",和第一行),就可以通过代码查看登录后的页面
    • 6.cookielib库 和 HTTPCookieProcessor处理器
      • from urllib.request import HTTPCookieProcessor,build_opener
      • from http.cookiejar import CookieJar,MozillaCookieJar
      • # 构建一个CookieJar对象实例来保存cookie
      • cookiejar = CookieJar()
      • # 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
      • handler = HTTPCookieProcessor(cookiejar=cookiejar)
      • # 通过 build_opener() 来构建opener
      • opener = build_opener(handler)
      • # 以open方法访问页面,访问之后会自动保存cookie到cookiejar中
      • response = opener.open("http://www.baidu.com/")
      • print("response==",response.read())
      • # 可以按标准格式将保存的Cookie打印出来,最后没有分号
      • cookie_str = ""
      • for item in cookiejar:
        • cookie_str = cookie_str +item.name+"="+item.value+";"
      • cookie_str = cookie_str[:-1]#把最后一个分好干掉
      • print(cookie_str)
      • 我们使用以上方法将Cookie保存到cookiejar对象中,然后打印出了cookie中的值,也就是访问百度首页的Cookie值。
      • 保存cookie 信息到文件
        • filename = 'cookie.txt'
        • cookiejar = MozillaCookieJar(filename)
        • handler = HTTPCookieProcessor(cookiejar=cookiejar)
        • opener = build_opener(handler)
        • response = opener.open("http://www.baidu.com/")
        • print("response==",response.read())
        • cookiejar.save()   保存cookie 到 cookie.txt 中
      • 使用本地文件cookie信息访问网站
        • cookiejar = MozillaCookieJar()
        • # 从文件中读取cookie内容到变量
        • cookiejar.load('cookie.txt')
        • handler = HTTPCookieProcessor(cookiejar=cookiejar)
        • opener = build_opener(handler)
        • response = opener.open("http://www.baidu.com/")
        • print("response==",response.read())
  • 二、URLError,HTTPError
    • from urllib.request import Request,urlopen,HTTPError,URLError
    • try:
      • requset = Request('http://192.168.31.124:8080')
      • respose = urlopen(requset)
    • #捕获HTTPError ,由于HTTPError的父类是URLError,所以父类的异常应当写到子类异常的后面
    • except HTTPError as e:
      • print("捕获HTTPError异常e.code==", e.code)  #HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
      • print("捕获HTTPError异常e==",e)
    • except URLError as e:
      • print("捕获URLError异常e==", e)
    • else:
      • print(respose.read())
      • print("两个错误的没有出现,正常执行")
    • URLError 产生的原因主要有:
      • 1、没有网络连接
      • 2、服务器连接失败
      • 3、找不到指定的服务器

猜你喜欢

转载自blog.csdn.net/qq_41654985/article/details/81013411