python爬虫之urllib库常用方法用法总结大全


Posted in Python onNovember 14, 2018

Urllib

官方文档地址:https://docs.python.org/3/library/urllib.html

urllib提供了一系列用于操作URL的功能。

本文主要介绍的是关于python urllib库常用方法用法的相关内容,下面话不多说了,来一起看看详细的介绍吧

1、读取cookies

import http.cookiejar as cj,urllib.request as request

cookie = cj.CookieJar()
handler = request.HTTPCookieProcessor(cookie)

opener = request.build_opener(handler)
response = opener.open('http://www.bigdata17.com')

for item in cookie:
 print(item.name + "=" + item.value)

2、将cookies保存在文件中

filename = 'baidu_cookies.txt'
cookies = cj.MozillaCookieJar(filename)
handler = request.HTTPCookieProcessor(cookies)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookies.save(ignore_discard=True,ignore_expires=True)

3、处理异常

URLError和HTTPError类,两个类是父子关系,HTTPError会返回错误代码,两个类都可以处理request模块产生的异常,这两个都有一个reason属性,用于记录出现异常的原因
URLError处理异常:

from urllib import request,error

try:
 response = request.urlopen('http://www.bigdata17.com/index.htm')
except error.URLError as e:
 print(e.reason)

HTTPError处理异常:

这个类是专门处理http请求的异常,http请求会返回一个请求代码,因此HTTPError会有一个code属性。另外HTTP请求会有包含请求头信息,所以HTTPError还包含一个headers属性。HTTPError继承自URLError类,因此也包含有reason属性。

代码:

try:
 response = request.urlopen('http://www.bigdata17.com/index.htm')
except error.HTTPError as e:
 print(e.reason)
 print(e.code)
 print(e.headers)

4、解析链接

urllib库中的parse类提供了很多用于解析链接的方法。

urlparse()方法是专门用于解析链接的,我们先看这个方法的返回值:

from urllib.parse import urlparse
result = urlparse('http://www.bigdata17.com')
print(result)

上面的代码返回的结果:

ParseResult(scheme='http', netloc='www.bigdata17.com', path='', params='', query='', fragment='')

可见urlparse()方法返回的是ParseResult类,这个了有6个属性,分别是scheme、netloc、path、params、query和fragment。其中scheme代表的是协议,有http,https,ftp等协议类型。netloc是网站域名,path是要访问的网页名称。params是代表参数。query查询参数,fragment是锚点。

urlparse()方法是如何将一个链接映射到上面的6个参数中呢?
继续看下一段代码:

from urllib.parse import urlparse
result = urlparse('http://www.bigdata17.com/22.html;user=bigdata17?id=10#content')
print(result)

运行的结果如下:

ParseResult(scheme='http', netloc='www.bigdata17.com', path='/22.html', params='user=bigdata17', query='id=10', fragment='content')

可见从链接开始为://止,是scheme。从://开始到一个/位置,是netloc域名。从/开始到;分号为止是path,访问页面的路径。;开始到?为止是params参数。从?问号开始到#井号结束时query查询参数。最后是fragment锚点参数。

5、urlopen()方法

该方法返回的是HTTPResponse对象:

import urllib.request as request
response = request.urlopen('http://www.bigdata17.com')
print(response)

<http.client.HTTPResponse object at 0x000002A9655BBF28>

HTTPResponse对象有read(),getheaders()等方法。

通过read()方法可以读取网页的信息:

import urllib.request as request
response = request.urlopen('http://www.bigdata17.com')
print(response.read().decode('utf-8'))

使用该方法时要注意网站使用的编码格式,配合decode()方法一起使用,否则会出现乱码。像百度用的是utf-8,网易用的是gbk。

getHeaders()方法返回的是网页的头信息:

import urllib.request as request
response = request.urlopen('http://www.bigdata17.com')
print(response.getheaders())

结果:

