美文网首页
Python_爬虫_07 urllib 高级用法2-代理设置

Python_爬虫_07 urllib 高级用法2-代理设置

作者: 暴走的金坤酸奶味 | 来源:发表于2018-12-23 18:09 被阅读0次

    urllib 代理设置

    我们在做爬虫的过程中经常会遇到这样的情况,最初爬虫正常运行,正常抓取数据,一切看起来都是那么美好,然而一杯茶的功夫可能就会出现错误,比如403 Forbidden,这时候打开网页一看,可能会看到“您的IP访问频率太高”这样的提示。出现这种现象的原因是网站采取了一些反爬虫措施。比如,服务器会检测某个IP在单位时间内的请求次数,如果超过了这个阈值,就会直接拒绝服务,返回一些错误信息,这种情况可以称为封IP。

    既然服务器检测的是某个IP单位时间的请求次数,那么借助某种方式来伪装我们的IP,让服务器识别不出是由我们本机发起的请求,不就可以成功防止封IP了吗?

    一种有效的方式就是使用代理,后面会详细说明代理的用法。在这之前,需要先了解下代理的基本原理,它是怎样实现IP伪装的呢?

    基本原理: 代理实际上指的就是代理服务器,英文叫作proxy server,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站。在我们正常请求一个网站时,其实是发送了请求给Web服务器,Web服务器把响应传回给我们。如果设置了代理服务器,实际上就是在本机和服务器之间搭建了一个桥,此时本机不是直接向Web服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给Web服务器,接着由代理服务器再把Web服务器返回的响应转发给本机。这样我们同样可以正常访问网页,但这个过程中Web服务器识别出的真实IP就不再是我们本机的IP了,就成功实现了IP伪装,这就是代理的基本原理
    代理的作用:

    1. 突破自身IP访问限制,访问一些平时不能访问的站点。

    2. 访问一些单位或团体内部资源:比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。

    1. 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。

    2. 隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。

    使用代理IP,这是爬虫/反爬虫的第二大招,对于爬虫来说,由于爬虫爬取速度过快,在爬取过程中可能遇到同一个IP访问过于频繁的问题,此时网站就会让我们输入验证码登录或者直接封锁IP,这样会给爬取带来极大的不便。通常这种反爬虫手段也是最好用的。

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

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

    常见的代理分类:

    1.根据协议划分:

    FTP代理服务器:主要用于访问FTP服务器,一般有上传、下载的功能以及缓存的功能,端口号一般为21,2121等。

    HTTP代理服务器:主要用于访问网页,一般有内容过滤和缓存的功能,端口号一般为80、8080、3128等

    SSL/TLS代理:主要能用于访问加密的网站,一般有SSL或者TLS加密功能

    SOCKS代理:只是单纯的用于传输数据包,不关心具体的协议用法,速度快、有缓存功能,端口号一般为1080

    2.根据匿名内容划分:

    高度匿名代理:会将数据包原封不动的转发,在服务器看来就好像真的是一个普通的用户短在访问,而记录的IP就是代理服务器的IP

    普通匿名代理:会在数据包上做一些改动,服务端上有可能发现这个是代理服务器,也有一定的几率追查到客户端的真实IP.

    透明代理:不但改动了数据包,还会告诉服务器客户端的真实IP,这种代理除了用缓存技术提高浏览器速度。能用内容过滤提高安全性之外,并没有其他作用。

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

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

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

    ProxyHandler处理器用来设置代理

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

    from urllib import request,error
    
    #构建支持代理的handler
    proxy = {
        'http':'61.138.33.20:808',
        'https':'120.69.82.110:44693',
    }
    proxy_handler = request.ProxyHandler(
        proxies=proxy
    )
    
    # 构建一个私密代理Handler,需要加上私密代理账户的用户名和密码
    # authproxy = {
    #    "http" :"username:password@61.135.217.7:80"
    #}
    # authproxy_handler=urllib.request.ProxyHandler(
    #    proxies=authproxy
    #)
    
    #根据proxy_handler实例化一个opener对象
    opener = request.build_opener(proxy_handler)
    
    url = 'http://www.baidu.com/'
    
    # 使用https://httpbin.org/get接口验证使用了代理
    # url = 'https://httpbin.org/get'
    
    try:
        response = opener.open(url,timeout=5)
        print(response.status)
    except error.HTTPError as err:
        print(err.reason)
    except error.URLError as err:
        print(err.reason)
    
    # 1. 如果按照上面代码,只有使用opener.open()方法发送
    请求才使用自定义的代理,而urlopen()则不使用自定义代理。
    response = opener.open(request)
    
    # 2. 将自定义的opener设置为全局的opener,之后所有的,不管是
    opener.open()还是urlopen() 发送请求,都将使用自定义代理。
    # request.install_opener(opener)
    # response = urlopen(request)
    

    相关文章

      网友评论

          本文标题:Python_爬虫_07 urllib 高级用法2-代理设置

          本文链接:https://www.haomeiwen.com/subject/uzinkqtx.html