zoukankan      html  css  js  c++  java
  • python 代理

    ProxyHandler处理器(代理设置)

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

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

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

    urllib2中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:

    #urllib2_proxy1.py
    
    import urllib2
    
    # 构建了两个代理Handler,一个有代理IP,一个没有代理IP
    httpproxy_handler = urllib2.ProxyHandler({"http" : "124.88.67.81:80"})
    nullproxy_handler = urllib2.ProxyHandler({})
    
    proxySwitch = True #定义一个代理开关
    
    # 通过 urllib2.build_opener()方法使用这些代理Handler对象,创建自定义opener对象
    # 根据代理开关是否打开,使用不同的代理模式
    if proxySwitch:  
        opener = urllib2.build_opener(httpproxy_handler)
    else:
        opener = urllib2.build_opener(nullproxy_handler)
    
    request = urllib2.Request("http://www.baidu.com/")
    
    # 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。
    response = opener.open(request)
    
    # 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。
    # urllib2.install_opener(opener)
    # response = urlopen(request)
    
    print response.read()
    

      

    如果代理IP足够多,就可以像随机获取User-Agent一样,随机选择一个代理去访问网站。

    import urllib2
    import random
    
    proxy_list = [
        {"http" : "124.88.67.81:80"},
        {"http" : "124.88.67.81:80"},
        {"http" : "124.88.67.81:80"},
        {"http" : "124.88.67.81:80"},
        {"http" : "124.88.67.81:80"}
    ]
    
    # 随机选择一个代理
    proxy = random.choice(proxy_list)
    # 使用选择的代理构建代理处理器对象
    httpproxy_handler = urllib2.ProxyHandler(proxy)
    
    opener = urllib2.build_opener(httpproxy_handler)
    
    request = urllib2.Request("http://www.baidu.com/")
    response = opener.open(request)
    print response.read()
    

      ProxyBasicAuthHandler(代理授权验证)

    如果我们使用之前的代码来使用私密代理,会报 HTTP 407 错误,表示代理没有通过身份验证:

    urllib2.HTTPError: HTTP Error 407: Proxy Authentication Required

    所以我们需要改写代码,通过:

    • HTTPPasswordMgrWithDefaultRealm():来保存私密代理的用户密码
    • ProxyBasicAuthHandler():来处理代理的身份验证。
    #urllib2_proxy2.py
    
    import urllib2
    import urllib
    
    # 私密代理授权的账户
    user = "mr_mao_hacker"
    # 私密代理授权的密码
    passwd = "sffqry9r"
    # 私密代理 IP
    proxyserver = "61.158.163.130:16816"
    
    # 1. 构建一个密码管理对象,用来保存需要处理的用户名和密码
    passwdmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    
    # 2. 添加账户信息,第一个参数realm是与远程服务器相关的域信息,一般没人管它都是写None,后面三个参数分别是 代理服务器、用户名、密码
    passwdmgr.add_password(None, proxyserver, user, passwd)
    
    # 3. 构建一个代理基础用户名/密码验证的ProxyBasicAuthHandler处理器对象,参数是创建的密码管理对象
    #   注意,这里不再使用普通ProxyHandler类了
    proxyauth_handler = urllib2.ProxyBasicAuthHandler(passwdmgr)
    
    # 4. 通过 build_opener()方法使用这些代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler 和 proxyauth_handler
    opener = urllib2.build_opener(proxyauth_handler)
    
    # 5. 构造Request 请求
    request = urllib2.Request("http://www.baidu.com/")
    
    # 6. 使用自定义opener发送请求
    response = opener.open(request)
    
    # 7. 打印响应内容
    print response.read()
    

      

    如果我们有客户端的用户名和密码,我们可以通过下面的方法去访问爬取:

    import urllib
    import urllib2
    
    # 用户名
    user = "test"
    # 密码
    passwd = "123456"
    # Web服务器 IP
    webserver = "http://192.168.199.107"
    
    # 1. 构建一个密码管理对象,用来保存需要处理的用户名和密码
    passwdmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    
    # 2. 添加账户信息,第一个参数realm是与远程服务器相关的域信息,一般没人管它都是写None,后面三个参数分别是 Web服务器、用户名、密码
    passwdmgr.add_password(None, webserver, user, passwd)
    
    # 3. 构建一个HTTP基础用户名/密码验证的HTTPBasicAuthHandler处理器对象,参数是创建的密码管理对象
    httpauth_handler = urllib2.HTTPBasicAuthHandler(passwdmgr)
    
    # 4. 通过 build_opener()方法使用这些代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler
    opener = urllib2.build_opener(httpauth_handler)
    
    # 5. 可以选择通过install_opener()方法定义opener为全局opener
    urllib2.install_opener(opener)
    
    # 6. 构建 Request对象
    request = urllib2.Request("http://192.168.199.107")
    
    # 7. 定义opener为全局opener后,可直接使用urlopen()发送请求
    response = urllib2.urlopen(request)
    
    # 8. 打印响应内容
    print response.read()
    

      

  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/alamZ/p/7406759.html
Copyright © 2011-2022 走看看