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线程详解
Jun 24 Python
Python字典简介以及用法详解
Nov 15 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
Tensorflow之Saver的用法详解
Apr 23 Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
python中对二维列表中一维列表的调用方法
Jun 07 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
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
php抽象类用法实例分析
2015/07/07 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
checkbox 复选框不能为空
2009/07/11 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
JavaScript callback回调函数用法实例分析
2018/05/08 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python3基础之基本数据类型概述
2014/08/13 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
python中的逆序遍历实例
2019/12/25 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
如何使用python代码操作git代码
2020/02/29 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
师生聚会感言
2014/01/26 职场文书
2015年材料员工作总结
2015/04/30 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL