程序中的代理:
在浏览器地址栏直接输入 ip 可以查询本机的 ip
先介绍两个代理网站:
打开网站我们可以看到有收费的也有免费的,大家肯定能想到,免费的极其不稳定,经常失效,速度慢,但是,收费的也会失效,总之都不太稳定。
代理还分为
urlopen
靠handler处理器和自己的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可能产生的原因:
HTTPError是URLError的子类,在利用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 类的错误 抛出错误如下
#
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,人人网模拟登录 就有实例啦
我又来要赞了,如觉得讲的还算详细,能学到点东西的话,点个赞再走吧
欢迎各位大佬评论区留言指正问题