Python爬虫实战:使用代理(urllib模块)

时间:2024-03-24 07:24:09

1. 前言

第二个方案是使用代理,代理就是“嘿,哥哥,弟弟我访问这个网址有点困难,帮忙解决一下呗”。
然后将 需要访问的网址告诉代理,代理替你访问,然后把看到的内容都转发给你,这就是代理的工作。因此服务器看到的是代理的IP地址,而不是你的IP地址

2. 使用代理

使用代理的步骤
(1)proxy_support = urllib.request.ProxyHandler({})
参数是一个字典,字典的键时代理的类型,例如 http,ftp或https,字典的值就是代理的IP地址和对应的端口号
例如:

proxy = '58.240.53.196:8080'
proxy_support = urllib.request.ProxyHandler({'http':'http://'+proxy,
                                             'https':'https://'+proxy})

注意
这里代理前需要加上协议,即http或者https,当请求链接是http协议时,ProxyHandler会调用http代理,当请求链接是https协议时,会调用https代理

(2)opener = urllib.request.build_opener(proxy_support)

什么是opener?
opener 可以看做是一个私人订制,但是这个opener是可以定制的,例如,给它定制特殊的headers,或者给它定制指定的代理IP
这里可以使用build_opener()函数创建一个属于我们自己私人定制的opener
这样就相当于此opener已经设置好代理了,接下来可以直接调用opener对象的open() 方法,即可访问我们所想要的链接

此处不能使用urlopen()函数打开网页,需要使用open()函数打开网页才可

(3)urllib.request.install_opener(opener)
这里是将定制好的opener安装到系统中,是一个一劳永逸的做法
因为在此之后,你只要使用普通的urlopen()函数,就是以定制好的opener进行工作
当然如果你不想替换掉默认的opener,你也可以在每次特殊需要的时候,用opener.open()的方法来打开网页

3. 示例

  1. 简单示例
import urllib.request

url = 'http://ip.tool.chinaz.com/'

headers = {
    'Host': "ip.tool.chinaz.com",
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}

proxy_support = urllib.request.ProxyHandler({'http':'58.240.53.196:8080',
                                             'https':'58.240.53.196:8080'})
# 接着创建一个包含代理IP的opener
opener = urllib.request.build_opener(proxy_support)

# 查看IP地址是否改变
response = opener.open(url)
html = response.read().decode('utf-8')
print(html)

Python爬虫实战:使用代理(urllib模块)
使用urllib.request.install_opener(opener)将定制好的opener安装到系统中,是一个一劳永逸的做法

import urllib.request

url = 'http://ip.tool.chinaz.com/'

headers = {
    'Host': "ip.tool.chinaz.com",
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
proxy = '58.240.53.196:8080'
proxy_support = urllib.request.ProxyHandler({'http':'http://'+proxy,
                                             'https':'https://'+proxy})
# 接着创建一个包含代理IP的openert
opener = urllib.request.build_opener(proxy_support)
# 安装进默认的环境
urllib.request.install_opener(opener)
# 查看IP地址是否改变
# response = opener.open(url)
response  = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
  1. 通过设置一个inlist,多填写几个IP进去,每次随机使用一个IP来访问
import urllib.request
import random

url = 'http://ip.tool.chinaz.com/'

headers = {
    'Host': "ip.tool.chinaz.com",
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
# 添加多个代理IP,多个IP地址之间使用英文的分号隔开
inlist = input("please enter: ").split(sep=';')
while True:
    proxy = random.choice(inlist)
    proxy_support = urllib.request.ProxyHandler({'http':'http://'+proxy,
                                                 'https':'https://'+proxy})
    # 接着创建一个包含代理IP的openert
    opener = urllib.request.build_opener(proxy_support)

    try:
        print("正在尝试使用%s 访问...." % proxy)
        # 查看IP地址是否改变
        response = opener.open(url,None,headers)
        html = response.read().decode('utf-8')
        print(html)
    except urllib.error.URLError:
        print("error!")
    else:
        print("success")
    if input("Y/N") == 'N':
        break
  1. 遇到需要认证的代理
proxy = 'username:[email protected]:8080'

这里只需要改变proxy变量,只需要加入代理认证的用户名密码即可。