文章更新于:2020-03-19

注:本文参考官方文档进行 urllib 的讲解。

一、urllib 模块介绍

urllib 主要有以下四大模块用于处理URL。

1、urllib.request.py模块

注1:Request Objects有以下属性:full_urltypehostorigin_req_hostselectordataunverifiablemethod

注2:Request Objects有以下方法:·get_method()add_header(key,val)add_unredirected_header(key,header)has_header(header)remove_header(header)get_full_url()set_proxy(host,type)get_header(header_name,default=None)header_items()

注3:以上属性或方法,可以在定义一个Request对象后调用。

(1)urlopen函数

urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None)

注1:用于打开一个url,可以是一个网址字符串,也可以是一个Request对象。

注2:它返回的http.client.HTTPResponseurllib.response.addinfourl对象具有以下方法:

注3:geturl()方法:通常用于查看返回资源的URL,确定是否被重定向。

注4:info()方法:返回页面的元信息,比如headers。

注5:getcode()方法:返回http的响应码。

(2) Request函数

urllib.request.Request(url, data=None, headers={}, origin_req_host=None,
unverifiable=False, method=None)¶

注1:url应该是一个有效的网址字符串。

注2:data是要发送给服务器的数据对象。

注3:如果是post方法,data应该是application/x-www-form-urlencoded格式。

注4:headers应该是一个字典。

(3) ProxyHandler(proxies=None)函数

注1:用于设置代理。

注2:端口号:port可选。

2、urllib.error.py模块

此模块下有URLErrorHTTPErrorContentTooShortError(msg,content)

3、urllib.parse.py模块

这个模块是用来处理URL的,可以分解拼接URL。

通常来说,一个URL可以分为6部分,比如说:scheme://netloc/path;parameters?query#fragment

每部分都是一个字符串,有些可以为空,但这6块都是不可再分的最小单位。



6个参数的解释如下:

4、urllib.robotparser.py模块

二、模块的使用

1、获取网页内容1

>>> import urllib.request
>>> with urllib.request.urlopen('http://www.python.org/') as f:
... print(f.read(300))
...
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n
<meta http-equiv="content-type" content="text/html; charset=utf-8" />\n
<title>Python Programming '

注1:如果是输出中文,这里的f.read(300)要改为f.read(300).decode('utf-8')才可以。

注2:因为urlopen返回的是字节对象,它无法自动转换编码,所以中文的话,手动来一下即可正常显示。

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

注1:response 只能read一次(只print也算),再次read为空。

注2:如果只输出response,而不read(),那么输出的结果是这样的:

2、获取网页内容2

注:当然你还可以使用下面这种方法。

>>> import urllib.request
>>> f = urllib.request.urlopen('http://www.python.org/')
>>> print(f.read(100).decode('utf-8'))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtm

3、使用基本的 HTTP 认证

import urllib.request
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
uri='https://mahler:8092/site-updates.py',
user='klem',
passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib.request.install_opener(opener)
urllib.request.urlopen('http://www.example.com/login.html')

4、添加 headers

import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib.request.urlopen(req)

5、使用参数

>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> data = data.encode('ascii')
>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:
... print(f.read().decode('utf-8'))
...

6、使用代理

>>> import urllib.request
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.request.FancyURLopener(proxies)
>>> with opener.open("http://www.python.org") as f:
... f.read().decode('utf-8')
...

7、响应码

