• 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()
    

      

  • 相关阅读:
    GTP (GPRS隧道协议(GPRSTunnellingProtocol))
    dns (域名系统)
    WSP (无线会话协议)
    http 超文本传输协议
    SSN 社会安全号码
    MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)
    dns
    C/C++中的预编译指令
    strstr 函数用法
    转Hibernate Annotation mappedBy注解理解
  • 原文地址:https://www.cnblogs.com/alamZ/p/7406759.html
Copyright © 2020-2023  润新知