最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python爬虫中的Handler和Opener是什么

    正文概述    2020-04-18   224

    Python爬虫中的Handler和Opener是什么

    Handler处理器和自定义Opener

    opener是urllib2.OpenerDirector的实例,我们之前一直在使用urlopen,它是一个特殊的opener(也就是我们构建好的)。

    但是urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高级功能。所有要支持这些功能:

    1.使用相关的Handler处理器来创建特定功能的处理器对象;

    2.然后通过urllib2.build_opener()方法使用这些处理器对象,创建自定义opener对象;

    3.使用自定义的opener对象,调用open()方法发送请求。

    如果程序里所有的请求都使用自定义的opener,可以使用urllib2.install_open()将自定义的opener对象定义为全局opener,表示如果之后凡是调用urlopen,都将使用这个opener(根据自己的需求来选择)。

    简单的自定义opener()

    # _*_ coding:utf-8 _*_
    import urllib2
    # 构建一个HTTPHandler处理器对象,支持处理HTTP的请求
    http_handler = urllib2.HTTPHandler()
    # 调用build_opener()方法构建一个自定义的opener对象,参数是构建的处理器对象
    opener = urllib2.build_opener(http_handler)
    request = urllib2.Request('http://www.baidu.com/s')
    # 调用自定义opener对象的open()方法,发送request请求
    response = opener.open(request) 
    print response.read()

    debug log模式

    可以在HTTPHandler里面加参数(debuglevel=1)打开。

    # _*_ coding:utf-8 _*_
    import urllib2
    # 构建一个HTTPHandler处理器对象,支持处理HTTP的请求
    # http_handler = urllib2.HTTPHandler()
    # 主要用于调试用
    http_handler = urllib2.HTTPHandler(debuglevel=1)
    # 调用build_opener()方法构建一个自定义的opener对象,参数是构建的处理器对象
    opener = urllib2.build_opener(http_handler)
    request = urllib2.Request('http://www.baidu.com/s')
    response = opener.open(request)
    # print response.read()

    相关推荐:《Python视频教程》

    ProxyHandler处理器(代理设置)

    使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的。

    很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。

    所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。

    urllib2中通过ProxyHandler来设置使用代理服务器,使用自定义opener来使用代理:

    免费代理网站:http://www.xicidaili.com/;https://www.kuaidaili.com/free/inha/

    # _*_ coding:utf-8 _*_
    import urllib2
    # 构建一个Handler处理器对象,参数是一个字典类型,包括代理类型和代理服务器IP+Port
    httpproxy_handler = urllib2.ProxyHandler({'http':'118.114.77.47:8080'})
    #使用代理
    opener = urllib2.build_opener(httpproxy_handler)
    request = urllib2.Request('http://www.baidu.com/s')
    #1 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。
    response = opener.open(request)
    #12如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。
    #urllib2.install_opener(opener)
    #response = urllib2.urlopen(request)
    print response.read()

    但是,这些免费开放代理一般会有很多人都在使用,而且代理有寿命短,速度慢,匿名度不高,HTTP/HTTPS支持不稳定等缺点(免费没好货),所以,专业爬虫工程师会使用高品质的私密代理。

     私密代理

    (代理服务器都有用户名和密码)必须先授权才能用。

    # _*_ coding:utf-8 _*_
    import urllib2
    #必须输入用户名密码,ip和port
    authproxy_handler = urllib2.ProxyHandler({'http':'username:pwd@ip:port})
    opener = urllib2.build_opener(authproxy_handler)
    request = urllib2.Request('http://www.baidu.com/s')
    response = opener.open(request)
    print response.read()

    为了安全一般把私密代理ip用户名密码保存到系统环境变量里面,再读出来。

    # _*_ coding:utf-8 _*_
    import urllib2
    import os 
    # 从环境变量里面取到用户名和密码
    proxyuser = os.environ.get('proxuser')   
    proxypasswd = os.environ.get('proxpasswd')
    #必须输入用户名密码,ip和port
    authproxy_handler = urllib2.ProxyHandler({'http':proxyuser+':'+proxypasswd+'@ip:port'})
    opener = urllib2.build_opener(authproxy_handler)
    request = urllib2.Request('http://www.baidu.com/s')
    response = opener.open(request)
    print response.read()

    起源地下载网 » Python爬虫中的Handler和Opener是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元