响应码 说明
100 (‘Continue’, ‘Request received, please continue’)
101 (‘Switching Protocols’, ‘Switching to new protocol; obey Upgrade header’)
200 (‘OK’, ‘Request fulfilled, document follows’)
201 (‘Created’, ‘Document created, URL follows’)
202 (‘Accepted’, ‘Request accepted, processing continues off-line’)
203 (‘Non-Authoritative Information’, ‘Request fulfilled from cache’)
204 (‘No Content’, ‘Request fulfilled, nothing follows’)
205 (‘Reset Content’, ‘Clear input form for further input.’)
206 (‘Partial Content’, ‘Partial content follows.’)
300 (‘Multiple Choices’, ‘Object has several resources – see URI list’)
301 (‘Moved Permanently’, ‘Object moved permanently – see URI list’)
302 (‘Found’, ‘Object moved temporarily – see URI list’)
303 (‘See Other’, ‘Object moved – see Method and URL list’)
304 (‘Not Modified’, ‘Document has not changed since given time’)
305 (‘Use Proxy’, ‘You must use proxy specified in Location to access this resource.’)
307 (‘Temporary Redirect’, ‘Object moved temporarily – see URI list’)
400 (‘Bad Request’, ‘Bad request syntax or unsupported method’)
401 (‘Unauthorized’, ‘No permission – see authorization schemes’)
402 (‘Payment Required’, ‘No payment – see charging schemes’)
403 (‘Forbidden’, ‘Request forbidden – authorization will not help’)
404 (‘Not Found’, ‘Nothing matches the given URI’)
405 (‘Method Not Allowed’, ‘Specified method is invalid for this server.’)
406 (‘Not Acceptable’, ‘URI not available in preferred format.’)
407 (‘Proxy Authentication Required’, ‘You must authenticate with this proxy before proceeding.’)
408 (‘Request Timeout’, ‘Request timed out; try again later.’)
409 (‘Conflict’, ‘Request conflict.’)
410 (‘Gone’, ‘URI no longer exists and has been permanently removed.’)
411 (‘Length Required’, ‘Client must specify Content-Length.’)
412 (‘Precondition Failed’, ‘Precondition in headers is false.’)
413 (‘Request Entity Too Large’, ‘Entity is too large.’)
414 (‘Request-URI Too Long’, ‘URI is too long.’)
415 (‘Unsupported Media Type’, ‘Entity body in unsupported format.’)
416 (‘Requested Range Not Satisfiable’, ‘Cannot satisfy request range.’)
417 (‘Expectation Failed’, ‘Expect condition could not be satisfied.’)
500 (‘Internal Server Error’, ‘Server got itself in trouble’)
501 (‘Not Implemented’, ‘Server does not support this operation’)
502 (‘Bad Gateway’, ‘Invalid responses from another server/proxy.’)
503 (‘Service Unavailable’, ‘The server cannot process the request due to a high load’)
504 (‘Gateway Timeout’, ‘The gateway server did not receive a timely response’)
505 (‘HTTP Version Not Supported’, ‘Cannot fulfill request.’)

8、处理异常

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request(someurl)
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:
# everything is fine
```
### 9、异常处理2
```python
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request(someurl)
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:
# everything is fine

三、总结

1、urllib.request.urlopen()

