每天30分钟 一起来学习爬虫——day5(urllib库——设置代理 and URLError)

代理

什么是代理:

程序中的代理:

  1. 正向代理:代替客户端发送请求的代理
  2. 反向代理:代理服务端提供数据

在浏览器地址栏直接输入 ip 可以查询本机的 ip

先介绍两个代理网站:

打开网站我们可以看到有收费的也有免费的,大家肯定能想到,免费的极其不稳定,经常失效,速度慢,但是,收费的也会失效,总之都不太稳定。
代理还分为

  1. 透明:服务器知道你的真实ip,知道你使用了代理
  2. 匿名:对方不知道你的真实ip,但知道你使用了代理
  3. 高匿:对方不知道你的真实ip,也不知道你使用了代理

配置代理:

  1. 浏览器配置:浏览器设置–>高级设置–>代理设置–>输入 ip 和 端口号
    这个时候可以再次查询本机的 ip 看看
  2. 代码配置
    我们先来说一下 handler处理器,系统的urlopenhandler处理器和自己的oppener请求数据,但它里面写的是
https_handler = HTTPSHandler(context=context)
        opener = build_opener(https_handler)

这个我们可以自己打开这个库就可以看到,我们也可以用HTTPHandler 创建自己的处理器

import urllib.parse
import urllib.request

url = 'https://www.baidu.com/s?ie=UTF-8&wd=ip'

# 创建 自己的handler处理器
handler = urllib.request.HTTPHandler()
# 创建 自己的opener
opener = urllib.request.build_opener(handler)
# 用自己创建的openner来请求
response= opener.open(url) 
print(response.read())

下面我们来看如何设置代理,这个时候,我们用的就不是HTTPHandler 处理器了,而是ProxyHandler

import urllib.parse
import urllib.request
url = 'https://www.baidu.com/s?ie=UTF-8&wd=ip'
# 这个是一次设置一个代理
proxy = {
    # 免费代理写法:
    'http': "http://221.13.156.158:55443"
}
## 创建代理的handler
handler = urllib.request.ProxyHandler(proxy)
## 创建 opener
opener = urllib.request.build_opener(handler)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36',
}

request = urllib.request.Request(url=url, headers=headers)
response= opener.open(request)
# print(response.read())
with open('1.html', 'wb') as f:
    f.write(response.read())

但是一个代码满足不了需求啊,万一失效了咋办,下面我们看多个代理如何呢设置

# 通过代码 配置 IP 代理  这个有个小问题,我用广东的IP  最后  得到的在 安徽  。。。
import urllib.parse
import urllib.request
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36',
}
url = 'https://www.baidu.com/s?ie=UTF-8&wd=ip'

# 设置多个代理:
proxylist = [
    {'http': "175.175.218.219:1133"},# 辽宁抚顺
    {'http': "106.75.1.227:8111"},# 山东济南
    {'http': "122.192.38.47:8118"},#江苏南京
    {'http': "60.216.20.213:8001"},# 山东济南
    {'http': "124.205.155.152:9090"},#北京
]
for ip in proxylist:
    proxy_handler = urllib.request.ProxyHandler(ip)
    opener = urllib.request.build_opener(proxy_handler)
    try :
        request = urllib.request.Request(url=url, headers=headers)
  	    response= opener.open(request)
        print(response.read())

    except Exception as e:
        print(e)

上面几种都是免费的写法,下面看一下付费的
方法一:

username = 'kdjflskdjf'
pwd='lskdjflsf'
proxy='124.205.155.152:9090'
# 创建密码管理器添加用户名和密码:
password_manage = urllib.request.HTTPPasswordMgrWithDefaultRealm()
#password_manage 有方法如下, 参数有 realm(这个和服务器相关), uri(定位,uri>url), user, passwd
password_manage.add_password(None,proxy,username,pwd)
# 创建可验证代理ip的处理器
handler_money = urllib.request.ProxyBasicAuthHandler(password_manage)
# 下一步一样,
openner_money = urllib.request.build_opener(handler_money)
# 发送请求
response = openner_money.open(url)

方法二:

# 用户名:密码@ ip 当然下面这个是随便的ip
proxy = {"http":"username:[email protected]:1133"}
# 创建代理的handler
handler = urllib.request.ProxyHandler(proxy)
# 创建 opener
opener = urllib.request.build_opener(handler)

URLError

URLError可能产生的原因:

  1. 网络无连接,即本机无法上网
  2. 连接不到特定的服务器
  3. 服务器不存在

HTTPErrorURLError的子类,在利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。如果访问的页面出错了,urlopen会产生一个HTTPError,对应相应的状态吗,HTTP状态码表示HTTP协议所返回的响应的状态。一般2开头的比如200 202 201 等都正常,我们常见的就是 404 NOT Find,
一般我们吧可能会出错的放在try - except 中,下面看代码

import urllib.request
import urllib.parse
import urllib.error
'''
url = 'http://www.gouzi.com/'
try:
    response = urllib.request.urlopen(url)
    print(response)
except urllib.error.URLError as e:
    print(e)
# except Exception as e:

'''
# 上面是当 url 错误时,捕获 urllib.error.URLError 类的错误 抛出错误如下
# <urlopen error [Errno 11001] getaddrinfo failed>

url = 'https://blog.csdn.net/weixin_45691686/article/details/104955708'

try:
    response = urllib.request.urlopen(url)
    print(response)
except urllib.error.HTTPError as e:
    print(e)
    print(e.code)
except urllib.error.URLError as e:
    print(e)

注意:同时写 URLError 和 HTTPError 时,HTTPError 写在前

今天没有实例,明天讲解 auth认证和cookie,人人网模拟登录 就有实例啦



我又来要赞了,如觉得讲的还算详细,能学到点东西的话,点个赞再走吧
欢迎各位大佬评论区留言指正问题

发布了50 篇原创文章 · 获赞 50 · 访问量 2711

猜你喜欢

转载自blog.csdn.net/weixin_45691686/article/details/104960725