urllib 异常、cookie、handler及代理(四)

目录

一、urllib异常

[二、urllib cookie登录](#二、urllib cookie登录)

[三、urllib handler 处理器的基本使用](#三、urllib handler 处理器的基本使用)

[四、urllib 代理和代理池](#四、urllib 代理和代理池)

参考


一、urllib异常

URLError/HTTPError

简介:

1.HTTPError类是URLError类的子类

2.导入的包urllib.error.HTTPError urllib.error.URLError

3.http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出了问题。

4.通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加健壮,可以通过try-except进行捕捉异常,异常有两类URLError和HTTPError

完整代码:

python 复制代码
# 异常
# URLError/HTTPError

from urllib.error import URLError
from  urllib.error import HTTPError
import urllib.request

# 正确url
# url = 'https://blog.csdn.net/m0_45447650/article/details/1342414341'

# 地址错误
url = 'https://blog.csdn.net/m0_45447650/article/details/1342414341'
# 主机名错误
# url = 'https://blob.csdn.net/m0_45447650'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}
try:
    # 请求对象定制
    request = urllib.request.Request(url, headers = headers)
    # 获取网页源码
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    print(content)
except HTTPError:
    print('url地址写错了')
except URLError:
    print('url主机名错了')

二、urllib cookie登录

微博的cookie登录

应用场景: 数据采集时,绕开登录,进入到某个页面

完整代码:

python 复制代码
# 微博的cookie登录
# 应用场景: 数据采集时,绕开登录,进入到某个页面

# 个人信息界面是utf-8,但还是报编码错误,因为并没有进入到个人信息页面,而是跳转到登录页面,登录页面不是utf-8,所以报错。
# 什么情况下访问不成功,请求头的信息不够才会访问不成功
# refere :防盗链,判断当前路径是不是由上一个路径进来的,一般情况下是做图片的防盗链
import urllib.request
url = 'https://weibo.com/你的微博主页'
headers = {
        "User-Agent": "主页的UA",
        'Cookie':'主页的CK',
        'Referer':'https://weibo.com/'
}
request = urllib.request.Request(url, headers = headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
with open ('weibo.html', 'w',encoding='utf-8') as file:
    file.write(content)

三、urllib handler 处理器的基本使用

为什么要学handler?

urllib.request.urlopen(url)

不能定制请求头

urllib.request.Request(url,header,data)

可以定制请求头

handler

定制更高级的请求头(随着业务逻辑的复杂,请求对象的定制已经满足不了我们的需求(动态cookie和代理不能使用请求对象的定制))
使用handler三步:

1.获取handler对象

2.获取opener对象

3.调用open方法

完整代码:

python 复制代码
# 使用handler访问百度,获取网页源码

import urllib.request
url = 'http://www.baidu.com'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}

# 请求对象定制
request = urllib.request.Request(url, headers=headers)

# handler build_opener open
# 1.获取handler对象
handler = urllib.request.HTTPHandler()
# 2.获取opener对象
opener = urllib.request.build_opener(handler)
# 3.调用open方法
response = opener.open(request)

content = response.read().decode('utf-8')
print(content)

四、urllib 代理和代理池

1.代理的常用功能?

(1).突破自身IP访问限制,访问国外站点

(2).访问一些单位或团体内部资源

扩展:某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理股务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共亨等服务,

(3).提高访问速度

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

(4).隐感真实IP

扩展:上网者也可以通过这种方法隐藏自己的IP,免受攻击

2.代码配置代理

创建Reuqest对象

创建ProxyHandler对象

用handler对象创建opener对象

使用opener.open函数发送请求

使用handler模拟客户端向服务器发送请求

python 复制代码
# handler build_opener open
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)

设置一个简单的代理池

python 复制代码
# 代理池
proxies_pool= [
    # 'key':'主机'+'端口号'
    {'http':'61.216.185.88:60808'},
    {'http':'182.140.244.163:8118'}
]
import random
proxies = random.choice((proxies_pool))

完整代码

python 复制代码
import urllib.request
url = 'https://www.baidu.com/s?wd=ip'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}

# 请求对象定制
request = urllib.request.Request(url, headers=headers)
# response = urllib.request.urlopen(request)

# 获取免费快代理 https://www.kuaidaili.com/free/
# 代理 ip 以字典的方式存在
proxies = {
    # 'key':'主机'+'端口号'
    'http':'61.216.185.88:60808'
}

"""
# 代理池
proxies_pool= [
    # 'key':'主机'+'端口号'
    {'http':'61.216.185.88:60808'},
    {'http':'182.140.244.163:8118'}
]
import random
proxies = random.choice((proxies_pool))
"""

# handler build_opener open
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)

content = response.read().decode('utf-8')
print(content)
# with open ('weibo.html', 'w',encoding='utf-8') as file:
#     file.write(content)

参考

尚硅谷Python爬虫教程小白零基础速通(含python基础+爬虫案例)

相关推荐
AI原吾5 分钟前
掌握Python-uinput:打造你的输入设备控制大师
开发语言·python·apython-uinput
毕设木哥7 分钟前
25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】
开发语言·python·计算机·django·毕业设计·课程设计·毕设
weixin_455446178 分钟前
Python学习的主要知识框架
开发语言·python·学习
D11_38 分钟前
Pandas缺失值处理
python·机器学习·数据分析·numpy·pandas
花生了什么树~.1 小时前
python基础知识(四)--if语句,for\while循环
python
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
luthane3 小时前
python 实现average mean平均数算法
开发语言·python·算法
码农研究僧3 小时前
Flask 实现用户登录功能的完整示例:前端与后端整合(附Demo)
python·flask·用户登录
Ylucius3 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
凡人的AI工具箱3 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python