Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)


Posted in Python onSeptember 21, 2016

我们可以利用urllib来抓取远程的数据进行保存哦,以下是python3 抓取网页资源的多种方法,有需要的可以参考借鉴。

1、最简单

import urllib.request
response = urllib.request.urlopen('http://python.org/')
html = response.read()

2、使用 Request

import urllib.request
req = urllib.request.Request('http://python.org/')
response = urllib.request.urlopen(req)
the_page = response.read()

3、发送数据

#! /usr/bin/env python3
import urllib.parse
import urllib.request
url = 'http://localhost/login.php'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {
'act' : 'login',
'login[email]' : 'yzhang@i9i8.com',
'login[password]' : '123456'
}
data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data)
req.add_header('Referer', 'http://www.python.org/')
response = urllib.request.urlopen(req)
the_page = response.read()
print(the_page.decode("utf8"))

4、发送数据和header

#! /usr/bin/env python3
import urllib.parse
import urllib.request
url = 'http://localhost/login.php'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {
'act' : 'login',
'login[email]' : 'yzhang@i9i8.com',
'login[password]' : '123456'
}
headers = { 'User-Agent' : user_agent }
data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data, headers)
response = urllib.request.urlopen(req)
the_page = response.read()
print(the_page.decode("utf8"))

5、http 错误

#! /usr/bin/env python3
import urllib.request
req = urllib.request.Request('https://3water.com ')
try:
urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
print(e.code)
print(e.read().decode("utf8"))

6、异常处理1

#! /usr/bin/env python3
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request("https://3water.com /")
try:
response = urlopen(req)
except HTTPError as e:
print('The server couldn't fulfill the request.')
print('Error code: ', e.code)
except URLError as e:
print('We failed to reach a server.')
print('Reason: ', e.reason)
else:
print("good!")
print(response.read().decode("utf8"))

7、异常处理2

#! /usr/bin/env python3
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request("https://3water.com /")
try:
response = urlopen(req)
except URLError as e:
if hasattr(e, 'reason'):
print('We failed to reach a server.')
print('Reason: ', e.reason)
elif hasattr(e, 'code'):
print('The server couldn't fulfill the request.')
print('Error code: ', e.code)
else:
print("good!")
print(response.read().decode("utf8"))

8、HTTP 认证

#! /usr/bin/env python3
import urllib.request
# create a password manager
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
# Add the username and password.
# If we knew the realm, we could use it instead of None.
top_level_url = "https://3water.com /"
password_mgr.add_password(None, top_level_url, 'rekfan', 'xxxxxx')
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
# create "opener" (OpenerDirector instance)
opener = urllib.request.build_opener(handler)
# use the opener to fetch a URL
a_url = "https://3water.com /"
x = opener.open(a_url)
print(x.read())
# Install the opener.
# Now all calls to urllib.request.urlopen use our opener.
urllib.request.install_opener(opener)
a = urllib.request.urlopen(a_url).read().decode('utf8')
print(a)

9、使用代理

#! /usr/bin/env python3
import urllib.request
proxy_support = urllib.request.ProxyHandler({'sock5': 'localhost:1080'})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)

a = urllib.request.urlopen("https://3water.com ").read().decode("utf8")
print(a)

10、超时

#! /usr/bin/env python3
import socket
import urllib.request
# timeout in seconds
timeout = 2
socket.setdefaulttimeout(timeout)
# this call to urllib.request.urlopen now uses the default timeout
# we have set in the socket module
req = urllib.request.Request('https://3water.com /')
a = urllib.request.urlopen(req).read()
print(a)

总结

以上就是这篇文章的全部内容,希望本文的内容对大家学习或使用python能有所帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python读取Android permission文件
Nov 01 Python
Python获取DLL和EXE文件版本号的方法
Mar 10 Python
Python语法快速入门指南
Oct 12 Python
pandas 数据实现行间计算的方法
Jun 08 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
Python面向对象原理与基础语法详解
Jan 02 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
Django视图类型总结
Feb 17 Python
python基础详解之if循环语句
Apr 24 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 #Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 #Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 #Python
Python 爬虫学习笔记之正则表达式
Sep 21 #Python
Python简单实现安全开关文件的两种方式
Sep 19 #Python
Python打包可执行文件的方法详解
Sep 19 #Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 #Python
You might like
怎样在php中使用PDF文档功能
2006/10/09 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
layui table 参数设置方法
2018/08/14 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python web基础之加载静态文件实例
2018/03/20 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
如何保障Web服务器安全
2014/05/05 面试题
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
软件测试面试题
2014/01/05 面试题
元旦晚会邀请函
2014/02/01 职场文书
教师自我鉴定范文
2014/03/20 职场文书
大学毕业生推荐信
2014/07/09 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技