立即注册

编程论坛

广告联系qq1031180668广告位
查看: 540|回复: 1

[python] ProxyHandler处理器(代理设置)

[复制链接]
  • ta_mind
    擦汗
    2019-3-27 07:25
  • classn_01: 72 classn_02

    [LV.6]常住居民II

    1021

    主题

    1742

    帖子

    3558

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3558

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-7-23 03:08:55 | 显示全部楼层 |阅读模式
    使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的。
    很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。
    所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
    urllib2中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:
    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    import  urllib.request
    #构建一个HTTPHandlerr处理器对象,支持处理Http请求
    http_handler=urllib.request.HTTPHandler(debuglevel=1)
    
    #构建一个HTTPHandler处理器,支持处理HTTPS请求
    #http_hander=urllib.request.HTTPSHandler()
    #构建一个ProxyHandler对象,用来设置代理ip
    proxy_handler=urllib.request.ProxyHandler({"http":"49.51.195.24:1080"})
    
    #调用urllib.request.build_opener()方法,创建处理HTTP请求的opener对象
    opener=urllib.request.build_opener(http_handler,proxy_handler)
    
    #构建Request请求
    headers={
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
    
    }
    req=urllib.request.Request("http://www.baidu.com",headers=headers)
    #调用自定义opener对象的open()方法,发送request请求
    response=opener.open(req)
    #获取服务器响应内容
    print(response.read().decode("utf-8"))

    免费的开放代理获取基本没有成本,我们可以在一些代理网站上收集这些免费代理,测试后如果可以用,就把它收集起来用在爬虫上面。
    免费短期代理网站:西刺免费代理快代理,更多的可以自行百度去搜索一些免费代理网站。
    如果代理IP足够多,就可以像随机获取User-Agent一样,随机选择一个代理去访问网站。
    示例:
    [Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    import  urllib.request
    import  random
    #构建一个HTTPHandlerr处理器对象,支持处理Http请求
    http_handler=urllib.request.HTTPHandler(debuglevel=1)
    
    #构建一个HTTPHandler处理器,支持处理HTTPS请求
    #http_hander=urllib.request.HTTPSHandler()
    
    
    proxy_list=[
        {"http":"xxx.xx.xx.xx:xx"},
        {"http":"xxx.xx.xx.xx:xx"},
        {"http":"xxx.xx.xx.xx:xx"},
        {"http":"xxx.xx.xx.xx:xx"},
        {"http":"xxx.xx.xx.xx:xx"}
        
    ]
    #随机选择一个ip
    ip=random.choice(proxy_list)
    #构建一个ProxyHandler对象,用来设置代理ip
    proxy_handler=urllib.request.ProxyHandler(ip)
    
    #调用urllib.request.build_opener()方法,创建处理HTTP请求的opener对象
    opener=urllib.request.build_opener(http_handler,proxy_handler)
    
    #构建Request请求
    headers={
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
    
    }
    req=urllib.request.Request("http://www.baidu.com",headers=headers)
    #调用自定义opener对象的open()方法,发送request请求
    response=opener.open(req)
    #获取服务器响应内容
    print(response.read().decode("utf-8"))


    但是,大多数的免费开放代理都会有很多人使用,并且代理有寿命短,速度慢,匿名度不高,HTTP/HTTPS支持不稳定等缺点(免费没好货)。
    所以,专业爬虫工程师或爬虫公司会使用高品质的私密代理,这些代理通常需要找专门的代理供应商购买,再通过用户名/密码授权使用(舍不得孩子套不到狼)

    不积跬步,无以至千里

    classn_11

    0

    主题

    42

    帖子

    88

    积分

    注册会员

    Rank: 2

    积分
    88
    发表于 2018-8-13 14:44:04 | 显示全部楼层
    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    手机版|Archiver|小黑屋|sitemap| 从零开始,编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2019-7-21 18:43 , Processed in 1.110542 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表