网络爬虫01: Urllib2库使用代理IP

    今天将时间几乎花在了爬虫的Handler处理器和代理设置上,听说如今的反爬虫机制会发现爬虫程序,而后封掉爬虫程序请求的IP地址。这就糟糕了,因此仍是要好好学习一下IP的代理设置,学完以后就可使用代理来访问目标网址,能够避免封掉我IP了。还真是问题不愁找不到解决的人啊,我给你们推荐一些免费短时间的代理网址:python

    先写一个基本的HTTPHandler处理器,这是没有使用代理的状况,是使用真实IP访问的post

#!/usr/bin/env python
# coding=utf-8

import urllib2

# 构建一个HTTPHandler处理器对象,支持处理HTTP的请求
#http_handler = urllib2.HTTPHandler()

# 在HTTPHandler增长参数"debuglevel=1"将会自动自动打开Debug log模式
# 程序在打印的时候就会显示此时接收和发送包的信息

http_handler = urllib2.HTTPHandler(debuglevel=1)

# 调用build_opener()方法构建一个自定义的opener对象,参数是构建的处理器对象
opener = urllib2.build_opener(http_handler)

request = urllib2.Request("http://www.baidu.com/")

# 主要是将urllib2.urlopen改为了自定义的opener对象,使用方法open
response = opener.open(request)

print response.read()

    这段代码中,须要总结的就是真实IP访问建立的是HTTPHandler,使用的方法也是urllib2的HTTPHandler方法,这个方法能够跟一个参数,debuglevel=1,功能是网络调试,它会返回在屏幕上接收和发送包的信息。建立好一个处理器对象后,就不能使用urllib2.urlopen方法打开一个网址了,而是要自定义一个opener,用opener.open来访问目标网址。建立方法是使用urllib2包下的build_opener来建立一个opener对象,参数是以前建立好的处理器对象,也就是http_handler,而后就可使用opener.open来请求了学习

    若是是想使用代理IP的话,建立处理器的方法就不是urllib2.HTTPHandler了,而是经过urllib2.ProxyHandler来建立一个IP代理处理器对象,代码以下:测试

#!/usr/bin/env python
# coding=utf-8

import urllib2
import random

# 启用代理开关,可判断后面是否须要使用代理
proxyswitch = True

# 建立一个代理处理器对象,参数是一个字典类型,包含了代理类型和代理服务器IP+端口号
httpproxy_handler = urllib2.ProxyHandler({"http": "119.188.162.165:8081"})

# 建立一个没有代理的处理器对象,注意没有代理不表明没有参数,而要填写一个{}
nullproxy_handler = urllib2.ProxyHandler({})

if proxyswitch:
    opener = urllib2.build_opener(httpproxy_handler)

else:
    opener = urllib2.build_opener(nullproxy_handler)

# 建立了一个全局的opener,以后均可以使用urlopen()方式去发送,也附带Handler的功能
urllib2.install_opener(opener)

request = urllib2.Request("http://www.baidu.com/")

response = urllib2.urlopen(request)

print response.read()

    与第一个不是代理访问的区别是,ProxyHTTPHandler必须加上IP和端口,参数是一个字典形式,以http做键,IP:端口为键值,如 {"http": "119.188.162.165:8081"},并且要注意的是,若是在ProxyHTTPHandler处理器方法下不想使用代理IP也要必须加上{},也就是说这个参数必须带,能够为空。另外以前没有使用建立处理器时是可使用urllib2.urlopen方法打开网址的,可是使用了处理器就没法直接使用该方法,须要作的步骤就是在代码层面上装一个opener,这个能够用urllib.install_opener实现,参数就是建立好的opener,且无返回值ui

    固然了,若是本身测试过的可用代理IP够多的话,也能够像随机得到User-Agent同样,能够随机选择一个IP访问,这样就更不容易被发现这是一个爬虫程序了,能够假装的更好url

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)

    固然还有一种代理叫作私密代理,免费的代理由于使用的人多,不是很稳定,极可能上一秒还在正常访问,下一秒就出现了没法访问的故障。因此又出现了一种叫作私密代理的代理,这种代理须要用户名和密码,具体代码实现以下:debug

#!/usr/bin/env python
# coding=utf-8

import urllib2

authproxy_handler = urllib2.ProxyHandler({"host": "用户名:密码@IP:端口"})

opener = urllib2.build_opener(authproxy_handler)

request = urllib2.Request("http://www.baidu.com/")
response = opener.open(request)

print response.read()
相关文章
相关标签/搜索