import urllib.request
url = "http://www.csdn.net/"
req = urllib.request.urlopen(url)
req.add_header('Referer','http://www.csdn.net')
req.add_header('User-Agent','chrome') response = urllib.request.urlopen(req)
print(response.read(2000).decode('utf-8')

2、添加表单数据

import urllib.parse
import urllib.request url = "http://httpbin.org/post"
data = bytes(urllib.parse.urlencode({'hello':'world'}),encoding='utf-8')
response = urllib.request.urlopen(url,data=data)
print(response.read().decode('utf-8'))

3、获取响应信息

import urllib.request
url = "http://httpbin.org/"
response = urllib.request.urlopen(url) response.info()
response.getcode()
response.geturl()

4、保存数据

如果是保存 HTML:

import urllib.request
url = "http://httpbin.org/"
response = urllib.request.urlopen(url)
data = response.read() with open("file.html","wb")as file:
file.write(data)

·

如果是保存图片等数据:

import urllib.request
url = "http://csdn.net/favicon.ico"
response = urllib.request.urlopen(url)
data = response.read() with open("file.png","wb")as file:
file.write(data)

另外一种方法,(注意路径要存在):

import urllib.request
url = "http://csdn.net/" urllib.request.urlretrieve(url,filename=r"d:\test\index.html")



也可以用变量接收这个语句的返回值,类型是数组,可以输出数据。

5、处理异常

>>>import urllib.request
>>> for i in range(10):
try:
file = urllib.request.urlopen("http://zhihu.com",timeout=0.2)
data = file.read()
print(len(data))
except Exception as e:
print("有异常:"+str(e))

四、Enjoy!

python 爬虫之 urllib 实践的更多相关文章

  1. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  2. Python爬虫之urllib模块1

    Python爬虫之urllib模块1 本文来自网友投稿.作者PG,一个待毕业待就业二流大学生.玄魂工作室未对该文章内容做任何改变. 因为本人一直对推理悬疑比较感兴趣,所以这次爬取的网站也是平时看一些悬 ...

  3. python爬虫之urllib库(三)

    python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...

  4. python爬虫之urllib库(二)

    python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...

  5. python爬虫之urllib库(一)

    python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...

  6. Python爬虫之urllib.parse详解

    Python爬虫之urllib.parse 转载地址 Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数. 解析url 解析url( urlparse() ) ur ...

  7. Python爬虫之Urllib库的基本使用

    # get请求 import urllib.request response = urllib.request.urlopen("http://www.baidu.com") pr ...

  8. python爬虫之urllib库

    请求库 urllib urllib主要分为几个部分 urllib.request 发送请求urllib.error 处理请求过程中出现的异常urllib.parse 处理urlurllib.robot ...

  9. Python爬虫系列-Urllib库详解

    Urllib库详解 Python内置的Http请求库: * urllib.request 请求模块 * urllib.error 异常处理模块 * urllib.parse url解析模块 * url ...

随机推荐

  1. windows 安装 jenkins 自动化构建部署至linux服务器上

    一.环境准备 1.git安装环境 参考链接 https://www.cnblogs.com/yuarvin/p/12500038.html 2.maven安装环境,包括jdk环境安装 参考链接 htt ...

  2. selenium 爬boss

    # 有问题 from selenium import webdriver import time from lxml import etree class LagouSpider(object): d ...

  3. JVM笔记-垃圾收集算法与垃圾收集器

    1. 一些概念 1.1 垃圾&垃圾收集 垃圾:在 JVM 语境下,"垃圾"指的是死亡的对象所占据的堆空间. 垃圾收集:所谓"垃圾收集",就是将已分配出去 ...

  4. 032.核心组件-kube-proxy

    一 kube-proxy原理 1.1 kube-proxy概述 Kubernetes为了支持集群的水平扩展.高可用性,抽象出了Service的概念.Service是对一组Pod的抽象,它会根据访问策略 ...

  5. Spring注解 - 生命周期、属性赋值、自动装配

    一.Bean的生命周期 流程 Bean创建 -- 初始化 -- 销毁 创建: 单实例:在容器启动时创建对象 多实例:每次调用时创建对象 初始化: 都是在对象创建完成后,调用初始化方法 销毁: 单实例: ...

  6. 测试必知必会系列- Linux常用命令 - cp

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 复制文 ...

  7. (转)协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)

    协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 网络层(net ...

  8. 曹工说Spring Boot源码(25)-- Spring注解扫描的瑞士军刀,ASM + Java Instrumentation,顺便提提Jar包破解

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  9. 关于MySQL 建表的一些建议

    由于在生产环境下,我们对MySQL数据库的操作通常是通过命令行进行操作,因此,建议建表的时候也手写MySQL语句(不建议用图形界面建表). 1.添加注释的格式 在编写MySQL语句时,我们通常会被要求 ...

  10. javaAPI操作ES分组聚合

    连接es的客户端使用的 TransportClient SearchRequestBuilder requestBuilder = transportClient.prepareSearch(indi ...