[('Server', 'nginx/1.12.2'), ('Date', 'Mon, 12 Nov 2018 15:45:22 GMT'), ('Content-Type', 'text/html'), ('Content-Length', '38274'), ('Last-Modified', 'Thu, 08 Nov 2018 00:35:52 GMT'), ('Connection', 'close'), ('ETag', '"5be384e8-9582"'), ('Accept-Ranges', 'bytes')]

继续看urlopen()方法有哪些参数:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
其中url是必须传递的参数,其他的参数不是必须传递的。data用于将数据传输到我们要爬取的网站上,例如用户名、密码、验证码等。timeout是设置请求超时时间。

data参数的用法:

>>> import urllib.parse as parse
>>> import urllib.request as request
>>> data = bytes(parse.urlencode({'username': 'bigdata17'}), encoding='utf8')
>>> print(data)
b'username=bigdata17'
>>> response = request.urlopen('http://httpbin.org/post', data=data)
>>> print(response.read())
b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "username
": "bigdata17"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n
"Connection": "close", \n "Content-Length": "18", \n "Content-Type": "appl
ication/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent":
 "Python-urllib/3.7"\n }, \n "json": null, \n "origin": "183.134.52.58", \n
"url": "http://httpbin.org/post"\n}\n'

使用data传输数据时,必须将urlencode方法将data的数据转换为bytes类型。

在使用urlopen方法时,如果不使用data参数,则使用的get方式传送数据,如果使用了data参数,则是以post的方式传送数据。post的方式必须保证要爬取的网站上有相应的方法(上面代码要爬取的网址是http://httpbin.org/post,post就是要处理我们通过data参数传输数据的方法),否则会报urllib.error.HTTPError: HTTP Error 404: NOT FOUND的错误。

timeout参数的用法:

该参数是用于设置请求超时时间,免得出现网络故障或服务器异常时我们的爬虫程序长时间等:

import urllib.request as request
response = request.urlopen('http://www.bigdata17.com', timeout=1)
print(response.read())

如果将timeout设置为0.01,则会报如下的错误:

socket.timeout: timed out
During handling of the above exception, another exception

设置请求头信息:

请求的头信息一般对带有浏览器的信息,很多网站根据请求头信息来判断该请求是正常的浏览器发起的还是由爬虫发起的。设置爬虫头信息方法:

from urllib import request, parse

url = 'http://httpbin.org/post'
headers = {
 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
 'Host': 'httpbin.org'
}
dict = {
 'name': 'bigdata17'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

设置代理:

如果一个ip过于频繁的访问某一个网站时,根据反爬虫措施,会限制该IP的访问。我们可以通过urllib提供的ProxyHandler方法来设置代理:

import urllib.request
proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.bigdata17.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('https://accounts.douban.com/login?alias=&redir=https%3A%2F%2Fwww.douban.com%2F&source=index_nav&error=1001')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python的Tornado框架异步编程入门实例
Apr 24 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
Python中pillow知识点学习
Apr 30 Python
python使用matplotlib画饼状图
Sep 25 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
如何基于python测量代码运行时间
Dec 25 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
python实现调用摄像头并拍照发邮箱
Apr 27 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 #Python
python 顺时针打印矩阵的超简洁代码
Nov 14 #Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 #Python
Python实现常见的回文字符串算法
Nov 14 #Python
Python 单元测试(unittest)的使用小结
Nov 14 #Python
python for循环输入一个矩阵的实例
Nov 14 #Python
python获取中文字符串长度的方法
Nov 14 #Python
You might like
牡丹941资料
2021/03/01 无线电
我的论坛源代码(五)
2006/10/09 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
PHP实现简单ajax Loading加载功能示例
2016/12/28 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
Vue2.0如何发布项目实战
2017/07/27 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
django 修改server端口号的方法
2018/05/14 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
经典c++面试题六
2012/01/18 面试题
摄影实习自我鉴定
2013/09/20 职场文书
商务专员岗位职责
2013/11/23 职场文书
离职报告范文
2014/11/04 职场文书
开平碉楼导游词
2015/02/06 职场文书
八一建军节主持词
2015/07/01 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS