人生苦短,我用 Python

前文传送门:

小白学 Python 爬虫(1):开篇

小白学 Python 爬虫(2):前置准备(一)基本类库的安装

小白学 Python 爬虫(3):前置准备(二)Linux基础入门

小白学 Python 爬虫(4):前置准备(三)Docker基础入门

小白学 Python 爬虫(5):前置准备(四)数据库基础

小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

小白学 Python 爬虫(7):HTTP 基础

小白学 Python 爬虫(8):网页基础

小白学 Python 爬虫(9):爬虫基础

小白学 Python 爬虫(10):Session 和 Cookies

引言

看到本篇实战的同学有没有很激动,经过了前面十篇基础内容的折磨,终于等到实战章节了,有没有一种激动之情。

想到一句歌词:终于等到你~~~

首先,官方文档地址敬上:

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

在前面的前置准备中,我们一起安装了很多第三方的请求类库,在介绍这些第三方的类库前,我们先介绍一下 Python3 本身自带的一个 HTTP 请求库 urllib 。

urllib

urllib 是一个软件包,它包含了几个用于处理 URL 的模块:

  • request: 基础的 HTTP 请求模块。
  • error: 异常处理模块。
  • parse: 用于解析 URL 的模块。
  • robotparser: 识别网站中 robots.txt 文件。

urllib.request

如果要说怎么学习最快,当然是查看官方文档,首先祭出官方文档的地址。

urllib.request官方文档: https://docs.python.org/3/library/urllib.request.html#module-urllib.request

这里的解释是最权威了,并且目前已经提供了中文版本,不过那个翻译看起来像是机器翻译的,质量并不高。

如果实在看不懂,就只能看小编 XBB 了。

urlopen

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,使用它可以模拟浏览器的一个请求发起过程,同时它还带有处理授权验证(authenticaton)、重定向(redirection)、浏览器Cookies以及其他内容。

语法:

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

这么厉害的模块当然是要赶紧尝试一下,首先我们使用它爬取一下小编的博客站:

import urllib.request

response = urllib.request.urlopen('https://www.geekdigging.com/')
print(response.read().decode('utf-8'))

运行结果小编这里就不展示,比较长。

短短的三行代码,我们就完成了网站源代码的抓取,是不是很简单。

当我们得到源代码之后,想要的链接、文本信息,都可以从中提取出来。

各位同学看到打印的内容,可以猜测一下这个内容是什么数据类型,会是字符串类型么?

使用 type() 看一下就知道了。

print(type(response))

结果:

<class 'http.client.HTTPResponse'>

urlopen 返回了一个 HTTPResponse 类型的对象。

官方文档对 HTTPResponse 的解释如下:

An HTTPResponse instance wraps the HTTP response from the server. It provides access to the request headers and the entity body. The response is an iterable object and can be used in a with statement.

大意是说 HTTPResponse 是对 HTTP 响应的包装。它提供了对请求头和请求体的访问。这个响应是一个可以迭代的对象。

HTTPResponse 主要包含 read() 、 readline() 、 getheader(name) 、 getheaders() 、 fileno() 等方法,以及 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。

import urllib.request

# 获取HTTP协议版本号(10 for HTTP/1.0, 11 for HTTP/1.1)
print(response.version) # 获取响应码
print(response.status)
print(response.getcode()) # 获取响应描述字符串
print(response.reason) # 获取实际请求的页面url(防止重定向用)
print(response.geturl()) # 获取特定响应头信息
print(response.getheader(name="Content-Type"))
# 获取响应头信息,返回二元元组列表
print(response.getheaders())
# 获取响应头信息,返回字符串
print(response.info()) # 读取响应体
print(response.readline().decode('utf-8'))

结果有点长,小编就不贴了,各位同学可以自己运行一下。

data

data 用来指明发往服务器请求中的额外的参数信息, data 默认是 None ,此时以 GET 方式发送请求;当用户给出 data 参数的时候,改为 POST 方式发送请求。

来个示例吧,这里我们使用 httpbin 提供的测试接口,此项目为 postmanlabs 提供在 Github开源的项目, Github 地址为:https://github.com/postmanlabs/httpbin

import urllib.request
import urllib.parse post_data = bytes(urllib.parse.urlencode({'name': 'geekdigging', 'hello':'world'}), encoding='utf8')
response = urllib.request.urlopen('https://httpbin.org/post', data = post_data)
print(response.read().decode('utf-8'))

值得注意的是,这里我们传递了两个参数,是以 dict 的方式传递的,它一定需要被转码成 bytes 字节流, 这里使用了 bytes() 方法,第一个参数是我们需要转换的字符串,第二个参数是编码方式。

这里我们请求的路径是 https://httpbin.org/post ,这个链接可以用来测试 POST 请求,它可以返回一些我们刚才请求的信息。

响应结果如下:

{
"args": {},
"data": "",
"files": {},
"form": {
"hello": "world",
"name": "geekdigging"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "28",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.7"
},
"json": null,
"origin": "218.79.141.143, 218.79.141.143",
"url": "https://httpbin.org/post"
}

从返回的响应信息中,我们可以看到请求头的相关信息,如我们请求的数据类型 Content-Typeapplication/x-www-form-urlencoded ,这个代表了我们提交数据的方式是表单提交,还可以看到请求的来源 origin 是小编当前电脑的 ip 地址,可以看到我们提交的数据 form 等等的相关信息。

timeout

timeout 用于设置超时时间,单位为秒。

如果请求超出了设置的时间,还未响应,就会抛出异常。

我们看个小示例:

import urllib.request
import urllib.parse response = urllib.request.urlopen('http://httpbin.org/get', timeout = 1)
print(response.read().decode('utf-8'))

我们先将超时时间设置成为 1s ,看下响应结果:

{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.7"
},
"origin": "218.79.141.143, 218.79.141.143",
"url": "https://httpbin.org/get"
}

可以看到是正常响应的,我们将超时时间设置为 0.1s ,再看下结果:

import urllib.request
import urllib.parse response = urllib.request.urlopen('http://httpbin.org/get', timeout = 0.1)
print(response.read().decode('utf-8'))

已经可以看到抛异常出来了:

Traceback (most recent call last):
...
socket.timeout: timed out During handling of the above exception, another exception occurred: Traceback (most recent call last):
...
urllib.error.URLError: <urlopen error timed out> Process finished with exit code 1

内容有些多,小编省略了大量的内容。

我们可以看到,这里确实抛出了超时的异常,还有同学记得我们前面讲过的异常处理么,这时我们可以添加一个异常处理,将这个超时的异常捕获。

import urllib.request
import urllib.error
import socket try:
response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
print(response.read().decode('utf-8'))
except urllib.error.URLError as e:
if isinstance(e.reason, socket.timeout):
print('请求超时啦~~~')
else:
print(e)

结果如下:

请求超时啦~~~

证明我们已经成功捕获到了请求超时的异常。

还有其他的几个参数: cafilecapathcadefault 用于实现可信任的 CA 证书的 HTTP 请求,一般很少使用, context ,用来实现 SSL 加密传输,一般也很少使用。

好了,本篇的内容就到这里结束,希望各位同学可以自己动手敲一下上面的示例代码。

示例代码

本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。

示例代码-Github

示例代码-Gitee

小白学 Python 爬虫(11):urllib 基础使用(一)的更多相关文章

  1. 小白学 Python 爬虫(12):urllib 基础使用(二)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. 小白学 Python 爬虫(13):urllib 基础使用(三)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. 小白学 Python 爬虫(14):urllib 基础使用(四)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. 小白学 Python 爬虫(15):urllib 基础使用(五)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. 小白学 Python 爬虫(17):Requests 基础使用

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  7. 小白学 Python 爬虫(30):代理基础

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. 小白学 Python 爬虫(33):爬虫框架 Scrapy 入门基础(一)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. Linux sh脚本用spool导出oracle数据库指定表表数据

    脚本如下,已验证可用,可配合crontab使用. 1 #!/bin/bash cd /opt/oracle/datafor_kf #redirect environment variables sou ...

  2. Jdk14都要出了,还不能使用 Optional优雅的处理空指针?

    1. 前言 如果你没有处理过空指针,那么你不是一位真正的 Java 程序员. 空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 NullPo ...

  3. [ZJOI2006]碗的叠放

    Description 小H有n个碗需要放进橱柜,她希望将他们叠起来放置.你知道每个碗都是规则的圆柱体,并且都是上宽下窄,你已经测量出了每个碗的两个半径及高,请你帮小H找出一种叠放顺序,使得叠放出来的 ...

  4. [考试反思]1027csp-s模拟测试90:自我

    其实这套题很好. 但是这次,在T1爆炸的同时,T2和T3并没有出现能弥补的表现. 在AK仍然存在的同时,我居然连一个AC都没有. 所以最后就是一无是处的一场. 考试结束前估分:100+100+30=2 ...

  5. ISCONF Redis is configured to save RDB snapshots

    MISCONF Redis is configured to save RDB snapshots redis报错: (error) MISCONF Redis is configured to sa ...

  6. NOIP模拟26

    把题解沽了好久了,今天还是不想写,我们靠的B卷其实挺水的,但是我就是想吐槽一下!咋还带题目里面放题解的?题里一点题解的线索都没有,但是玄机竟然在题目里! 我也是醉了,T1就是一个贪心,题目说贪婪,T2 ...

  7. day1-python条件语句和基本数据类型

    一.if 条件语句 1. if 条件语句 if 条件: 代码块 else: 代码块 2. if 支持嵌套 if 1 == 1: if 2 == 2: print("欢迎进入blog1&quo ...

  8. PHP 面试官问:你说说Redis的几个过期策略?

    在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期.当设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的. 设置过期时间 expire ke ...

  9. 本地Git连接GitLab(服务器)远程仓库

    1.简介 远程仓库是指托管在网络上的项目仓库,现在互联网上有很多项目托管平台,比如github.gitlab等.为了不公开自己项目代码,可以在自己的服务器上搭建自己的项目仓库,最常见的是搭建GitLa ...

  10. 破解微擎安装,免费搭建微擎,免费破解微擎,微擎破解版本,最新版本V2.1.2,一键安装!!

    ​ 微擎是一款基于WEB2.0(PHP+Mysql)技术架构,免费开源的公众平台管理系统,一款致力于将小程序和公众号商业化.智慧化.场景化的自助引擎.微擎提供公众号.微信小程序.支付宝小程序.百度熊掌 ...